2015-12-11 23 views
2

我正在爲beaglebone黑色設備交叉編譯共享庫(miniweb)。當我沒有優化編譯時,我沒有任何問題。不過,如果我編譯任何優化(即-O3)我得到的嘗試運行我的程序時,以下幾點:啓用編譯器優化時找不到glibc

./myprogram: /lib/arm-linux-gnueabihf/libc.so.6: version `GLIBC_2.15' not found (required by /usr/lib/libminiweb.so) 

我的第一個問題,爲什麼會允許優化突然引起我的程序依賴於這個庫?優化功能被禁用時,庫中是否靜態地包含內容?

如何確定交叉編譯器使用的c庫版本?我已經在兩個系統上運行以下命令ldd --version

桌面:

$ ldd --version 
ldd (Ubuntu EGLIBC 2.19-0ubuntu6.6) 2.19 
Copyright (C) 2014 Free Software Foundation, Inc. 

beaglebone:

ldd --version 
ldd (Debian EGLIBC 2.13-38+deb7u1) 2.13 
Copyright (C) 2011 Free Software Foundation, Inc. 

很顯然,我有庫是過時的,但你可以看到我的系統報告使用eglibc而不是glibc

我的交叉編譯庫如何依賴於glibc?也許在我的桌面上運行ldd並不是我交叉編譯器使用的庫的準確反映?

如何找到我的交叉編譯器正在使用哪個c庫?

回答

2

我的第一個問題,爲什麼啓用優化突然導致我的程序依賴於這個庫?

你的程序依賴libc.so.6有和沒有優化。您可以通過在目標系統上運行ldd ./myprogram來驗證此情況。

發生什麼事是你的優化程序變得依賴於以後版本libc.so.6那麼你已經安裝了。

假設一個頭文件包含以下內容:

inline int foo() { return bar() + 1; } 

進一步假設你的程序調用foo。沒有優化,foo而不是被內聯,並且您的程序將取決於foo

有了優化,foo內聯,而你的程序將不再依賴於foo,但將取決於bar代替。

如果在靜態鏈接時,您鏈接到提供foobar的庫lifoobar.so,那麼您的鏈接將成功進行優化或不進行優化。

如果在動態鏈接時間(即,在運行時)使用不同版本的libfoobar.so,其中一個提供foo但未提供bar,則未優化的程序將運行正常,但優化的程序將失敗,並且找不到bar

這就是發生了什麼給你,而不是隻bar您使用版本符號[email protected]_2.15,並力量程序依賴於GLIBC_2.15版本,這是什麼從目標丟失。

禁用優化時靜態地包含在庫中的內容?

我怎麼能確定我的交叉編譯器使用C庫的版本?

它使用libc-2.15.so或更高版本。你應該看看你的交叉編譯器目錄。

桌面: $ ldd --version

你有你的桌面上什麼是完全不相干。重要的是你的交叉編譯器正在使用什麼。

我的交叉編譯庫如何依賴glibc?

你的交叉編譯器提供自己的的glibc的版本,和你的交叉編譯的二進制取決於 GLIBC。

換句話說,有3個不同的glibc版本在這裏:

  1. 的一個桌面上(無關)
  2. 您的交叉編譯器使用鏈接的二進制
  3. 的一一個在你的目標(beaglebone)系統上。

我們知道,(2)是從錯誤信息至少GLIBC-2.15,我們知道,(3)是GLIBC-2.13(這是太舊)。

如何找到我的交叉編譯器正在使用哪個c庫?

在您的交叉編譯器安裝目錄下尋找它。

你也可以問問鏈接打印爲您:

echo "int main() { return 0; }" | /path/to/cross-gcc -Wl,-t -xc - 
+0

它看起來像圖書館住在這裏'在/ usr/ARM-Linux的gnueabihf/lib目錄/ libc.so.6'但我怎麼能知道它是什麼版本? – dtmland

+1

@dtmland'strings /usr/arm-linux-gnueabihf/lib/libc.so.6 | grep'GNU C Library。* version''。 –

+0

太棒了! 'GNU C Library(Ubuntu EGLIBC 2.19-0ubuntu2)穩定版本2.19,由Roland McGrath等人編寫' – dtmland