我很无聊并且玩各种各样的gcc选项,看看我能制作多大的二进制文件。
我在ld64中发现了一个-s
标志,据说不应该在可执行文件中包含符号表信息。 ld64的联机帮助页说明该标志被忽略。
gcc的联机帮助页说它是一个链接器选项(对我来说意味着它意味着它只会在调用它时在ld64上启用-s
标志)并且没有提到任何被忽略的内容。
虽然......似乎没有被忽视......
me@dinosaurhunter ~/bin/c> cat small.c
int main(void) { return 1; }
me@dinosaurhunter ~/bin/c> gcc -Wall small.c -o small
me@dinosaurhunter ~/bin/c> wc -c small
12564 small
me@dinosaurhunter ~/bin/c> gcc -Wall -s small.c -o small
ld64: warning: option -s is obsolete and being ignored
me@dinosaurhunter ~/bin/c> wc -c small
12468 small
如果该标志已过时且被忽略 - 为什么二进制文件的大小不同?
答案 0 :(得分:3)
目前无法访问ld源代码,我无法回答有关警告的问题。
我可以告诉您二进制文件大小不同的原因 - 使用nm
。
这里没有'-s':
0000000100001040 D _NXArgc 0000000100001048 D _NXArgv U ___keymgr_dwarf2_register_sections 0000000100001058 D ___progname U __cthread_init_routine 0000000100000e68 t __dyld_func_lookup 0000000100000000 A __mh_execute_header 0000000100000d6a t __start U _atexit 0000000100001050 D _environ U _errno U _exit U _mach_init_routine 0000000100000e6e T _main 0000000100000e54 t dyld_stub_binding_helper 0000000100000d48 T start
使用'-s',我看到dyld_stub_binding_helper部分丢失了。
谷歌称dyld_stub_binding_helper
是一个粘合函数,可以帮助动态链接器懒惰地绑定外部函数。
答案 1 :(得分:2)
请参阅the source:
else if ( strcmp(arg, "-s") == 0 ) {
warnObsolete(arg);
fLocalSymbolHandling = kLocalSymbolsNone;
fReaderOptions.fDebugInfoStripping = ObjectFile::ReaderOptions::kDebugInfoNone;
}
该错误似乎出现在错误消息和手册页中,因为使用-s
构建的二进制文件仍然有效。 (warnObsolete
的几乎所有其他用途似乎都与错误信息相符。)可能值得去bugreport.apple.com旅行,并根据你的好奇心发布到Darwin列表之一。