Неопределенные символы компоновщика в gcc - PullRequest
0 голосов
/ 16 марта 2011

У нас есть программа, которая работает на встроенном oOS.Мы обычно встраиваем строку версии в выходной двоичный файл, который может идентифицировать все версии, содержащиеся при генерации двоичного файла.Обычно используемые нами компиляторы могут убедиться, что строка версии находится в двоичном виде, создав символ «неопределенный», который затем разрешается нашей строкой версии.

Однако теперь мы перешли на систему на основе Linux.и gcc.

gcc удаляет строку версии из окончательного exe.Финальный exe создается путем связывания в кучу библиотек.В каждую библиотеку встроена строка версии.

gcc удаляет строку версии, потому что ничего не ссылается на строку, и мы включили оптимизацию -Os.

Есть ли способ убедиться, что gccне удаляет коллекцию строк (нам нужно встраивать около 5-10 строк версии)?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

Хорошо, чтобы решить эту проблему, мы сделали это в файле ac:

const char _string_[] = "some string";

Затем включите объектный файл в окончательную ссылку:

gcc <snip> -Wl,--start-group string.o <snip> -Wl,--end-group -Wl,--strip-all -o final.exe
1 голос
/ 16 марта 2011

Попробуйте поработать с --retain-symbols-file (опция для компоновщика)

Из ld mangpage :

- сохранить имя файла символов Сохраните только символы, указанные в имени файла, отбрасывая все остальные. filename - это простой плоский файл с одним именем символа в строке. Этот параметр особенно полезен в средах (таких как VxWorks), где большая глобальная таблица символов накапливается постепенно для сохранения оперативной памяти.

- файл retain-symbols-file не удаляет неопределенные символы или символы, необходимые для перемещения.

Вы можете указать --retain-symbols-file только один раз в командной строке. Он переопределяет -s и -S.

РЕДАКТИРОВАТЬ Я только что заметил последнюю строку документов, указанных выше. Он переопределит параметр «раздеть все», поэтому я не уверен, что это поможет вам ...

...