例如android使用的是仿生而不是glibc,但如何找出它真的使用仿生http://en.wikipedia.org/wiki/Bionic_(software),而不是glibc?知道嵌入式系統是使用glibc還是仿生?
我可以在/ proc文件系統中找到這些信息,還是有任何命令可以告訴仿生在當前系統上使用?
順便說一句,有可能在嵌入式系統上有多個c lib嗎?
例如android使用的是仿生而不是glibc,但如何找出它真的使用仿生http://en.wikipedia.org/wiki/Bionic_(software),而不是glibc?知道嵌入式系統是使用glibc還是仿生?
我可以在/ proc文件系統中找到這些信息,還是有任何命令可以告訴仿生在當前系統上使用?
順便說一句,有可能在嵌入式系統上有多個c lib嗎?
如果您的代碼需要根據它是否與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系統都具有仿生,而其他系統不具有仿生。非Android的Linux系統有一些其他庫,Glibc或(在嵌入式系統上)一些其他libc,如uClibc或Dietlibc。
如果每個應用程序都與其libc靜態鏈接,那麼不同的應用程序可能會使用不同的libcs。 – sawdust
如何將應用程序靜態鏈接到它的c庫? – hugemeow
對於gcc,鏈接時使用'-static'選項。使用實用程序'file'告訴你可執行文件是靜態的還是動態鏈接的。我使用'strings'來列出動態鏈接可執行文件使用的庫和入口點。 – sawdust