json-c库交叉编译时报错
- 关注点
- 错误出现的场景
- 错误描述
- 解决办法
- 为啥?
- 原因分析
- 解决步骤
- 总结
- 怎么看出来的?
- 哦!get新知识
关注点
看文章前,我先告诉你重点,给我死死盯准文章里的EM: 3 !!!!!!!!!!!!!!!!!
错误出现的场景
./autogen.sh
./configure --host=arm-linux CC=arm-linux-gcc --prefix=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/
都没报错,
make的时候就报错
错误描述
d: .libs/linkhash.o: Relocations in generic ELF (EM: 3)
/opt/FriendlyARM/toolschain/4.4.3/lib/gcc/arm-none-linux-gnueabi/4.4.3/…/…/…/…/arm-none-linux-gnueabi/bin/ld:
.libs/linkhash.o: Relocations in generic ELF (EM: 3)
.libs/linkhash.o: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
make[1]: *** [libjson.la] 错误 1
make[1]: Leaving directory `/home/FriendlyArm/json-c-master’
make: *** [all] 错误 2
解决办法
make clean一下
为啥?
错误信息表明在链接过程中遇到了架构兼容性问题。尽管你已经使用 configure 指定了正确的交叉编译器和主机类型,但仍然在构建 json-c 库时遇到了问题。错误中指出 .libs/linkhash.o 文件是为不同的架构编译的,其 ELF(Executable and Linkable Format)头部标识(EM: 3)表示它是为 Intel 80386 架构编译的,这与目标 ARM 架构不兼容。
原因分析
构建过程中的文件混淆:可能在之前的构建中生成的 .o 文件没有被清理,或者在配置过程中某些环境设置导致错误地使用了默认的编译器而不是交叉编译器 arm-linux-gcc。
解决步骤
- 彻底清理构建环境:
在重新构建之前,运行 make clean 或更彻底地删除构建目录下的所有生成文件,确保没有旧的或为错误架构编译的文件残留。
make clean或者
rm -rf .libs *.o
- 重新运行 autogen 和 configure:
确保 autogen.sh 和 configure 脚本没有遗漏任何配置步骤。特别注意 configure 命令中的参数是否正确传递给了构建系统。
./autogen.sh
./configure --host=arm-linux --prefix=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/ CC=arm-linux-gcc
- 监控编译过程:
在运行 make 时,仔细观察是否有任何提示可能指向编译器配置错误或使用了错误的编译器。有时 configure 脚本可能正确配置了初始设置,但实际编译过程中可能由于路径或环境变量设置问题使用了错误的工具。
4. 检查环境变量:
确保 PATH 环境变量中交叉编译器的路径优先级高于系统默认的编译器路径。
export PATH=/opt/FriendlyARM/toolschain/4.4.3/bin:$PATH
- 确认 make 使用的编译器:
你可以在 make 命令中添加 V=1(或在某些Makefile中可能是 VERBOSE=1),以显示更多编译和链接过程的详细信息:
make V=1
这将帮助你验证是否真正使用了 arm-linux-gcc 作为编译器。
- 重新审查 configure 日志:
检查 config.log 文件以确认 configure 脚本是否真正识别并配置了所有的参数,尤其是交叉编译器相关的设置。
总结
二进制文件架构不兼容,生成的二进制文件不适合目标ARM环境。
怎么看出来的?
.libs/linkhash.o 文件是为 Intel 80386 架构编译的结论,主要是基于错误信息中的 EM: 3 标记。在 ELF (Executable and Linkable Format) 文件头部,EM 代表机器类型,是用于区分文件是为哪种处理器架构编译的。EM: 3 对应于 ELF 标准中定义的 EM_386,表示这个文件是为 32 位 Intel 80386 CPU 架构编译的。
在处理交叉编译问题或编译错误时,识别出文件是为错误的处理器架构编译的是解决编译错误的关键步骤。这通常意味着编译时使用的编译器不是为目标平台配置的,可能是由于配置错误、环境变量设置不当或其他原因导致默认编译器被错误使用。
这种情况在使用交叉编译环境时尤其常见,例如,如果你正在为 ARM 处理器编译,但是构建系统错误地使用了为 x86 架构配置的编译器,就会出现类似的错误。
要验证这一点,可以使用 file 命令检查 .o 文件的架构,如:
file .libs/linkhash.o
这将返回文件的详细信息,包括它是为哪种架构编译的。如果结果显示是为非 ARM 架构编译,这就确认了问题所在,并且需要调整编译器设置或修正交叉编译配置以确保使用正确的编译器。
哦!get新知识
make中的 EM: 3一般就代表架构不兼容,你window系统上的文件肯定不能直接兼容Linux系统吧