嵌入式linux交叉编译经验记录
·
嵌入式linux交叉编译有一段时间没有弄了,又入了之前已经处理过的坑。平常用的不多,时间久了就忘记了。现记录下来,备用查询。
一、编译的目标程序运行报错如下
cannot execute binary file:Exec format error
说明:当前目标程序和目标平台不匹配,不能在目标平台运行。
执行如下代码
file 目标程序
查看目标程序支持的平台,调用对应的编译器编译即可处理该问题。
二、编译的目标程序运行报错如下
-sh:./main:No such file or directory
说明:找不到对应文件,一般是缺少库文件。用file指令查看依赖的库。
file 目标程序
结果例子:
PC:~/work/test$ file main
main: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.0.8, BuildID[sha1]=5434c41e34c1f256c73a38ba8a95cfcc979f3e12, with debug_info, not stripped
在对应目录拷贝库文件或用ln -s建立软链接。
三、gcc编译器支持的cpu类型查看
arm-linux-gnueabi-gcc --help=target
四、make多核支持,加快速度
make -j4
4对应4核,make -j8对应8核
工作平台的动态连接器名称
工作平台的动态连接器名称也需要知道,这里指的是动态加载器(不要与 Binutils 里的标准连接器 ld 混淆了)。动态连接器由 Glibc 提供,用来找到并加载一个程序运行时所需的共享库,在做好程序运行的准备之后,运行这个程序。动态连接器的名称通常是 ld-linux.so.2 ,在不怎么流行的平台上则可能是 ld.so.1 ,而在新的 64 位平台上更可能是别的完全不同的名称。查看宿主系统的 /lib 目录可以确定动态连接器的名称。确定这个名称还有一个必杀技,就是在宿主系统上随便找一个二进制文件,运行 readelf -l <二进制文件名> | grep interpreter 并查看输出的内容。涵盖所有平台的权威参考请查看 Glibc 源码根目录里的 shlib-versions 文件。
更多推荐

所有评论(0)