링커가 함수 매개 변수 검사를하지 않는다고 말하는 것이 맞습니다. 함수 호출의 수 또는 유형을 확인하거나 전역 데이터 참조 유형을 확인하지 않습니다. 모든 링커에게 이것이 사실입니까?C 또는 C++ 링커에서 유형 검사가 있습니까?
저는 Clang을 사용하여 x86-64에서 Linux를 사용하고 있습니다. 링커가 참조가 올바른 세그먼트에 있는지 확인합니까? 또는 링커에 관한 한 외부 참조는 사실상 무효 *일까요?
저는 높은 수준의 언어 배경 C#과 Scala에서 왔습니다. 따라서 저수준 세계에 몰입 한 사람들에게는 이것이 분명해 보일 수 있습니다. 어셈블러에 몇 가지 함수 (시스템 호출)를 작성했으며 어셈블러에 외부 함수에 대한 매개 변수 프로토 타입이 없다는 것을 알았습니다.
컨텍스트 : 저는 실제로 컴파일러를 작성하고 있습니다. 지금은 시스템 호출을 위해 어셈블러 함수로 전처리 된 C.i 파일을 대상으로하고 있지만 대안은 C++, 어셈블러 또는 기계 코드이기 때문에 비용 및 이점, 특히 유형 검사의 중요성을 평가하려고합니다. 어셈블러/컴파일러/링커 내 자신의 프로그램과 함수 프로토 타입 생성의 정확성을 검사하는 데 사용할 수 있습니다.
아마 이런 유형의 오류가 발생하지 않았 으면 컴파일러는 연결하기 전에 오류가 발생했을 것입니다. – CoryKramer
Cyber가 맞습니다 - 원칙적으로 링커는 주소 (물론 심볼 이름) 만 처리합니다. –
C++에서 이름은 (일반적으로?) 형식으로 변경되므로 형식이 일치하지 않으면 기호를 찾지 못하게됩니다. 이는 주로 함수 오버로드 기능 때문입니다. 나는 함수가 아닌 변수에 대해서는 모른다. C++의 링크 단계는 불분명하고 맹 글링은 일관성이 없습니다 (실제로 다른 컴파일러는 다른 방법으로 기호를 조작합니다). 그래서 평소보다 더 말할 수는 없습니다. C에서는 오버로드가 불가능하기 때문에 형식이 지정되지 않았습니다 (일반적으로?). C의 link-stage 스펙에 대해 충분히 알지 못하지만 일관성이 있습니다. – Yakk