2014年4月21日 星期一

[Linux] can't handle reloc type 0x26

花了許久的時間,終於解開這個問題。

  • 錯誤訊息  

    在使用某公司提供的ToolChain來Cross-compiler Qemu,而因ToolChain的uClibc版本太低以及缺少過多library,所以最後選擇自行編譯ToolChain來Cross Compiler Qemu。雖然成功Cross-compiler Qemu,但放置板子上執行發生以下錯誤

    圖一

  • 發生原因

    cross-compiler與執行環境的uClibc版本不一樣時,就有可能發生這樣的問題(通常是因為版本低的不支援版本高的)。

    不過這個問題也讓我思考另一個問題,到底uClibc與Kernel 之間的關係以及Compiler時是如何呢?? 從Referece[2]上得知
    • uClibc的版本,會依賴多少Kernel version以上的版本。
    • Kernel的本身並不依賴uClibc的Library,但Compiler時會依賴GCC與uClibc的版本。


  • 解決方法

    了解問題所在,當然要解決就不難啦。

    • 先檢查uClibc的版本(常見路徑 : /lib)。
      • libuClibc-$UCLIB_VER.so
      • ld-uClibc-$UCLIB_VER.so
      • libcrypt-$UCLIB_VER.so
      • libresolv-$UCLIB_VER.so
      • libdl-$UCLIB_VER.so
      • libnsl-$UCLIB_VER.so
      • libm-$UCLIB_VER.so
      • libutil-$UCLIB_VER.so
      • libpthread-$UCLIB_VER.so
      • libthread_db-$UCLIB_VER.so
      • librt-$UCLIB_VER.so 
      • libstdc++.so.$UCLIB_VER ( for g++)
    • 一般情況,新版的uClibc可以相容舊版的uClibc
    • 替換合適的uClibc到執行環境底下即可

Reference:
[1] can't handle reloc type 0x26 in my openwrt 
[2]  Are libc versions tied to kernel versions?

沒有留言:

張貼留言