Linux
GCC
embedded

バイナリでもらってきたツールチェインがx86_64の環境で動かないとき、それは32bitのライブラリが無いためかも

組み込みの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.

実行できるようになった。