G ++ имя искажение глобальных константных переменных

Может ли кто-нибудь помочь мне понять соглашения по искажению имен 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

Это показывает, что компилятор изменяет только глобальные переменные, размещенные в разделе только для чтения. Я ожидал бы, что компилятор либо искажает ВСЕ, либо НЕТ глобальных переменных

Это намеренное поведение? Для меня это выглядит противоречивым.

4

Решение

Mangling в основном используется для различения символов компоновщика, которые в противном случае разумно конфликтуют.

поскольку x является неявно статичным, несколько единиц перевода могут по закону иметь разные переменные x, поэтому символ искажен, чтобы избежать столкновений.

поскольку y является не статическая, может быть только одна глобальная переменная y в программе, поэтому нет необходимости избегать коллизий (они должны быть помечены как нарушения ODR или устранены дублированием компоновщиком).

Другое использование для функций, чтобы различать перегрузки с тем же именем, но разными списками аргументов. Это явно не относится здесь.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]