提供目前我解决的思路,肯定不全,欢迎补充。
先看报错:
make: /**/toolchain/zxic/usr/bin/arm-linux-gcc: 没有那个文件或目录
这里我用了绝对路径,所以和有没有添加环境变量没什么关系(我觉的一般交叉编译工具的依赖也不会说要自己单独添加到环境变量吧)
解决思路
1、查看权限
ls -l /**/toolchain/zxic/usr/bin/arm-linux-gcc
返回结果(有些不重要信息省略了,下面示例都一样):
lrwxrwxrwx 1 ... /**/toolchain/zxic/usr/bin/arm-linux-gcc -> toolchain-wrapper
我这还是个软连接,这种情况下也要查看一下toolchain-wrapper是不是也在并且有相应权限
ls -l /**/toolchain/zxic/usr/bin/toolchain-wrapper
返回结果:
-rwxrwxr-x 1 ... /**/toolchain/zxic/usr/bin/toolchain-wrapper
2、查看依赖
ldd /**/toolchain/zxic/usr/bin/toolchain-wrapper
返回结果:
不是动态可执行文件
在这里我一开是就很疑惑,怎么会不是可执行文件呢,于是我换了个命令查询
readelf -d /**/toolchain/zxic/usr/bin/toolchain-wrapper
返回结果:
Dynamic section at offset 0x10c8 contains 21 entries:
标记 类型 名称/值
0x00000001 (NEEDED) 共享库:[libc.so.6]
0x0000000c (INIT) 0x80485e0
0x0000000d (FINI) 0x8048dc8
0x00000004 (HASH) 0x8048148
0x6ffffef5 (GNU_HASH) 0x80481f8
0x00000005 (STRTAB) 0x80483b8
0x00000006 (SYMTAB) 0x8048228
0x0000000a (STRSZ) 268 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000015 (DEBUG) 0x0
0x00000003 (PLTGOT) 0x804a19c
0x00000002 (PLTRELSZ) 160 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0x8048540
0x00000011 (REL) 0x8048528
0x00000012 (RELSZ) 24 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x6ffffffe (VERNEED) 0x80484f8
0x6fffffff (VERNEEDNUM) 1
0x6ffffff0 (VERSYM) 0x80484c4
0x00000000 (NULL) 0x0
看NEEDED那一行的结果说明需要依赖libc.so.6这个库,下一步查询这个库
ldconfig -p | grep libc.so.6
返回结果:
libc.so.6 (libc6,x86-64, OS ABI: Linux 3.2.0) => /lib/x86_64-linux-gnu/libc.so.6
3、看类型
据readelf的结果表示有这个依赖库,那为什么ldd没找到,于是我查询了编译器类型
file /**/toolchain/zxic/usr/bin/toolchain-wrapper
返回结果:
/**/toolchain/zxic/usr/bin/toolchain-wrapper: ELF 32-bit LSB /
executable, Intel 80386, version 1 (SYSV), /
dynamically linked, interpreter /lib/ld-linux.so.2, /
for GNU/Linux 2.6.9, stripped
问题就出在这里,交叉编译器是32位的可执行文件,但我的系统是64位的,所以ldd返回错误的原因应该就是缺少相应支持的32位库,所以不能正常解析这个文件,解决办法: