ld64 -s strip output flag - “忽略”但不是真的吗? OS X.

时间:2009-10-29 22:25:22

标签: macos compiler-construction linker

我很无聊并且玩各种各样的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

如果该标志已过时且被忽略 - 为什么二进制文件的大小不同?

2 个答案:

答案 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列表之一。