2012-08-26 37 views
5

例如android使用的是仿生而不是glibc,但如何找出它真的使用仿生http://en.wikipedia.org/wiki/Bionic_(software),而不是glibc?知道嵌入式系統是使用glibc還是仿生?

我可以在/ proc文件系統中找到這些信息,還是有任何命令可以告訴仿生在當前系統上使用?

順便說一句,有可能在嵌入式系統上有多個c lib嗎?

+1

如果每個應用程序都與其libc靜態鏈接,那麼不同的應用程序可能會使用不同的libcs​​。 – sawdust

+0

如何將應用程序靜態鏈接到它的c庫? – hugemeow

+2

對於gcc,鏈接時使用'-static'選項。使用實用程序'file'告訴你可執行文件是靜態的還是動態鏈接的。我使用'strings'來列出動態鏈接可執行文件使用的庫和入口點。 – sawdust

回答

4

如果您的代碼需要根據它是否與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。

+0

那麼如何知道系統是否使用glibc或uClibc? – hugemeow

+0

@hugemeow'#ifdef __UCLIBC__'。大多數圖書館都有類似的東西。 – Gilles

+0

所以我應該讀取可能包含在嵌入式系統中的頭文件,以便知道它使用哪個clib? – hugemeow