Как определить, используется ли glibc - PullRequest
26 голосов
/ 24 ноября 2010

Я пытаюсь реализовать функциональность backtrace для большого фреймворка, который используется для разных платформ и ОС.В некоторых из них он связан с glibc, в то время как в других используется что-то другое (например, uclibc).Функция backtrace () существует только в первом.

Есть ли способ узнать, используется ли glibc?Любой #define?Я не смог найти ответ в руководстве по glibc.Я знаю, что не могу иметь информацию о времени компоновки во время компиляции, но я думаю, что включаемые файлы должны отличаться.По крайней мере, обратный след должен быть объявлен где-то.Я хотел бы проверить это без необходимости передавать явные флаги компилятору.

Ответы [ 4 ]

32 голосов
/ 24 ноября 2010

Включает 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
23 голосов
/ 24 ноября 2010

Есть #defines __ GNU_LIBRARY __ , __ GLIBC __ и __ GLIBC_MINOR __ (6, 2 и 11 намоя система с glibc-2.11) в features.h.

3 голосов
/ 24 ноября 2010

Проверка макросов препроцессора - не - хорошее решение. uClibc и, возможно, другие реализации libc определяют макросы для имитации glibc (без предоставления всей его раздутой функциональности) по тем же причинам, по которым все браузеры включают «Mozilla» в свои строки User-Agent: неработающие программы, которые ожидают увидеть glibc и отключить лоты функций, если они этого не видят.

Вместо этого вы должны написать скрипт конфигурации для проверки на backtrace и использовать его, только если он доступен.

0 голосов

Эмпирически оба из следующих компонентов компилируются и нормально работают на 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 уже встраивает объекты времени выполнения, такие как crt1.o, в исполняемый файл финала и те из Глибц.

Итак, основной отсутствующий вопрос: гарантирует ли glibc включение features.h в каждый заголовок? Я не мог найти ясную цитату документации. TODO.

...