busybox動態庫問題

本文乃fireaxe原創,使用GPL發佈,可以自由拷貝,轉載。但轉載請保持文檔的完整性,並註明原作者及原鏈接。內容可任意使用,但對因使用該內容引起的後果不做任何保證。

博客:fireaxe.blog.chinaunix.net

環境:
Environment:Ubuntu 12.04
tool-chain:DENX的ELDK-PPC-5.4
文件系統:busybox-1.21.1

問題:
ELDK從2008升級爲5.4後,竟然不再支持靜態鏈接,所以需要用動態鏈接的方式編譯busybox。
(關於不支持靜態鏈接問題,我沒有找到,但不能確定ELDK5.4是否真的不支持。google了一下,說是對於靜態鏈接的爭論很大,主要是說它不利於重用與升級,似乎GNU正在考慮去掉靜態鏈接)

過程:
1. 配置busybox
> make menuconfig
在”Busybox Settings ---> Build Options --->“ 關閉“Build BusyBox as a static binary。
打開”Build shared libbusybox“。
關閉”Produce a binary for each applet“與”Produce additional busybox binary“。
保存退出

2. 編譯並安裝busybox
> make
> make install
生成的文件就放在_install目錄中了

3. 找出busybox的依賴關係 (即找到busybox依賴的動態庫)
這裏介紹有四種方式:

1) readelf
> powerpc-linux-readelf -d busybox | grep NEEDED
 0x00000001 (NEEDED)                     Shared library: [libcrypt.so.1]
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]

2) objdump
>powerpc-linux-objdump -x busybox | grep NEEDED
  NEEDED               libcrypt.so.1
  NEEDED               libm.so.6
  NEEDED               libc.so.6

3)直接找字符串
> strings busybox | grep ^lib
libcrypt.so.1
libm.so.6
libc.so.6

4) ldd (ELDK的tool-chain沒有提供ldd,下面是在宿主機上測試的結果,用於說明爲什麼需要ld.so)
ldd busybox
    linux-gate.so.1 =>  (0xb776d000)
    libcrypt.so.1 => /lib/i386-linux-gnu/libcrypt.so.1 (0xb7729000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb76fd000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7552000)
    /lib/ld-linux.so.2 (0xb776e000)

前三種方法大致相同,都能找出所需的動態庫,最後一個ldd特別一點。
ldd中以/lib/"開頭的幾個文件時所需的庫文件,但它比前三種方法多找出了一個庫:ld-linux.so.2。這個是默認需要的,所以前三種方法並沒有列出,但我們拷貝的時候是一個也不能少的。
綜上所述,一共需要拷貝四類文件,爲什麼說是四類呢,因爲有些文件只是一個快捷方式(連接),所以必須連着實際的庫文件一起拷貝:
libcrypt
libm
libc
ld-linux

4. 拷貝文件
這些庫文件可以從toolchain的sysroot目錄中獲得,如果不知道路徑,可以問問編譯器:
> powerpc-linux-gcc -print-sysroot
/opt/eldk-5.4/powerpc/sysroots/powerpc-linux

庫文件在這個目錄的lib目錄裏。拷貝時一定要拷全!!

最後,別忘了方法四種提到的ld.so。它是動態加載器(dynamic loader),也在lib目錄中,名字前綴爲ld。

其他的步驟就與靜態鏈接時沒有區別了

references:
http://stackoverflow.com/questions/17785208/when-we-build-a-kernel-and-busy-box-we-need-toolchain-only-for-busybox-not-for
http://stackoverflow.com/questions/3430400/linux-static-linking-is-dead

本文乃fireaxe原創,使用GPL發佈,可以自由拷貝,轉載。但轉載請保持文檔的完整性,並註明原作者及原鏈接。內容可任意使用,但對因使用該內容引起的後果不做任何保證。

博客:fireaxe.blog.chinaunix.net

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章