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
'programing' 카테고리의 다른 글
판다 버전 rbind (0) | 2023.10.19 |
---|---|
스크롤 높이는 어떻게 결정합니까? (0) | 2023.10.19 |
사용자 지정 게시글 메타 저장, 데이터 저장 안 함 (0) | 2023.10.19 |
벡터/매트릭스 끝까지 우아한 인덱싱 (0) | 2023.10.19 |
PowerShell 스크립트에서 특정 기능을 "비공개"로 만들 수 있는 방법이 있습니까? (0) | 2023.10.19 |