2016-12-09 5 views
2
extern int test(); 
int main() 
{ 
    return test(); 
} 

Я создаю код gcc -c -o test.o test.c, и я нахожу, что при запуске nm test.o я не могу найти имя. nm выходы test но не _test.Почему имя mangling не происходит?

Моя среда ubuntu 16.04gcc 5.4.0

+0

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

ответ

3

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

КПП. термин «mangling» обычно используется для обозначения символа C++, что другое.

1

Название коверкание не бывает в программах C. Это происходит в программах на C++.

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

1

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

Не требуется указывать имя.

Смежные вопросы