Надлежащая видимость GCC для общего объекта, написанного на C

#gcc #strip #objdump

#gcc #Стриптиз #objdump

Вопрос:

У меня есть огромный проект, написанный на C . Все это разделено на несколько статических библиотек, которые в конечном итоге связаны в одну конечную разделяемую библиотеку, которая должна экспортировать только несколько простых функций.

Если я сделаю objdump этого финала.итак, я вижу все свои внутренние имена и т.д. Поскольку он использует длинные имена классов и пространства имен, эти строки становятся чрезмерно длинными, и в результате конечный двоичный файл получается большим.

Итак, мой вопрос в том, как мне сделать это правильно с помощью GCC, чтобы убедиться, что все эти внутренние функции не отображаются в конечном двоичном файле?

Я знаю обо всех этих модификаторах видимости, специфичных для GCC, я использую -fvisibility=hidden -fvisibility-inlines-hidden , я использую -Wl,—no-whole-archive . Я отключаю исключения c и rtti (-fno-exceptions -fno-rtti), но я все еще не могу заставить GCC сгенерировать мой финал. так что это не содержит имен моих пространств имен и классов, которых там вообще не должно быть!

Я пытался использовать -Wl,—version-script= для управления тем, какие функции должны быть видны, но все же я вижу множество внутренних имен в конечном удаленном общем объекте. Я прочитал несколько похожих записей в SO, но не вижу ничего, что выполняло бы эту работу. Примечание: я компилирую для нескольких платформ (Linux, Windows, iPhone и т. Д.), И только в Windows в VS у меня нет никаких проблем.

Спасибо

Ответ №1:

Возможно, вы захотите попробовать опцию --retain-symbols-file компоновщика при связывании окончательного файла .so ( -Wl,--retain-symbols-file=filename ), чтобы указать ТОЛЬКО символы, которые вы хотите сохранить (экспортировать), и удалить все остальное. Файл представляет собой просто текстовый файл с символами (по одному на строку) для сохранения.

Комментарии:

1. Я попробую эту опцию сейчас, чтобы посмотреть, будет ли выполняться двоичный файл. Из простого теста я вижу, что имена импортированных функций из других общих библиотек больше не находятся в двоичном файле. Нужно ли мне также перечислять импортированные имена?

2. Крис, кажется, это тот вариант, который мне нужен. Финал. таким образом, стало меньше на пару мегабайт, и в списке nm указаны только символы, которые я поместил в файл экспорта. Первая проблема: я использую много статических библиотек, и некоторые из экспортируемых файлов должны поступать из этих статических библиотек, и по какой-то причине эти символы из статических библиотек не экспортируются. Чтобы исправить это, мне пришлось использовать опцию полного архива, чтобы принудительно экспортировать все функции из этих библиотек.

3. Вторая проблема заключается в том, что даже nm теперь перечисляет только функции из файла экспорта, если я использую objdump, я все равно получаю личные имена из своего кода на c . Например: _zn20rcsftserviceimplpeer12onftprogresserkn3rcs12filetransfereyи моя цель — сделать все, чтобы эти строки не были в конечном двоичном файле.