[英]How to tell if glibc is used
我正在尝试为用于不同平台和操作系统的大型框架实现回溯功能。 在其中一些中,它与 glibc 相关联,而在另一些中,使用了不同的东西(例如 uclibc)。 backtrace() 函数只存在于前者。
有没有办法判断是否使用了glibc? 任何#define? 我无法在 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
有 #defines __GNU_LIBRARY__ , __GLIBC__ 和 __GLIBC_MINOR__ (在我的系统上使用 glibc-2.11 为6、2和 11)在 features.h 中。
检查预处理器宏不是一个好的解决方案。 uClibc 和可能的其他 libc 实现定义了宏来模仿 glibc(不提供其所有臃肿的功能),原因与所有浏览器在其用户代理字符串中包含“Mozilla”的原因大致相同:期望看到 glibc 并关闭很多的损坏程序如果他们没有看到它的功能。
相反,您应该编写一个配置脚本来探测backtrace
并仅在它可用时使用它。
#if defined(__GLIBC__) && !defined(__UCLIBC__) && !defined(__MUSL__)
这有点难看,语法上也有歧义,但很有用。
根据经验,以下两个都可以在 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
,另请参阅: features.h 标头的目的是什么?
因此,严格来说, __GLIBC__
本身并不能明确表示使用了 glibc,因为即使没有头文件,GCC 也已经在 finale 可执行文件中嵌入了诸如crt1.o
运行时对象,而那些来自 glibc。
所以主要的缺失问题是:glibc 是否保证features.h
被包含在每个头文件中? 我找不到明确的文档引用。 去做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.