Подтвердить что ты не робот

Как определить, используется ли glibc

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

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

4b9b3361

Ответ 1

В функциях #defines __ GNU_LIBRARY __, __ GLIBC __ и __ GLIBC_MINOR __ (6, 2 и 11 в моей системе с glibc-2.11).h.

Ответ 2

Включить 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

Ответ 3

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

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

Ответ 4

Опытным путем оба из следующих компилируются и работают нормально на 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.

Итак, главный нерешенный вопрос: гарантирует ли glibc, что features.h включается в каждый заголовок? Я не мог найти ясную цитату документации. СДЕЛАТЬ.