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