今天,移植 openssh-portable 到imx6ul板子上,交叉編譯OK。
放板子上執行,除錯。
root@imx6ulevk:/mnt/nfs/ssh# ./ssh-keygen
-sh: ./ssh-keygen: not found
root@imx6ulevk:/mnt/nfs/ssh# ./scp
-sh: ./scp: not found
問題
- 在板子上執行應用程序時報錯
-/bin/ash: ./xxx not found
解決方法:
- 在搭建了交叉編譯工具的平臺上用交叉編譯工具自帶的readelf查看該應用程序需要的動態鏈接庫和program interpreter
- 查看動態鏈接庫
arm-..-linux-..-readelf -d test
Shared library 爲所需的庫,可以在板子上 cd /lib
查看 /lib 目錄下是否有這些需要的庫,同時有的依賴庫時可能在該應用程序自身文件目錄下
- 查看program interpreter
arm-..-linux-..-readelf -l test
- 該應用程序需要的就是 ld-linux-armhf.so.3這個庫。應用程序not found 很多時候是interpreter的原因。
在交叉編譯時,可以給gcc加上-muclibc
,就更改了interpreter,但是這種方法我還沒試過。
另一種方法是用ln指令把 ld-2.13.so (/lib下的一個庫,可能版本不一樣) 連接到 ld-linux-armhf.so.3 上,即ln -s /lib/ld-2.13.so /lib/ld-linux-armhf.so.3
之後就發現應用程序就可以運行了。
第一種方法使用於,源碼已知的情況,第二種方法適用於應用程序源碼未知,並且更方便快速。
經過對比,發現板子運行環境沒有所需的interpreter。
解決辦法:將/lib/ld-xxx.so, 連接到對應的so