Флаг вывода полосы ld64 -s - "игнорируется", но не совсем? OS X - PullRequest
0 голосов
/ 30 октября 2009

Мне было скучно, и я пытался поэкспериментировать с различными вариантами gcc, чтобы посмотреть, какие двоичные файлы я могу создать.

Я нашел флаг -s в ld64, который предположительно не включает информацию таблицы символов в исполняемый файл. Страница man для ld64 говорит, что флаг игнорируется.

Страница руководства для gcc говорит, что это опция компоновщика (что для меня подразумевает, что это означает, что он просто включит флаг -s на ld64, когда он вызывается) и ничего не упоминает о игнорировании.

Кажется, это не игнорируется ...

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 ]

3 голосов
/ 30 октября 2009

Сейчас у меня нет доступа к исходному коду 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 отсутствует.

Google говорит: dyld_stub_binding_helper - это функция склеивания, которая помогает динамическому компоновщику лениво связывать внешнюю функцию.

2 голосов
/ 30 октября 2009

См. источник :

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

Ошибка, по-видимому, связана с сообщением об ошибке и справочной страницей, поскольку бинарный файл, созданный с помощью -s, все еще работает. (Похоже, что почти все другие варианты использования warnObsolete соответствуют сообщению об ошибке.) Вероятно, стоит посетить сайт bugreport.apple.com и опубликовать сообщение в одном из списков Дарвина в зависимости от вашего любопытства.

...