交叉工具链验证过程(本次验证过程是在ubuntu下进行的):
一、搭建交叉工具链的环境:
1.下载或者把自己编译的output目录下的包移植到另一个路径下(也可以不移植,直接在生成交叉工具链的目录下验证也可以),我的移植路径如下:
2. 修改环境变量:
修改环境变量,使用vi打开/etc/profile文件,命令如下:
sudo vi /etc/profile
然后把自己编译的bin路径添加进去,具体如下:
我的路径如下:
/home/chengzhixing/xingxing/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin:
所以我需要添加的环境变量是:
3. 保存退出,交叉编译工具链就安装完成了,但是添加的环境变量还没有立即生效。第一种,重启ubuntu系统环境变量修改生效;
第二种,输入如下命令立即生效:
source /etc/profile
二、写小程序进行验证:
1.查看交叉编译工具版本号,输入如下命令:
arm-linux-gnueabihf-gcc -v ,输出结果是:
此时gcc版本是4.9.4,正好与工具链中的gcc版本对应,工具链中的gcc版本如下:
2 编写一个测试程序,进行交叉工具链的验证,如下:
vi test.c
填写完后,进行报存并退出;
执行如下命令,进行编译、汇编、链接等进行验证:
arm-linux-gnueabihf-gcc test.c -o test
遇到如下问题;
(1)
这是因为一些链接符号权限不够导致,需要给编译链扩大权限:
chmod -Rf 777 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/
(2)
这个是因为一些软连接错误,需要重新建立软连接(直接重新解压下压缩包也可以解决);
(3)执行gcc命令后,可以生成可执行程序,但是无法运行,显示如下错误:
这是因为编译的工具链是aarch64架构的,但是主机确实x86_64架构的,所以会报格式错误;
解决方案一:生成x86_64的工具链进行验证;
然后再执行编译的程序,报错如下:
一般出现此问题,原因如下():
https://blog.csdn.net/pei327586354/article/details/119142039
- 文件本身不存在或者文件损坏
- 无执行权限 (chmod 777 xxx)
- 系统位数与程序位数不同
- 解释器不匹配或者找不到
针对问题三(系统位数与程序位数不同),使用如下命令查看系统与程序位数问题:
Uname -a 和 file ./main结果如下:
发现位数匹配,不是问题三导致的;
针对原因四,使用如下命令查看执行此程序(main)需要的解释器等信息:
readelf -a main | grep -i interp
此程序需要的解释器是:[Requesting program interpreter: /lib/ld-musl-x86_64.so.1]
平台的解释器是:[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
./usr/lib64/ld-linux-x86-64.so.2
解决方案:因为缺少相关的动态库,那就把相关动态库添加到相应目录下应该就可以;在添加之前需要使用如下命令查看下所需要的动态库是否有其他的软连接库:
执行:ls -al 结果如下:
从结果可以看出ld-musl-x86_64.so.1是有软连接到其他库的(libc.so);在usr/lib目录下查看,发现没有libc.so,结果如下:
备注:一般软连接符-> /lib/xxx ;这个表示当前这个lib目录一般在usr/lib目录下;
ln -s 源文件 目标文件
所以libc.so也需要拷贝到usr/lib目录下:
执行命令:sudo cp -r libc.so /usr/lib sudo cp -r ld-musl-x86_64.so.1 /usr/lib
sudo cp -r ld-musl-aarch64.so.1 /usr/lib
ld-musl-aarch64.so.1
执行结果,在usr/bin目录下可以看到如下结果:
把相应的库拷贝完成后,在运行程序,就能正常运行了:
注意:当把需要的库拷贝到相应的位置后,执行程序,可能会报Permission denied:
这是因为你这个程序依赖的库(比如libc.so权限不够,导致无法对其进行操作,从而导致程序无法执行);刚开始此库的权限如下:
那么就需要对此库进行相应的权限修改:chmod 777 libc.so:
解决方案二:使用静态方式链接库文件:命令如下:
x86_64-linux-musl-cc -static 11.c -o jing
解决方案三:在本机(x86_64架构系统上安装qemu,这个功能模拟处理器,使用它来模拟aarch64来处理aarch64架构生成的程序等,具体实现请看文档:如何使用QEMU在x86上模拟运行aarch64工具链生成的可执行程序_chengzhixingnihao的博客-CSDN博客)