2017.9.22 更新

libsystem_kernel.a 和 libc.a 可以在 https://github.com/libsystem-ethan/esdarwin 中找到。

然后还是感觉缺了什么…

根据苹果的一个 QA[1], Mac OS X 不支持静态链接。

ld

但是天无绝人之路,这个 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 里面一应俱全.


  1. 1.https://developer.apple.com/library/content/qa/qa1118/_index.html
  2. 2.https://github.com/PureDarwin/Building-XNU-16.7-Kernel-Guide

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.