2010-01-19 2 views
6

ISO C 함수 및 시스템 호출 함수를 구현하는 ac 라이브러리가있는 Linux를 이해하고 있으며이 라이브러리는 C를 개발할 때 링크 될 것입니다. 그러나 다른 c 컴파일러가 반드시 링크 가능 코드를 생성하지는 않습니다 (예 : 함수 인수에 다른 방식으로 사용되는 패드 데이터 구조). 컴파일러를 사용하여 C를 컴파일 할 때 빌트인 C 라이브러리는 어떻게 연결될 것인가? 정적 링크와 동적 링크의 차이점은 무엇입니까?Windows 및 Linux에서 OS C 라이브러리에 연결하는 것이 어떻게 작동합니까?

반면에 Windows에서는 각 컴파일러가 문제의 일부를 해결하는 자체 표준 라이브러리를 제공하지만 시스템 호출은 여전히 ​​단일 DLL 집합에 있습니다. C 응용 프로그램은 이러한 DLL에 어떻게 성공적으로 연결됩니까? 다른 언어는 어떨까요? (같은 DLL은 pre-Net Visual Basic 등에서 사용할 수 있습니다.)

답변

4

각 플랫폼에는 운영 체제와 올바르게 통신하기 위해 각 C 구현이 준수해야하는 "호출 규칙"이 있습니다. 예를 들어 Windows의 경우 기본 C 규칙 인 cdecl과 달리 모든 OS 기반 기능을 stdcall 규칙을 사용하여 호출해야합니다.

Linux에서는 GCC를 사용하여 표준 C 라이브러리 (및 커널)를 컴파일하므로 Linux 용 다른 컴파일러는 GCC에서 사용하는 것과 호환되는 호출 규칙을 사용해야합니다.

0

표준. stdlib는 원시적 인 값과 배열에서 작동한다는 것을 알게 될 것입니다. 그리고 그 것들의 표준은 일들이 어떻게 수행되어야하는지에 대해 꽤 명백합니다.

+1

일부 ANSI C API는 정렬에 민감한 구조체에서 작동합니다. –

3

컴파일러에는 표준 라이브러리 구현이 함께 제공됩니다. 리눅스에서는 컴파일러가 라이브러리를 컴파일 한 GCC 버전과 동일한 규칙을 따를 것이라고 가정합니다.

상호 운용성의 관점에서 보면 생각보다 쉽습니다. 함수가 동일한 소프트웨어로 컴파일되지 않아도 컴파일러가 함수에 대한 유효한 호출을 생성 할 수 있도록하는 호출 규칙이 설정되어 있습니다.

구조체와 패딩에서 대부분의 프레임 워크는 구조에 대한 포인터 인 불투명 유형으로 작동한다는 것을 알 수 있습니다. 종종 구조의 레이아웃을 클라이언트가 사용할 수없는 경우도 있습니다. 따라서 실제 데이터에서는 절대 작동하지 않으며 데이터에 대한 포인터 만 사용하므로 패딩 문제가 해결됩니다.

관련 문제