Может ли кто-нибудь помочь мне понять соглашения по искажению имен gcc?
Рассмотрим следующий тестовый код
#include <stdio.h>
const int x = 42;
int y = 42;
int main( int argc, const char* argv[] )
{
return 0;
}
При беге nm
Я получаю следующий (удивительный?) Результат:
0000000000000000 T main
0000000000000000 D y
0000000000000000 r _ZL1x
Это показывает, что компилятор изменяет только глобальные переменные, размещенные в разделе только для чтения. Я ожидал бы, что компилятор либо искажает ВСЕ, либо НЕТ глобальных переменных
Это намеренное поведение? Для меня это выглядит противоречивым.
Mangling в основном используется для различения символов компоновщика, которые в противном случае разумно конфликтуют.
поскольку x
является неявно статичным, несколько единиц перевода могут по закону иметь разные переменные x
, поэтому символ искажен, чтобы избежать столкновений.
поскольку y
является не статическая, может быть только одна глобальная переменная y
в программе, поэтому нет необходимости избегать коллизий (они должны быть помечены как нарушения ODR или устранены дублированием компоновщиком).
Другое использование для функций, чтобы различать перегрузки с тем же именем, но разными списками аргументов. Это явно не относится здесь.
Других решений пока нет …