大家好,現在我試著 porting 基本的 hello world program上去 IXP425 執行
出現這樣的錯誤訊息:cannot execute binary file
使用的 tool chain 版本為 arm-linux-tools-20030927
編譯器為 arm-linux-gcc
我自己的猜測是,程式無法順利連結到 shared object
也就是 snapgear 中所提供的 C 語言函式庫(在我的 snapgear 中為 libuClibc-0.9.26.so)
我認為程式會與 libc.so.0 連結
而 libc.so.0 實際上為連結至 libuClibc-0.9.26.so 的 link
請問在 cross compile 的時候,該做怎麼樣的設定,
好讓執行檔能順利找到板子上的 shared object 呢?
我在編譯時只使用很單純的 arm-linux-gcc test.c
另外,我做了一些測試:
使用 arm-linux-gcc 產生執行檔(a.out)之後,
1. 使用 ldd command:ldd a.out
結果:not a dynamic executable
2. 使用 file command:file a.out
結果:a.out: ELF 32-bit LSB executable, ARM,
version 1 (ARM), for GNU/Linux 2.0.0,
dynamically linked (uses shared libs),
for GNU/Linux 2.0.0, not stripped
3. 執行 arm-linux-strings a.out
結果:
/lib/ld-linux.so.2
libc.so.6
printf
abort
_IO_stdin_used
__libc_start_main
__fini_array_end
__fini_array_start
__init_array_end
__init_array_start
_Jv_RegisterClasses
GLIBC_2.0
hello world!
從第二個測試,發現執行檔確實是 dynamically linked。
然而第一個測試卻沒有顯示任何動態連結的 library。
此外,第三個測試的前兩行輸出,尤其是第二行,
在 snapgear 的 /lib 中,只有 libc.so.0。
因此我認為是在編譯時設定不當。
請問在編譯時該怎麼設定呢?
P.S.:tool chain 中有許多版本的編譯器,
例如 arm-linux-gcc
arm-linux-3.3.2-gcc
arm-linux-gcc-3.3.2
arm-linux-gcc-3.4.4
請問它們之間有什麼差異嗎?
我使用 arm-linux-gcc 以及 arm-linux-gcc-3.4.4 可以成功編譯程式