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

코드를 gcc -c -o test.o test.c으로 작성하고 nm test.o을 실행할 때 이름이 불일치하는 것을 발견했습니다. nmtest이지만 _test은 출력하지 않습니다.이름 맹 글링이 발생하지 않는 이유는 무엇입니까?

내 환경은 C 프로그램에서 발생하지 않습니다 ubuntu 16.04gcc 5.4.0

+0

실제로는 _name mangling_이 아니지만 함수 이름에 밑줄을 추가하는 것은 사용하는 툴 체인에 따라 달라집니다. C16x 마이크로 컨트롤러를 개발하는 동안 Keil과 Tasking의 도구를 사용했습니다. 하나는 _을 추가했지만 다른 하나는 추가하지 않았습니다. 동일한 CPU 아키텍처의 경우에도 마찬가지입니다. 따라서 C 함수를위한 호출 규칙이 어떻게되어 있는지 툴 체인 문서 나 CPU의 EABI 설명을 읽어야합니다. – Gerhardh

답변

3

글로벌 기호 앞에 밑줄이 오는 것을 기대하는 것 같습니다. 이것은 ELF에서 리눅스가 사용하는 객체 형식으로하지 않은 것입니다. a.out이나 coff와 같은 이전 바이너리 형식에서는 ELF가 필요하지 않습니다.

btw. "mangling"이라는 용어는 대개 C++ 심볼 맹 글링에 사용됩니다.

1

이름 맹 글링이다. C++ 프로그램에서 발생합니다.

그래서 C에서 함수를 오버로드 할 수 없지만 C++에서는 오버로드 할 수 없습니다.

1

main 함수가 반환하는 기능 test를 호출 한 후 test의 반환 값은 다음 main의 반환 값으로 주어진다.

이름 변경이 필요하지 않습니다.