組み込みのLinuxの開発で時々ある話。
まっさらの仮想マシン(ubuntu 16.04) にビルド環境をセットアップしようとしたら、SoCベンダーの提供するバイナリのツールチェインが動かない。
実行ファイルは確かに存在するのに、なぜか No such file or directory ??
$ ls -l ./arm-xxxxx-linux-gnueabi-gcc
-rwxr-xr-x 1 root root 1897163 Jan 25 03:36 ./arm-xxxxx-linux-gnueabi-gcc
$ ./arm-xxxxx-linux-gnueabi-gcc
-bash: ./arm-xxxxx-linux-gnueabi-gcc: No such file or directory
これは32bit x86用のバイナリだった
$ file ./arm-xxxxx-linux-gnueabi-gcc
./arm-xxxxx-linux-gnueabi-gcc: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.9, not stripped
ldd で共有ライブラリのリストが見られない
$ ldd ./arm-xxxxx-linux-gnueabi-gcc
not a dynamic executable
$
$ ls /lib/ld-linux.so.2
ls: cannot access '/lib/ld-linux.so.2': No such file or directory
わかった。32bit用の共有ライブラリが入っていないからだ。
32bit用の共有ライブラリをインストールする
$ sudo apt-get install lib32stdc++6 lib32z1
この2つを入れれば芋づる式に必要なファイルはほとんど入るはず。
$ ldd ./arm-xxxxx-linux-gnueabi-gcc
linux-gate.so.1 => (0xf7f16000)
libstdc++.so.6 => /usr/lib32/libstdc++.so.6 (0xf7d94000)
libm.so.6 => /lib32/libm.so.6 (0xf7d3f000)
libgcc_s.so.1 => /usr/lib32/libgcc_s.so.1 (0xf7d22000)
libc.so.6 => /lib32/libc.so.6 (0xf7b6e000)
/lib/ld-linux.so.2 (0xf7f18000)
今度は共有ライブラリのリストが見られるようになった。
$ ./arm-xxxxx-linux-gnueabi-gcc
arm-xxxxx-linux-gnueabi-gcc: fatal error: no input files
compilation terminated.
実行できるようになった。