C 컴파일러 확장과 이식성 문제 해결 과제

원제: C extensions, portability, and alternative compilers

왜 중요한가

C 언어 생태계의 컴파일러 다양성 확보와 표준 준수 개선이 필요한 상황을 보여준다.

개발자가 C 컴파일러 개발 과정에서 겪은 glibc 호환성 문제를 분석했다. sys/cdefs.h가 GCC, clang, tcc만 지원해 __attribute__ 기능을 제한하고, limits.h도 GNU 컴파일러만 고려한 설계로 대안 컴파일러 개발에 장벽이 된다고 지적했다.

C 언어 개발자들이 ISO C 표준을 완전히 준수하는 코드를 작성하기 어려운 현실적 문제들이 제기됐다. 대부분의 실제 C 코드는 비표준 동작과 언어 확장에 의존하며, 이는 추가 기능보다는 컴파일러와 라이브러리의 버그와 한계를 해결하기 위한 경우가 많다.

특히 glibc의 경우 비GCC 컴파일러와의 호환성을 유지하려 노력하지만 여전히 문제가 있다. sys/cdefs.h 파일에서 컴파일러별 매크로 검사를 통해 지원되는 확장 기능을 판단하지만, 때로는 제대로 작동하지 않는다. 예를 들어 Linux의 struct epoll_event는 packed struct를 사용하는데, 이는 GNU __attribute__((packed))를 필요로 한다. 64비트 환경에서 구조체 레이아웃을 변경하기 때문에 이를 무시하면 ABI가 깨진다.

더 심각한 문제는 sys/cdefs.h가 GCC, clang, tinyc가 아닌 컴파일러에서는 __attribute__를 완전히 무시하도록 정의되어 있다는 점이다. 또한 컴파일러가 제공해야 하는 표준 헤더들(stddef.h, stdint.h, limits.h 등)도 문제가 있다. glibc의 limits.h는 GNU 컴파일러가 아닌 경우 자체적으로 모든 상수를 정의하도록 되어 있어 대안 컴파일러 개발에 장벽이 되고 있다.

출처

lemon.rip — 원문 읽기 →