2012-08-26 15 views
5

zum Beispiel Android nutzt Bionic eher als glibc, aber wie man es herausfinden wird, ist wirklich bionische http://en.wikipedia.org/wiki/Bionic_(software), nicht glibc?Wissen, ob ein eingebettetes System glibc oder bionic verwendet?

kann ich diese Informationen im/proc-Dateisystem finden, oder gibt es einen Befehl, der sagen kann, dass bionic auf dem aktuellen System verwendet wird?

Übrigens, ist es möglich, mehr als eine c lib auf eingebetteten Systemen zu haben?

+1

Wenn jedes Anwendungsprogramm statisch mit seiner libc verbunden war, dann könnten verschiedene libcs ​​von verschiedenen Anwendungen verwendet werden. – sawdust

+0

Wie verknüpfen Sie die Anwendung statisch mit ihrer c-Bibliothek? – hugemeow

+2

Für gcc verwenden Sie die Option "-static", wenn Sie eine Verknüpfung herstellen. Verwenden Sie das Dienstprogramm 'file', um anzugeben, ob die ausführbare Datei statisch oder dynamisch verknüpft ist. Ich verwende 'strings', um die Bibliotheken und Einstiegspunkte aufzulisten, die von einer dynamisch verknüpften ausführbaren Datei verwendet werden. – sawdust

Antwort

4

Wenn Sie Code haben, der sich abhängig davon, ob er mit Bionic oder Glibc verknüpft ist, anders verhalten muss, kann und muss dies zur Kompilierzeit bestimmt werden. Bionic und Glibc sind sowieso nicht binärkompatibel, daher müssen Sie zur Kompilierungszeit einen Satz von Headern festlegen.

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

Sie werden keine Informationen in /proc finden, weil /proc Informationen über den Kernel enthält, nicht über die Bibliothek C.

Theoretisch ist es möglich, so viele C-Bibliotheken auf einem System zu speichern, wie Sie möchten. Dies wäre jedoch bei einem eingebetteten System sehr ungewöhnlich, da diese im Allgemeinen versuchen, die Codegröße niedrig zu halten. Das einzige System, in dem ich mehrere C-Bibliotheken erwarte, ist ein Embedded-Entwickler-Rechner, wenn dieser Entwickler kein Cross-Compiling durchführt (was selten vorkommt). Darüber hinaus wird Bionic nur auf Android verwendet und nur Bionic wird auf Android verwendet, so dass alle Android-Systeme über Bionic verfügen und andere Systeme nicht über Bionic verfügen. Nicht-Android-Linux-Systeme haben eine andere Bibliothek, entweder Glibc oder (auf eingebetteten Systemen) einige andere libc wie uClibc oder Dietlibc.

+0

dann, wie zu wissen, ob das System glibc oder uClibc verwendet? – hugemeow

+0

@hugemeow '#ifdef__UCLIBC__'. Die meisten Bibliotheken haben so etwas. – Gilles

+0

also sollte ich die head-dateien lesen, die in dem eingebetteten system enthalten sein können, um zu wissen, welchen clib es benutzt? – hugemeow