我注意到,如果我在 macOS 10.15.7 上使用
gcc
或 clang
命令编译 C 程序,无论程序多么简单,可执行文件都将约为 50 KB。在旧版本中,同一程序生成的可执行文件只有 8 KB。我还注意到大部分额外大小只是 0 字节的大连续区域。
关于 0 字节是什么以及如何减少它们的答案解释如下:为什么我的 hello world 二进制大部分为零?
较新的版本在可执行文件中有更多需要对齐的段,并且它们的默认对齐方式更大。这两者都会导致可执行文件中产生更多的填充空间。我可以使用
-mmacosx-version-min=10.14
和 -Wl,-segalign,0x1000
强制编译器使用较小的对齐方式并删除 __DATA_CONST
部分,从而将可执行文件大小最多减少约 40 KB。
我的问题是,如果使用
-mmacosx-version-min=10.14
和 -Wl,-segalign,0x1000
都可以将可执行文件减少到简单程序大小的一小部分,并且可以允许可执行文件也可以在旧版本的 macOS 上运行,那么使用它们是否会有任何不可预见的惩罚?如果不是,为什么这些设置不是是默认设置?
例如:
__DATA_CONST
段和较小段对齐的较小可执行文件是否会以某种方式产生(显着)更长的启动开销?出于什么原因(如果有),我可能不想不加区别地/自动使用
-mmacosx-version-min=10.14
和/或 -Wl,-segalign,0x1000
来优化我的可执行文件的 all 的大小?
改编自评论:
0x1000 的段大小在 x86_64 上不会产生影响,但它在 arm64 上不可用。内核将拒绝加载您的二进制文件。
是一个安全问题,但可以说它对arm64e ABI(苹果尚未为第3方稳定)的影响比对没有指针身份验证的arm64影响更大。__DATA_CONST