繁体   English   中英

如何判断是否使用了 glibc

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM