Знайте, использует ли встроенная система glibc или bionic?

например, андроид использует бионический, а не glibc, но как понять, что он действительно использует бионический http://en.wikipedia.org/wiki/Bionic_(software), а не glibc?

я могу найти эту информацию в файловой системе /proc, или есть ли какая-либо команда, которая может сказать, что bionic используется в текущей системе?

кстати, возможно ли иметь более одной библиотеки c lib во встроенных системах?


person hugemeow    schedule 26.08.2012    source источник
comment
Если бы каждая прикладная программа была статически связана со своей libc, то разные libc могли бы использоваться разными приложениями.   -  person sawdust    schedule 27.08.2012
comment
как статически связать приложение с его библиотекой c?   -  person hugemeow    schedule 27.08.2012
comment
Для gcc используйте опцию -static при ссылке. Используйте утилиту file, чтобы узнать, является ли исполняемый файл статическим или динамическим. Я использую strings для перечисления библиотек и точек входа, используемых динамически подключаемым исполняемым файлом.   -  person sawdust    schedule 27.08.2012
comment
strace будет показывать только то, что над файлами библиотеки были выполнены операции открытия/ммап/закрытия файлов. И вам нужно будет запустить команду на целевой плате. Так что strings не опечатка.   -  person sawdust    schedule 28.08.2012


Ответы (1)


Если у вас есть код, который должен вести себя по-разному в зависимости от того, связан ли он с Bionic или Glibc, это можно и нужно определить во время компиляции. Bionic и Glibc в любом случае несовместимы в двоичном виде, поэтому вам нужно зафиксировать один набор заголовков во время компиляции.

#if __BIONIC__
/* Bionic-specific code */    
#elif __GLIBC__
/* Glibc-specific code */
#else
#error "This C library is not supported"
#endif

Вы не найдете никакой информации в /proc, потому что /proc содержит информацию о ядре, а не о библиотеке C.

Теоретически в системе можно разместить сколько угодно библиотек C. Однако это было бы очень необычно для встроенной системы, поскольку они обычно пытаются уменьшить размер кода. Единственная система, в которой я ожидаю несколько библиотек C, находится на встроенной машине разработчика, если этот разработчик не занимается кросс-компиляцией (что, во-первых, редко). Кроме того, Bionic используется только на Android, а на Android используется только Bionic, поэтому все системы Android имеют Bionic, а другие системы не имеют Bionic. В системах Linux, отличных от Android, есть другая библиотека, либо Glibc, либо (во встроенных системах) какая-то другая библиотека, такая как uClibc или Dietlibc.

person Gilles 'SO- stop being evil'    schedule 26.08.2012
comment
тогда как узнать, использует ли система glibc или uClibc? - person hugemeow; 27.08.2012
comment
@огромный мяу #ifdef __UCLIBC__. В большинстве библиотек есть что-то подобное. - person Gilles 'SO- stop being evil'; 27.08.2012
comment
так должен ли я прочитать файлы заголовка, которые могут быть включены во встроенную систему, чтобы узнать, какой clib он использует? - person hugemeow; 28.08.2012
comment
Но могли бы вы потенциально использовать Bionic в системе Linux, отличной от Android? - person vivekian2; 15.03.2014
comment
@ vivekian2 Да, это возможно. Я не знаю, чтобы кто-то этим занимался. - person Gilles 'SO- stop being evil'; 15.03.2014