Удалите символы отладки C ++ - STL / Boost (... или не создавайте их) - PullRequest
5 голосов
/ 16 сентября 2008

Linux / Gcc / LD - Набор инструментов.

Я хотел бы удалить символы отладки STL / Boost из библиотек и исполняемых файлов по двум причинам:

  1. Связывание становится очень медленным для больших программ
  2. Отладка переходит в код stl / boost, что раздражает

Для 1. инкрементное связывание будет большим улучшением, но AFAIK ld не поддерживает инкрементное связывание. В журнале dr.dobb 1999 года есть обходной путь «псевдоинкрементное связывание» (больше не в Интернете, а по адресу archive.org (идея состоит в том, чтобы поместить все в динамическую библиотеку и все обновленные объекты файлы во втором, который загружается первым), но на самом деле это не общее решение.

Для 2. здесь есть скрипт здесь , но а) он у меня не сработал (не убрал символы), б) он очень медленный, так как работает в конце канала , тогда как было бы более эффективно удалить символы раньше.

Очевидно, что остальные символы отладки должны остаться на месте.

Ответы [ 6 ]

3 голосов
/ 17 сентября 2008

GNU strip принимает аргументы регулярного выражения для --strip-symbols = Символы STL и Boost помечены именами из-за пространств имен, в которых они находятся. В данный момент я не использую binutils GCC, а просто взгляну на искажение имен, используемое для пространств имен, и создаю регулярное выражение для символов из пространства имен X 'и передать это --strip-symbols =

2 голосов
/ 16 сентября 2008

Насколько я знаю, в gcc нет реальной возможности делать то, что вы хотите. Основная проблема заключается в том, что весь код, для которого вы хотите удалить символы отладки, определен в заголовках.

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

Но, насколько я знаю, в gcc невозможно получить только символы отладки из определенных частей модуля компиляции, а сборка и компоновка (для желаемого ускорения времени ссылки) невозможны.

1 голос
/ 08 марта 2017

Этот ответ содержит некоторые особенности, которые мне понадобились, чтобы ответ MSalters работал для удаления символов STL.

Имена символов STL искажены. Хитрость заключается в том, чтобы найти регулярное выражение, которое охватывает эти имена. Я посмотрел эти символы с помощью GNU Binutils:

> nm --debug-syms <objectfile>

Я в основном искал функции STL, например resize. Если это сложно, вывод становится читаемым при использовании следующей команды:

> nm --debug-syms --demangle <objectfile>

Найдите номер строки, содержащий вызов функции STL, затем найдите его искаженное имя на том же номере строки, используя первую предоставленную команду. Это позволило мне увидеть, что все имена символов STL начинаются с _ZNSt [0-9] + или _ZSt [0-9] + и т. Д.

Чтобы разрешить GNU Strip удалять эти символы, я использовал:

> strip --wildcard              \
    --strip-symbol='_ZNKSt*'    \
    --strip-symbol='_ZNSt*'     \
    --strip-symbol='_ZSt*'      \
    --strip-symbol='_ZNSa*'     \
    <objectfile>

Я использовал эти команды непосредственно в скомпилированном / связанном двоичном файле. Я проверил удаление этих символов, сравнив выходные данные nm до и после удаления (я записал выходные данные в файлы и использовал vimdiff). Опция --wildcard позволяет использовать регулярные выражения. Хотя я ожидаю, что [0-9] * будет означать 0 для бесконечного количества чисел, здесь это фактически означает 1 число, за которым следует бесконечное количество чего-либо (до конца строки).

Если вы хотите, чтобы не входил в код STL , это можно сделать с помощью команды skip file в gdb, как это делается здесь .

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

1 голос
/ 16 сентября 2008

Вы можете использовать полосу. strip --strip-ненужный --strip-debug libfoo.so

Почему бы вам просто не собрать без предварительной отладки?

1 голос
/ 16 сентября 2008

Вы, вероятно, не хотите удалять символы отладки из общих библиотек, поскольку это может понадобиться в какой-то момент.

Если вы используете GDB или DDD для отладки, вам, возможно, удастся удалить исходные файлы Boost из исходного пути, чтобы они не могли отследить функции. (Или просто не проследить в них, проследить!)

Вы можете удалить опцию для компиляции программы с отладочными символами, что ускорит время ссылки.

Как и скрипт, на который вы ссылаетесь, вы можете обратиться к программе стриптиза ("man strip"), чтобы удалить все или определенные символы.

0 голосов
/ 16 сентября 2008

Какой компилятор вы используете? Например, если я правильно понимаю ваш вопрос, в MS Visual Studio это тривиальный вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...