使用 -mmacosx-version-min 和 -segalign 标志来减少可执行文件中的填充空间是否有任何负面影响?

问题描述 投票:0回答:1

我注意到,如果我在 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 的大小?

c macos assembly
1个回答
0
投票

改编自评论

0x1000 的段大小在 x86_64 上不会产生影响,但它在 arm64 上不可用。内核将拒绝加载您的二进制文件。

__DATA_CONST
是一个安全问题,但可以说它对arm64e ABI(苹果尚未为第3方稳定)的影响比对没有指针身份验证的arm64影响更大。

© www.soinside.com 2019 - 2024. All rights reserved.