Как GDB интерпретирует `main`, когда не загружены символы отладки? - PullRequest
1 голос
/ 09 мая 2011
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/ctest/printf...(no debugging symbols found)...done.
(gdb) disas main
Dump of assembler code for function main:
0x0000000000400498 <main+0>:    push   %rbp
0x0000000000400499 <main+1>:    mov    %rsp,%rbp
0x000000000040049c <main+4>:    sub    $0x10,%rsp

Как GDB интерпретирует main, если символы отладки не загружены?

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

GDB не «интерпретирует» main.

Если ваш вопрос «как GDB узнает, где находится main», ответ: «потому что его адрес находится в таблице символов» (см.вывод из nm /root/ctest/printf).В UNIX (в отличие от Windows) не требуется, чтобы символы отладки содержали имена функций и глобальных переменных в исполняемом файле (или разделяемой библиотеке) - они сохраняются по умолчанию (для облегчения отладки).Если вы хотите скрыть свой main, вы можете запустить strip printf, чтобы удалить его (и все другие символы) из исполняемого файла.

Для вашего второго вопроса main не поврежден, потому что он имеетextern "C" связь.Она должна иметь эту связь, чтобы ее можно было вызывать из сборки (она вызывается при запуске среды выполнения C, обычно crt1.o).

0 голосов
/ 09 мая 2011

main не является символом отладки, поэтому он не удаляется.Он имеет внешнюю связь, поэтому он сохраняется, если явная команда strip или link не удаляет его.Это не искажено, потому что на большинстве платформ нет никакого искажения имени в C ABI (кроме, возможно, для добавления подчеркивания или подобного).

Компоновщик и другие инструменты могут определить, какие символы являются символами отладки.и которые являются внешними или частными и т. д., потому что они помечены по-разному в таблице символов.Например, в Mac OS X мы можем увидеть что-то вроде этого:

                 U _constantFromAnotherModule
0000000000000018 T _externFunction
0000000000000410 s _privateInt
0000000000000000 t _staticFunction

Различные буквы в среднем столбце перед именами символов указывают на различные типы связей, и они по-разному обрабатываютсяtools.

Даже если символы являются искаженными, инструменты часто знают, как отменить искажение, поэтому отладчик должен иметь возможность найти имя функции в таблице символов, даже если оно былопока он был построен с помощью инструментов, совместимых с отладчиком.Кроме того, main( ) в C ++ имеет связь C и следует за C ABI платформы, поэтому он обычно не искажен.

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