실행 파일은 어떻게 POSIX를 사용하여 서로 다른 UNIX 시스템 간의 호환성을 유지합니까?

실행 파일은 어떻게 POSIX를 사용하여 서로 다른 UNIX 시스템 간의 호환성을 유지합니까?

제가 이해하기로 POSIX는 운영 체제가 제공해야 하는 API 세트만 지정하고 구현 세부 사항, 특히 어셈블리 수준 호환성은 지정하지 않습니다. 예를 들어 x86에서는 POSIX API를 얻으려면 시스템 호출을 사용해야 합니다.

1. set `eax` to the syscall number
2. set syscall arguments
3. call int 0x80

그러나 프로세스는 다음에 따라 크게 달라질 수 있습니다.

  1. UNIX 운영 체제: 운영 체제마다 시스템 호출 번호에서 POSIX API로의 매핑이 다를 수 있습니다.
  2. 아키텍처: X86/arm에는 다른 명령 호출이 있습니다.int 0x80

그래서 저는 POSIX가 다양한 운영 체제에서 POSIX 라이브러리의 API 변환을 보존함으로써 제 역할을 한다고 생각합니다. 예를 들어 glibc.so:

POSIX API는 glibc 기호 형식으로 제공됩니다. 실행 파일이 POSIX API를 호출할 때마다 모든 운영 체제에서 이 기호를 찾으며 glibc.so실행 파일에서 int 0x80을 직접 호출할 필요가 없습니다.

그래서 내 질문은 다음과 같습니다

  1. 내 이해가 맞나요?
  2. 이 외에도 유사하게 작동 하지만 다른 UNIX 운영 체제에서 glibc.so작동하는 다른 라이브러리가 있습니까 ?glibc.so

답변1

POSIX바이너리 인터페이스가 지정되지 않았으므로 "POSIX" 바이너리를 빌드하여 다른 POSIX 스타일 운영 체제에서 실행할 수 없습니다. POSIX는 시스템 호출에도 신경 쓰지 않습니다. 함수를 정의하며 해당 함수가 궁극적으로 어디에 구현되는지는 중요하지 않습니다.

실제로 언급했듯이 Linux 및 기타 POSIX 스타일 시스템에서는 이러한 기능이 "C 라이브러리"에서 구현됩니다. 그러나 바이너리가 이러한 함수를 호출하는 POSIX 정의 방법조차 없습니다. C 프로그램용 POSIX는 가장 관련성이 높지만 프로그램을 작성 및 컴파일하고 런타임 시스템 인터페이스의 동작을 고려할 때 그다지 중요하지 않습니다.어떻게이러한 인터페이스에 액세스합니다.c99명령실행할 컴파일러를 지정하므로 POSIX에는 C 소스 코드를 가져와 이를 바이너리로 변환하는 기능이 필요하지만 해당 바이너리의 세부 사항은 시스템마다 다릅니다. (Linux의 바이너리 인터페이스는 다음과 같습니다.시스템 V ABI, 다양한 아키텍처별 확장 기능이 포함되어 있습니다. )

다른 C 라이브러리도 있습니다. 각 플랫폼은 고유한 기능을 제공하며 일부 플랫폼에는 두 개 이상의 플랫폼이 있습니다. 리눅스에는GNU C 라이브러리, 그러나 또한머슬러.

또한 C 라이브러리는 C 프로그램에서만 사용되는 것이 아닙니다. POSIX 스타일 시스템에서는 대부분의 컴파일러와 인터프리터가 이를 사용하게 됩니다. (주목할만한 예외에는 자체 커널 사용자 공간 API 인터페이스를 구현하는 Go 바이너리가 포함됩니다.)

관련 정보