刚入手了一块荔枝派Nano的板子,按照官方的教程好不容易把系统跑起来了,写一个最简单的程序"Hello word!",放到板子上一运行就"segmentation fault",完全不知道什么情况,即使烧官方搭建好的系统也一样,百度了好久都找不到答案,后来通过file命令查看该可执行文件得到:
print_test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=db8e6e41226ba13dc89fc5ebeaf8e8fa0a8ac0cd, with debug_info, not stripped
然后我就尝试file根文件系统下的busybox,得到:
busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.16, stripped
于是猜测是编译器版本的问题,编译应用程序的时候使用的编译工具应该是要和根文件系统的交叉编译工具一致才行,可我完全是按照官方教程做的呀,如果存在这么大的问题,为什么官方完全没有提及呢?
离线
链接的时候加 -static 命令, 静态链接解君愁.
静态编译也不行,运行后没有输出segmentation fault,变成Illegal instruction了
最近编辑记录 zhouyu2019 (2019-11-21 13:36:32)
离线
你用的是哪个gcc工具链?
我自己编译的系统:内核和应用程序都是用gcc-linaro-7.2.1编译,根文件系统没去配置工具链,直接用的官方的.config文件,工具链是它自己安装的,编译完能看到使用的工具链版本是7.3的。
官方的系统:内核用gcc-linaro-7.2.1编译,根文件系统和应用程序用什么版本的我不知道,反正我用gcc-linaro-7.2.1编译的应用程序在官方系统上也是一样不能用。
离线
gcc-linaro-7.2.1 下载的完整链接发一下,我看看问题在哪里
谢谢晕哥!这是工具链下载的完整链接: http://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
离线
这样啊,那就有点坑了,官方教程在编译uboot的时候让下载这个工具链,后面的内容也没说要用其它工具链来编译。
晕哥,那我到底应该用哪个工具链来编译呢?buildroot里面的那个工具链我试了确实就没问题了,但它又只有arm-linux-gcc,没有arm-linux-g++,不知道什么原因,好纠结。
离线
好的,我试一下
arm-linux-gnueabi-gcc --with-arch=armv4 --static
编译的时候, 加上这个指令试一试。
或者:
arm-linux-gnueabi-gcc --with-arch=armv5te --static
离线
谢谢晕哥,加了“-with-arch=armv4”或者“-with-arch=armv5te”都不行,提示没有这个选项,改成“-march=armv5te”倒是可以,但编译出来的可执行文件也运行不起来。
你发的这个工具链,是编译uboot、内核、根文件系统、应用程序都用这一个对吗?
离线
还可以直接在nano上直接使用gcc,不存在以上环境问题
这么厉害,还能在板子上编译程序,不过感觉不是很实用,哈哈。
离线