2016-06-28 5 views
0

Я пытаюсь использовать objdump для сравнения двух разных версий двоичного файла и задавался вопросом, знал ли кто-нибудь, как интерпретировать имя символа из следующей строки моего вывода objdump:Компоненты имени символа в выводе objdump

102b33bc l  O .rodata 00000058 ThisIsMyStruct::ThisIsMyStruct()::C.24 

Этот вывод был сгенерирован с помощью следующей команды:

objdump -t -C -r -w --special-syms my.bin > my.bin.txt 

Моя проблема заключается в том, что две различные версии my.bin имеют ту же линию, но один имеет C.24 в конце, а другой имеет C.12 в конце.

Что представляет собой C. #?

Спасибо!

ответ

0

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

По-видимому, поиск по http://gcc.gnu.org не найден, как указано в описании gcc. Обычный поиск Google также не очень поучительный.

+1

Название GCC для внешних символов следует за Itanium C++ ABI: https://mentorembedded.github.io/cxx-abi/abi.html#mangling. Но здесь символ локальный, поэтому все ставки отключены. –

0

Моя проблема заключается в том, что две разные версии my.bin имеют одну и ту же строку, но в конце есть C.24, а у другого есть C.12 в конце.

Это не может быть ваша проблема: этот символ имеет локальную связь (l часть), и не виден снаружи объектного файла, в котором она определена.

Символ, скорее всего, представляет собой строковый литерал, например. "foo\n" в printf("foo\n"). Вероятно также, что литерал определен в строке 12 в одном случае, а в строке 24 - в другом случае (хотя это далеко не гарантировано).