Этот ответ содержит некоторые особенности, которые мне понадобились, чтобы ответ 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, как это делается здесь .
Надеюсь, это поможет