开发者

ld64 -s strip output flag - "ignored" but not really? OS X

开发者 https://www.devze.com 2022-12-10 07:02 出处:网络
I was bored and playing around with various options to gcc to see what size binaries I could produce.

I was bored and playing around with various options to gcc to see what size binaries I could produce.

I found a -s flag in ld64 that is supposedly supposed to not include symbol table information in an executable. The manpage for ld64 says the flag is 开发者_运维问答ignored.

The manpage for gcc says it's a linker option(which to me implies it means it will just enable the -s flag on ld64 when it's invoked) and mentions nothing about being ignored.

It's not seeming to be ignored, though...

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

If the flag is obsolete and being ignored -- why do the size of the binaries differ?


Not having access to the ld sourcecode right now, I can't answer about the warning.

I can tell you why the binaries have different size -- use nm.

Here's without the '-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

With the '-s' I see that the dyld_stub_binding_helper section is missing.

Google says dyld_stub_binding_helper is a glue function that assists the dynamic linker in lazily binding an external function.


See the source:

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

The bug appears to be in the error message and man page, as a binary built with -s still works. (Nearly all the other uses of warnObsolete appear to match the error message.) Probably worth a trip to bugreport.apple.com and a post to one of the Darwin lists, depending on your curiosity.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号