почему искажение имени не происходит?

extern int test();
int main()
{
    return test();
}

Я строю код с помощью gcc -c -o test.o test.c и не обнаруживаю никакого искажения имени при запуске nm test.o. nm выводит test, но не _test.

Мое окружение ubuntu 16.04 gcc 5.4.0


person dcnh35    schedule 09.12.2016    source источник
comment
Хотя на самом деле это не изменение имен, добавление подчеркивания к именам функций зависит от используемой вами цепочки инструментов. При разработке для микроконтроллеров C16x я использовал инструменты от Keil и Tasking. Один добавил _, а другой нет. Даже для той же архитектуры процессора. Поэтому вам нужно прочитать документацию по вашей цепочке инструментов или описание EABI вашего процессора, чтобы понять, каковы соглашения о вызовах для функций C.   -  person Gerhardh    schedule 09.12.2016


Ответы (3)


Кажется, вы ожидаете, что к глобальным символам будет добавлено подчеркивание. Это то, что не делается в ELF, который является форматом объекта, который использует Linux. Старые двоичные форматы, такие как a.out или coff, требовали этого, а ELF — нет.

Кстати. термин «исправление» обычно используется для изменения символов С++, что является другой вещью.

person Art    schedule 09.12.2016

Изменение имени не происходит в программах на C. Это происходит в программах на C++.

Вот почему вы не можете перегружать функции в C, но можете в C++.

person R Sahu    schedule 09.12.2016

Функция main возвращает значение после вызова функции test. Возвращаемое значение test затем присваивается возвращаемому значению main.

Никакого искажения имени не требуется.

person Rishikesh Raje    schedule 09.12.2016