programing

glibc 사용 여부를 구분하는 방법

bestprogram 2023. 10. 19. 22:39

glibc 사용 여부를 구분하는 방법

저는 다양한 플랫폼과 OS에 사용되는 큰 프레임워크를 위해 백트레이스 기능을 구현하려고 합니다.그들 중 일부에서는 glibc와 연결된 반면, 다른 일부에서는 다른 것(예:uclibc)를 사용합니다. 역추적 () 함수는 전자에만 존재합니다.

glibc 사용 여부를 알 수 있는 방법이 있습니까?정의된 것이 있습니까?glibc 매뉴얼에서 답변을 찾을 수 없었습니다.컴파일하는 동안 링크 타임 정보를 가질 수 없다는 것은 알지만, 파일을 포함하는 것은 다르게 해야 할 것 같습니다.적어도 역추적은 어딘가에 신고해야 합니다.컴파일러에게 명시적인 플래그를 전달하는 것을 강요하지 않고 확인하고 싶습니다.

features.h, 필요한 매크로가 포함되어 있습니다.

#define __GNU_LIBRARY__ 6

/* Major and minor version number of the GNU C library package.  Use
   these macros to test for features in specific releases.  */
#define __GLIBC__       2
#define __GLIBC_MINOR__ 4

feature.h에는 __GNU_LIBRARY_, __GLIBC____GLIBC_MINOR__(glibc-2.11이 있는 내 시스템에서는 6, 2, 11)의 #정의가 있습니다.

전처리기 매크로를 확인하는 것은 좋은 해결책이 아닙니다.uClibc와 다른 libc 구현은 모든 브라우저가 사용자-에이전트 문자열에 "Mozilla"를 포함하는 것과 거의 같은 이유로 매크로를 glibc를 모방하도록 정의합니다. glibc가 보이지 않으면 많은 기능을 끌 것으로 예상되는 깨진 프로그램입니다.

대신 다음을 탐색할 구성 스크립트를 작성해야 합니다.backtrace사용 가능한 경우에만 사용할 수 있습니다.

경험적으로, GCC 6.4에서 다음 두 가지 모두 컴파일 및 정상적으로 실행됩니다.

#include <stdio.h>

int main(void) {
#ifdef __GLIBC__
    puts("__GLIBC__");
#endif
    return 0;
}

그리고:

int main(void) {
#ifdef __GLIBC__
    puts("__GLIBC__");
#endif
    return 0;
}

하지만 첫번째 제품만이 물론 생산을 합니다.

이것은 반드시 다음을 의미합니다.__GLIBC__출신이다stdio.h다음을 포함해야 하는features.h, 참고 항목:기능의 목적은 무엇입니까?머리말?

그러므로 엄밀하게 말하면,__GLIBC__헤더가 없어도 GCC는 피날레 실행 파일과 같은 런타임 객체를 이미 내장하고 있으며 이러한 객체는 glibc에서 나오기 때문에 glibc가 사용된다는 명확한 표시는 아닙니다.

그래서 중요한 누락된 질문은: glibc가 다음을 보장합니까?features.h모든 헤더에 포함되는 건가요?명확한 문서 견적을 찾을 수 없었습니다.하기 위해서.

#if defined(__GLIBC__) && !defined(__UCLIBC__) && !defined(__MUSL__)

이것은 약간 추해지고 통사적으로 모호해 지고 있지만 유용합니다.

언급URL : https://stackoverflow.com/questions/4266354/how-to-tell-if-glibc-is-used