背景
运行交叉工具链却遇到问题,这种情况一般是在开发搭建环境的时候容易遇到的。
问题与解决
-
注意检查是不是 换了bash的原因
在Linux中我们经常使用 bash,但是有些人为了提高效率,换成了zsh,但是配置工具链的环境变量语句存在于 .bashrc ,与现在使用的shell无关。
如果是这种情况,在 对应的rc文件 添加环境变量即可。 -
权限切换以后环境变量换了
一般,我们配置环境变量的时候,root环境不会碰到;但是要是万一不小心切换到了root权限,可能也会有这样的问题。 - 如果遇到环境变量配置以后,能够找到版本(也就是说 输入 命令的开头按tab以后能够出现补全),如果还有问题,这是因为64位下运行32编译器缺少相应的库文件,所以运行时会报错
./arm-none-eabi-gcc
bash: ./arm-none-eabi-gcc: No such file or directory
那么只需要添加对于 32 位的环境即可:
sudo apt-get install lib32ncurses5 lib32z1
arm-linux- 各bin文件的作用
add2line :将你要找的地址转成文件和行号,它要使用 debug 信息。
ar :产生、修改和解开一个存档文件
as :gnu的汇编器
c++filt :C++ 和 java 中有一种重载函数,所用的重载函数最后会被编译转化成汇编的标,c++filt 就是实现这种反向的转化,根据标号得到函数名。
gprof :gnu 汇编器预编译器。
ld :gnu 的连接器
nm :列出目标文件的符号和对应的地址
objcopy :将某种格式的目标文件转化成另外格式的目标文件
objdump :显示目标文件的信息
ranlib :为一个存档文件产生一个索引,并将这个索引存入存档文件中
readelf :显示 elf 格式的目标文件的信息
size :显示目标文件各个节的大小和目标文件的大小
strings :打印出目标文件中可以打印的字符串,有个默认的长度,为4
strip :剥掉目标文件的所有的符号信息
arm-none-linux-gnueabi-cpp : gnu的 C 的预编译器
arm-none-linux-gnueabi-gcc : gnu的 C 语言编译器
arm-none-linux-gnueabi-gcc-4.3.5 : gnu的 C 语言编译器,其实和arm-linux-gcc是一样的
arm-none-linux-gnueabi-gccbug : 一个可执行脚本,具体作用未知。
arm-none-linux-gnueabi-gcov : gcc 的辅助测试工具,用来分析和优化程序
我们经常在执行二进制bin程序时,会遇到提示not found/no such file or directory/not executable等错误信息,在什么情况下会出现这种问题呢,我们一起罗列下几种常见的几种场景:
1.可执行bin程序确实不存在
这个错误就比较低级了,你的可执行bin没有打包或者拷贝进来,执行的时候,自然找不到了


2.可执行bin程序的路径不对

我们的bin不在$PATH包含的路径中,无法自动找到,则需要加上完整的路径执行
3.可执行程序bin为动态链接,且系统没有动态加载器


helloworld为动态链接,且系统没有/system/bin/linker
4.交叉编译器类型不相同


其中hello_world为x86编译的bin程序,无法在arm架构上运行
5.64位的bin程序运行在32位的系统


6.可执行程序bin为动态链接,缺少依赖的动态库


7.可执行程序bin存在,但是可执行bin为符合链接,源文件已经删除

8.可执行成bin存在,为动态链接,所依赖的动态库为符合链接,动态库链接的源文件已经删除


