glibc System Call 래퍼의 역할
glibc는 Linux 커널의 시스템 콜에 대한 C 언어 래퍼 함수를 제공합니다. 이 래퍼는 단순한 기술적 번역 계층으로, C 호출 규약을 각 아키텍처의 커널 ABI로 변환합니다. 대부분의 애플리케이션은 chmod, open, write 같은 glibc 함수를 통해 시스템 콜에 접근하며, glibc는 아키텍처별 레지스터 배치와 에러 처리를 자동으로 처리합니다.
아키텍처별 호출 규약과 레지스터 매핑
x86-64에서는 syscall 명령어를 사용하며, 시스템 콜 번호는 eax(또는 rax) 레지스터에 전달됩니다. 인자는 rdi, rsi, rdx, r10, r8, r9 순서로 전달되고, 반환값은 rax에 저장됩니다. ARM EABI는 swi 명령어를 사용하고 r7에 콜 번호를 놓으며, 32비트 아키텍처에서는 64비트 값 정렬 같은 추가 고려사항이 발생합니다.
에러 처리 및 호환성 매핑
glibc 래퍼는 커널이 반환한 음수 에러값을 양수로 변환하여 errno에 저장하고 -1을 반환합니다. 또한 구형 시스템 콜이 신규 콜로 대체된 경우 자동 매핑합니다(예: dup2를 dup3으로 구현, open을 openat으로 호출). 32비트와 64비트 시간값 변환 같은 ABI 호환성 처리도 수행하여 이식성을 보장합니다.