Избегайте ссылок на неиспользуемые символы при ссылках на статические библиотеки - PullRequest
3 голосов
/ 08 апреля 2011

Я использую apple gcc , чтобы скомпилировать dylib, который я собираюсь распространять. По разным причинам я использую некоторые библиотеки, скажем, libz, чтобы сделать его простым.

Поскольку эта библиотека обычно отсутствует в системе Mac, я хочу, чтобы статическая ссылка в использовала символы в dylib, передавая путь к .a-file для упрощения развертывания.

Теперь компоновщик связывает все символы из библиотеки в результирующий dylib, хотя я ссылаюсь только на подмножество. В Linux я никогда не сталкивался с этой проблемой, компоновщик с радостью отбрасывает все символы, на которые нет ссылок, и создает очень тонкий исполняемый файл, поэтому он должен быть возможным . Файл dylib, который у меня сейчас есть, примерно в 10 раз больше, чем должен.

Я пытался поиграться с флагом -dead_code, но безрезультатно. Возможно, я просто не понимаю этого?

Кто-нибудь знает решение этой проблемы?

1 Ответ

5 голосов
/ 08 апреля 2011

Попробуйте -Wl,--gc-sections.

Что касается -dead_strip (что вы, вероятно, подразумевали под -dead_code):

Перед включением -dead_strip вариант вашего проекта сначала должен быть "портированным" для работы с мертвым кодом зачистки. Это будет включать в себя изменение от -gused (по умолчанию для -g) до -полный и перекомпилировать все файлы объектов, связанных с вашим программа с новым компилятором из Mac OS X Июнь 2004 года выпуска. Также если ваше здание исполняемый файл, который загружает плагины, которые используют символы из исполняемый файл, вы должны убедиться, символы, которые используют плагины, не являются раздели (используя атрибут ((используется)) или параметр -exported_symbols_list). Если вы используете список экспорта и здание общая библиотека или исполняемый файл который будет использоваться с ld (1) -bundle_loader флаг, вам нужно включить символы для исключения информация о кадре в списке экспорта для ваших экспортированных символов C ++. Эти символы заканчиваются на .eh и их можно увидеть с помощью инструмента nm (1).

и

Чтобы включить удаление мертвого кода из командной строки, передайте -dead_strip вариант для ld. Вы также должны передать Опция -gfull для GCC для генерации полного набора символов отладки для ваш код. Линкер использует этот дополнительный отладка информации до мертвой полосы исполняемый файл.

Надеюсь, это поможет.

Все содержание в этом ответе было найдено в первых результатах поиска Google для "неиспользуемые символы статической ссылки apple ld". :)

...