【问题标题】:ld64 -s strip output flag - "ignored" but not really? OS Xld64 -s strip output flag - “忽略”但不是真的?操作系统
【发布时间】:2009-10-29 22:25:22
【问题描述】:

我很无聊,正在玩各种 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

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

【问题讨论】:

    标签: macos compiler-construction linker


    【解决方案1】:

    目前无法访问 ld 源代码,我无法回答警告。

    可以告诉你为什么二进制文件有不同的大小——使用nm

    这里没有'-s':

    0000000100001040 D_NXArgc 0000000100001048 D_NXArgv U ___keymgr_dwarf2_register_sections 0000000100001058 D ___程序名称 U __cthread_init_routine 0000000100000e68 t __dyld_func_lookup 0000000100000000 A __mh_execute_header 0000000100000d6a t __start U_atexit 0000000100001050 D_环境 u_errno U_exit U _mach_init_routine 0000000100000e6e T _main 0000000100000e54 t dyld_stub_binding_helper 0000000100000d48 T 开始

    使用 '-s' 我看到 dyld_stub_binding_helper 部分丢失了。

    Google 称dyld_stub_binding_helper 是一个胶水函数,可帮助动态链接器延迟绑定外部函数。

    【讨论】:

    • 有趣!奇怪的是,它说它被忽略了,而它显然不是。我想知道是否应该提交错误报告?
    【解决方案2】:

    the source:

       else if ( strcmp(arg, "-s") == 0 ) {
        warnObsolete(arg);
        fLocalSymbolHandling = kLocalSymbolsNone;
        fReaderOptions.fDebugInfoStripping = ObjectFile::ReaderOptions::kDebugInfoNone;
       }
    

    错误似乎在错误消息和手册页中,因为使用 -s 构建的二进制文件仍然有效。 (warnObsolete 的几乎所有其他用途似乎都与错误消息相匹配。)可能值得一游 bugreport.apple.com 并发布到 Darwin 列表之一,这取决于您的好奇心。

    【讨论】:

      猜你喜欢
      • 2013-11-20
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 2014-10-18
      相关资源
      最近更新 更多