macOS 静态编译
2017.9.22 更新
libsystem_kernel.a 和 libc.a 可以在 https://github.com/libsystem-ethan/esdarwin 中找到。
然后还是感觉缺了什么…
根据苹果的一个 QA[1], Mac OS X 不支持静态链接。
但是天无绝人之路,这个 QA 之中也留了一条退路。
If your project absolutely must create a statically linked binary, you can get the Csu (C startup) module from Darwin and try building crt0.o for yourself.
那么 Csu 是什么?直接去 https://opensource.apple.com 找,点进系统版本号就找到啦。
地址是 https://opensource.apple.com/tarballs/Csu/Csu-85.tar.gz
然后把它拖下来,很小。根据 Skaht 的研究,你需要 MacOSX.sdk 才可以编译(装个 Xcode 的事情),同时需要指定头文件的位置。
make ARCH_CFLAGS=-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include |
然后就生成了 crt0.o
crt.1.v*.o
dylib1.v*.o
gcrt1.o
lazydylib1.o
我们可以不 make install, 直接暴力把他们塞到 /usr/local/lib
install *.o -c /usr/local/lib |
然后这个时候 ld 的错误消息就是无法找到 _exit
等 C 函数了,证明我们还缺少一些东西。
那自然是缺少 libc 了,去编译一个静态 libc 即可。
macOS 10.12 对应的 libc 居然砍掉了 pthreads 的源码,于是就编译不了了。这里我选择回滚到 libc-825.40.1.
为了编译 libc,还需要补全 libc 的依赖。
需要 libplatform libdispatch libmalloc AvailabilityVersions libinfo [2]
要做的就是把缺的 header 补回去就可以了,缺什么补什么。我们需要构建的是 libc static/libc.a。
构建完成之后继续测试. 接下来 ld 抛出的错误就是 vm_map vm_protect 等 syscall。
然后就进入了构建 XNU 内核的时候,这里跳到 XNU 内核的教程就好了, libsyscall 是 XNU 的一部分(?
然后羽毛就卡在这里了…
其实最简单的办法是等 PureDarwin 的 SDK 释出就好了…那个 SDK 里面一应俱全.
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.