今天使用64位toolchain编译工程时,发现,toolchain依赖的共享库不存在,编译报错:
1 2 3 | herbert@Lenovo: /work/migration $ aarch64-buildroot-linux-gnu-cc test .c .. /libexec/gcc/aarch64-buildroot-linux-gnu/5 .3.0 /cc1 : error while loading shared libraries: libmpc.so.3: cannot open shared object file : No such file or directory |
查看toolchain的ELF头信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | herbert@Lenovo: /work/migration $ readelf aarch64-buildroot-linux-gnu-cc -h ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS /ABI : UNIX - System V ABI Version: 0 Type: EXEC (Executable file ) Machine: Intel 80386 Version: 0x1 Entry point address: 0x8048770 Start of program headers: 52 (bytes into file ) Start of section headers: 5032 (bytes into file ) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 8 Size of section headers: 40 (bytes) Number of section headers: 28 Section header string table index: 27 |
这个64位交叉编译器是32位的。而我的ubuntu系统是64位。使用ldd查看上述报错的cc1的依赖库:
1 2 3 4 5 6 7 8 9 10 11 | herbert@Lenovo: /work/migration $ ldd .. /libexec/gcc/aarch64-buildroot-linux-gnu/5 .3.0 /cc1 linux-gate.so.1 => (0xf778c000) libmpc.so.3 => not found libmpfr.so.4 => not found libgmp.so.10 => not found libdl.so.2 => /lib32/libdl .so.2 (0xf776a000) libstdc++.so.6 => /usr/lib32/libstdc ++.so.6 (0xf75f3000) libm.so.6 => /lib32/libm .so.6 (0xf759d000) libgcc_s.so.1 => /usr/lib32/libgcc_s .so.1 (0xf7580000) libc.so.6 => /lib32/libc .so.6 (0xf73cc000) /lib/ld-linux .so.2 (0x56563000) |
发现,依赖库找不到,然后定位 libmpc.so文件:
1 2 3 | herbert@Lenovo: /work/migration $ locate libmpc.so /usr/lib/x86_64-linux-gnu/libmpc .so.3 /usr/lib/x86_64-linux-gnu/libmpc .so.3.0.0 |
发现,只有64位版本。
在64位ubuntu上,安装32位的包,只要在包后面加":i386"即可:
1 | herbert@Lenovo: /work/migration $ sudo apt-get install libmpc-dev:i386 |
安装后,能顺利编译。