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 платформы, поэтому он обычно не искажен.