2012-04-12 7 views
24

이름 맹 글링이 C++ 표준에 의해 결코 표준화되지 않은 이유가 궁금합니다. 분명히 다른 이름의 맹 글링 알고리즘을 사용하면 상호 운용성이 손상되고 [1], 구현 정의에 따른 이점이 보이지 않습니다.이름 맹 글링이 표준화되지 않은 이유

즉, 기본 규칙이나 크기를 호출하는 것과는 달리 기계 자체는 함수가 호출되는 방식을 신경 쓰지 않고 심지어는 알지 못합니다. 그렇다면 표준화되지 않은 이유는 무엇이며 왜 여전히 표준화되지 않은 것입니까? 컴파일러는 어쨌든 버전간에 과거의 규칙을 변경했습니다.

[1] 사람들은 모두 extern "C"과 같은 기능을 내보내고 있습니다.

+11

표준화 된 이름 변환은 올바른 상호 운용성을 얻기 위해 ABI를 표준화해야하기 때문에 보안에 대한 잘못된 인식만을 제공합니다. C++ 표준위원회는 ABI 표준화 사업에 참여하지 않을 것입니다. –

+3

+1 @Raymond - 상호 운용성에 대해 자신에게 거짓말하는 것은 주변의 나쁜 소식입니다. 정의되지 않은 동작에 의존하는 것과 같습니다. 물론, 당신은 * 그것이 효과가 있다고 생각하지만 실제로는 그렇지 않습니다. –

+0

사실, C++ ABI에 동의하는 것은 C보다 훨씬 어려울 것입니다.약간 OT :이 질문에 정확히 3 명이 SO에 잘 맞는 것으로 간주되지 않는 것은 무엇입니까? 결국 거기에 이미 명확한 좋은 대답이 이미 있습니다. – Voo

답변

19

표준은 구현 세부 사항을 다루지 않습니다. 많은 것들이 구현에 의존하며, 프로그램이 함께 작동하는 것을 막는 많은 것들이 있습니다 : 클래스가 어떻게 배치되는지, 구조는 vtable입니다. 일반적으로 컴파일러는 이름 변경을 변경합니다 이 중 하나를 변경하십시오. 은 링크가 작동하지 않는 코드를 방지하기 때문에 이는 의도적 인 것입니다.

주어진 플랫폼에서 C++ ABI를 정의 할 수 있습니다. 호환되는 모든 컴파일러 은 호환되는 구현을 사용하고 일반 이름 변경을가집니다. 플랫폼 공급 업체의 경우이 문제는 입니다. 어떠한 이유로 든 C++ ABI를 정의한 공급 업체는 거의 없습니다.

그리고 extern "C"이 작동하는 이유는 거의 모든 플랫폼이 C ABI를 정의하기 때문입니다.

+2

맹 글링이 표준화 되었더라도 C가 필요하기 때문에 extern "C" 어떤 mangling도하지 않으며 C++는 오버로드 된 함수를 지원해야하기 때문에 심볼은 어떤 경우에도 다르다. –

+3

@JanHudec 'extern "C"가 무엇을 의미하는지 실제로 정의되지 않았습니다. 예를 들어, C 컴파일러가없는 플랫폼에서의 의미는 무엇입니까? 그러나 실제로 모든 플랫폼이 C ABI를 정의하는 것은 아니지만 'extern "C" "는이를 준수한다는 의미입니다. 그리고 여기에서도 이름 맹 글링 만이 유일한 문제는 아닙니다. C와 C++ 사이에서 순서 변수가 스택에 푸시 된 플랫폼에서 작업했습니다. (또한, 사용했던 C 컴파일러의 대부분은 mangle 이름을 사용합니다 .C++보다 훨씬 단순합니다.) –

15

표준에는 실제로 이름 맹 글링이 필요하지 않습니다. 그 문제에 관해,이 표준은 IEEE 부동 소수점 수 또는 2의 보수 정수 또는 임의의 수의 다른 것들을 요구하지 않는다.

널리 ABI가 경쟁사보다에 GCC actually went out of its way to use a different name mangling scheme 의존 할 수 있었다 때까지

G ++는 다른 C++ 컴파일러와 같은 방법으로 엉망으로 이름을하지 않습니다. 즉, 하나의 컴파일러로 컴파일 된 오브젝트 파일을 다른 컴파일러와 함께 사용할 수 없습니다.

이 효과는 더 미묘한 문제에서 당신을 보호하기 위해 의도적입니다. 컴파일러는 클래스 인스턴스 배치 방법, 다중 상속 구현 방법 및 가상 함수 호출 처리 방법을 포함하여 C++ 구현의 많은 내부 세부 사항과 다릅니다. 이름 인코딩이 같아지면 프로그램은 다른 컴파일러에서 제공된 라이브러리와 링크됩니다. 그러나 프로그램을 실행하면 프로그램이 중단됩니다. 호환되지 않는 라이브러리는 런타임이 아닌 링크 타임에 감지됩니다.

이름 맹 글링은 많은 프로그래머가 깨닫는 것보다 복잡합니다. 예를 들어 표준에서 acceptable calling conventions for all platforms that C++ could run on을 어떻게 지정합니까? RISC 시스템은 일반적으로 스택 대신 레지스터에서 인수를 전달하지만 x86 stdcall을 지원해야합니까?

관련 문제