web-dev-qa-db-ja.com

qemu-armでarmバイナリを実行しようとするときに「共有ライブラリの読み込み中にエラー」を解決するにはどうすればよいですか?

Qemu、qemu-user、およびgnueabiツールチェーンがインストールされたLinux Mint 14を実行しています。 test.cをarm-linux-gnueabi-gcc test.c -o testでコンパイルしました。

qemu-arm /usr/arm-linux-gnueabi/lib/ld-linux.so.3 testを実行すると

test: error while loading shared libraries: test: cannot open shared object file: No such file or directory」というエラーが表示されます。以前に試したようにqemu-arm testを実行すると、/lib/ld-linux.so.3: No such file or directoryが得られます

ただし、ファイルは存在し、到達可能です。

$ stat /usr/arm-linux-gnueabi/lib/ld-linux.so.3
  File: `/usr/arm-linux-gnueabi/lib/ld-linux.so.3' -> `ld-2.15.so'
  Size: 10          Blocks: 0          IO Block: 4096   symbolic link
Device: 801h/2049d  Inode: 4083308     Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-04-22 16:19:48.090613901 -0700
Modify: 2012-09-21 08:31:29.000000000 -0700
Change: 2013-04-22 15:58:41.042542851 -0700
 Birth: -

Arm Linuxカーネル全体をエミュレートすることなく、qemuにarmプログラムを実行させる方法を誰かが知っていますか?

test.cは

#include <stdio.h>
int main() {
    printf("this had better work\n");
}

そしてfile test

test: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.31, BuildID[sha1]=0xf2e49db65394b77c77ee5b65b83c0cc9220cbfc0, not stripped
13
David

Linuxなしで[〜#〜] arm [〜#〜]を実行する場合は、(少なくとも)別のコンパイラが必要です。 arm-linux-gnueabi-gccLinux用のコンパイラです。コンパイラとlibcは密接にリンクされています。 qemuの移植性レイヤーを備えたnewlibコンパイラが必要です。newlibの移植

Bala および Google newlib + qem を参照してください。 newlibポートは Github でホストされており、Balauブログと同じようです。

通常、Linux以外のgccはarm-none-eabi-gccと呼ばれます。プレフィックスarm-none-eabi-は、一部の構成スクリプトで認識されます。

1
artless noise

-Lフラグを使用してarm-linux-gnueabi共有ライブラリへのパスを提供することにより、サンプルを実行できます。

qemu-arm -L /usr/arm-linux-gnueabi/

また、LD_LIBRARY_PATHが設定されていないことを確認してください。

unset LD_LIBRARY_PATH
25
vivek_v

アセンブリコードでCプログラムを実行しているときにも、この問題に遭遇しました。私の解決策は、たとえば「-static」オプションを使用して実行可能ファイルをビルドすることです。

arm-linux-gnueabi-gcc -static -g main.c square.s

その後

qemu-arm a.out

「/lib/ld-linux.so.3が見つかりません」というエラーは報告されません。

唯一の欠点は、実行可能ファイルのサイズが大きくなる可能性があることです。ただし、コードをテストするだけの場合に役立ちます。

もちろん、Balauの方法を使用することもできます(アートレスノイズの回答を参照)。ただし、この手順で「UARTシリアルポート」などの単純な「テスト」機能を実行するだけでイライラしたくない場合は、私の修正を試してください。

11
Ning
$ export QEMU_LD_PREFIX=/usr/arm-linux-gnueabi

これでうまくいきます。基本的には次のものと同じです。

$ qemu-arm -L /usr/arm-linux-gnueabi/

ターミナルを開くたびに入力する必要がないように、〜/ .bashrcファイルに追加できます。

9
Mita_

次のライブラリを/ libにコピーして問題を解決しましたが、私が発明したこの厄介な解決策よりも、もっと良い解決策があるはずです。

Sudo cp  /usr/arm-linux-gnueabi/lib/ld-linux.so.3 /lib
Sudo cp /usr/arm-linux-gnueabi/lib/libgcc_s.so.1 /lib
Sudo cp /usr/arm-linux-gnueabi/lib/libc.so.6 /lib

私が知りたいので、他にもっと良い解決策があるかどうか教えてください。

5
Mona Jalal

バリアントは、私にとってはうまくいきましたが、ローダーライブラリを直接渡し、ローダーパラメーター--library-pathを使用して必要なライブラリパスを指定することでした。例えば:

$ TOOLCHAIN_ROOT=/usr/local/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/arm-linux-gnueabihf
$ qemu-arm $TOOLCHAIN_ROOT/libc/lib/ld-linux-armhf.so.3 --library-path $TOOLCHAIN_ROOT/libc/lib/arm-linux-gnueabihf:/$TOOLCHAIN_ROOT/lib ./my_executable

または、LD_LIBRARY_PATHを使用する代わりに、--library-pathを同等にエクスポートします。

0
nucleon