제가 이해하기로 POSIX는 운영 체제가 제공해야 하는 API 세트만 지정하고 구현 세부 사항, 특히 어셈블리 수준 호환성은 지정하지 않습니다. 예를 들어 x86에서는 POSIX API를 얻으려면 시스템 호출을 사용해야 합니다.
1. set `eax` to the syscall number
2. set syscall arguments
3. call int 0x80
그러나 프로세스는 다음에 따라 크게 달라질 수 있습니다.
- UNIX 운영 체제: 운영 체제마다 시스템 호출 번호에서 POSIX API로의 매핑이 다를 수 있습니다.
- 아키텍처: X86/arm에는 다른 명령 호출이 있습니다.
int 0x80
그래서 저는 POSIX가 다양한 운영 체제에서 POSIX 라이브러리의 API 변환을 보존함으로써 제 역할을 한다고 생각합니다. 예를 들어 glibc.so
:
POSIX API는 glibc 기호 형식으로 제공됩니다. 실행 파일이 POSIX API를 호출할 때마다 모든 운영 체제에서 이 기호를 찾으며 glibc.so
실행 파일에서 int 0x80을 직접 호출할 필요가 없습니다.
그래서 내 질문은 다음과 같습니다
- 내 이해가 맞나요?
- 이 외에도 유사하게 작동 하지만 다른 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 바이너리가 포함됩니다.)