为什么 macOS 上的动态链接库似乎禁用了 ASLR?

Why does ASLR appear to be disabled for dynamically-linked libraries on macOS?

如果我没记错的话,下面的代码应该在每次 运行 时打印出 不同的 个地址。但是,它始终显示 isupper 的相同地址(例如)。

代码:

#include <stdio.h>
#include <dlfcn.h>

int main(int argc, char *argv[]) {
   printf("isspace @ %p\n", dlsym(RTLD_DEFAULT, "isspace"));
   return 0;
}

输出:

$ ./libc-simple 
isspace @ 0x7fff76b63035
$ ./libc-simple 
isspace @ 0x7fff76b63035
$ ./libc-simple 
isspace @ 0x7fff76b63035
$ ./libc-simple 
isspace @ 0x7fff76b63035

(我 运行ning macOS 10.14.6,但我在另一台计算机 运行ning macOS 10.15 上测试了相同的代码,结果相同。)

我错过了什么?

作为一项优化,macOS 为许多系统库使用共享映射。它们在启动时加载一次并被所有进程使用。对于给定的引导,地址在所有此类进程中都是恒定的。但是,为了安全起见,地址在每次启动时都是随机的。