ファイルシステムのライブラリが不足しています:-/bin/sh:hello:not found問題と解決方法
1、問題の説明:
プログラムを実行すると、-/bin/sh:xxx:not fountが表示されます.
/sbinを開くと、このxxx実行可能ファイルが存在します.これは、ファイルシステム(/lib)にライブラリが一部欠けているためです.
2、解決方法-hello.c例
ハローcを例にとる、hello実行可能ファイルがコンパイルされ、/sbinに格納、/etc/init.c/rcSに追加:
/sbin/hello &
実行時:
-/bin/sh: hello: notfound
解決方法:
一、PC上でhelloが依存するライブラリを表示する:
#arm-linux-readelf –ahello
検索:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x00008034 0x000080340x000c0 0x000c0 R E 0x4
INTERP 0x0000f4 0x000080f4 0x000080f4 0x000130x00013 R 0x1
[Requesting programinterpreter:/lib/ld-linux.so.2]
LOAD 0x000000 0x00008000 0x000080000x005d8 0x005d8 R E 0x8000
LOAD 0x0005d8 0x000105d8 0x000105d80x0011c 0x00120 RW 0x8000
DYNAMIC 0x0005e8 0x000105e8 0x000105e8 0x000c80x000c8 RW 0x4
NOTE 0x000108 0x00008108 0x000081080x00020 0x00020 R 0x4
説明hello依存とld-linux.so.2
二、ライブラリをファイルシステムLibディレクトリにコピーし、リンクファイルを作成する
コンパイラのlibディレクトリにld-linuxを見つけます.so.2:
root@xiangpingli: # pwd
/opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/arm-linux/lib
root@xiangpingli: # ls ld-linux.so.2
ld-linux.so.2
root@xiangpingli: # ls -l ld-linux.so.2
lrwxrwxrwx 1 500 500 11 2009-04-08 17:41ld-linux.so.2 -> ld-2.3.6.so
これはld-2.3を指す接続ファイルであることがわかる.6.soの接続
私のやり方:
ld-linux.so.2とld-2.3.6.soはすべて私のファイルシステムディレクトリの/libの下にコピーして、それから接続します:
ln-s ld-2.3.6.so ld-linux.so.2
ld-linuxを作成します.so.2のシンボル接続.
ヒントld-linux-so.2ファイルは既に存在します
したがって、ld-linuxを削除する必要があります.so.2、またはld-2.3のみをコピーする.6.so、接続を確立します.
ln-s ld-2.3.6.so ld-linux.so.2
三、コピー依存の他の動的ライブラリ
実行中に次のエラーが発生します.
/sbin/hello:error while loading shared libraries: libc.so.6: cannot open shared objectfile: No such file or directory
解決策:同じディレクトリからコピーすればよい.
これはhelloを再実行すると成功します.
================================
hello world
================================
プログラムを実行すると、-/bin/sh:xxx:not fountが表示されます.
/sbinを開くと、このxxx実行可能ファイルが存在します.これは、ファイルシステム(/lib)にライブラリが一部欠けているためです.
2、解決方法-hello.c例
ハローcを例にとる、hello実行可能ファイルがコンパイルされ、/sbinに格納、/etc/init.c/rcSに追加:
/sbin/hello &
実行時:
-/bin/sh: hello: notfound
解決方法:
一、PC上でhelloが依存するライブラリを表示する:
#arm-linux-readelf –ahello
検索:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x00008034 0x000080340x000c0 0x000c0 R E 0x4
INTERP 0x0000f4 0x000080f4 0x000080f4 0x000130x00013 R 0x1
[Requesting programinterpreter:/lib/ld-linux.so.2]
LOAD 0x000000 0x00008000 0x000080000x005d8 0x005d8 R E 0x8000
LOAD 0x0005d8 0x000105d8 0x000105d80x0011c 0x00120 RW 0x8000
DYNAMIC 0x0005e8 0x000105e8 0x000105e8 0x000c80x000c8 RW 0x4
NOTE 0x000108 0x00008108 0x000081080x00020 0x00020 R 0x4
説明hello依存とld-linux.so.2
二、ライブラリをファイルシステムLibディレクトリにコピーし、リンクファイルを作成する
コンパイラのlibディレクトリにld-linuxを見つけます.so.2:
root@xiangpingli: # pwd
/opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/arm-linux/lib
root@xiangpingli: # ls ld-linux.so.2
ld-linux.so.2
root@xiangpingli: # ls -l ld-linux.so.2
lrwxrwxrwx 1 500 500 11 2009-04-08 17:41ld-linux.so.2 -> ld-2.3.6.so
これはld-2.3を指す接続ファイルであることがわかる.6.soの接続
私のやり方:
ld-linux.so.2とld-2.3.6.soはすべて私のファイルシステムディレクトリの/libの下にコピーして、それから接続します:
ln-s ld-2.3.6.so ld-linux.so.2
ld-linuxを作成します.so.2のシンボル接続.
ヒントld-linux-so.2ファイルは既に存在します
したがって、ld-linuxを削除する必要があります.so.2、またはld-2.3のみをコピーする.6.so、接続を確立します.
ln-s ld-2.3.6.so ld-linux.so.2
ld-linux-so.2 。
三、コピー依存の他の動的ライブラリ
実行中に次のエラーが発生します.
/sbin/hello:error while loading shared libraries: libc.so.6: cannot open shared objectfile: No such file or directory
解決策:同じディレクトリからコピーすればよい.
これはhelloを再実行すると成功します.
================================
hello world
================================