x86_64 Ubuntu18.04环境GCC生成ELF64程序无法执行、内核模块为ELF32问题咨询
问题根因与修复方案
应用程序运行失败修复
你编译hello程序时添加了-c参数,该参数作用是仅执行编译步骤、不进行链接,生成的hello文件是ELF格式的目标文件(.o文件),不是可执行程序,因此运行时会报Exec format error。
修复方式非常简单:去掉-c参数即可,正确编译命令如下:
gcc -o hello -v hello.c chmod +x hello ./hello
内核模块编译/加载异常修复
你遇到的内核模块格式异常和编译报错可以按以下步骤逐一修复:
- 修复自定义链接规则的架构配置:你的Makefile中自定义了
pcie.o: $(pcie_objs)的链接规则,直接调用系统默认ld命令,若环境中32位ld优先级高于64位ld、或是ld默认编译目标为32位,就会生成32位内核模块,加载时报ELF结构错误。将链接命令修改为指定64位架构的版本即可:ld -m elf_x86_64 -r $^ -o $@ - 修复
-m64参数编译报错:首先确认当前调用的gcc是否为优先级更高的32位版本,执行readelf -h $(which gcc)即可查看gcc本身的架构,若为32位,执行以下命令重装64位gcc:
编译模块前可以手动指定使用64位gcc:sudo apt install --reinstall gcc-7 x86_64-linux-gnu-gcc-7export CC=x86_64-linux-gnu-gcc-7 - 移除冗余编译参数:内核模块编译默认会继承当前运行内核的编译参数,不需要手动添加
-march=x86-64或者-m64参数,手动添加反而可能和内核自带的编译参数冲突,建议先删除EXTRA_CFLAGS里的-m64再编译。
GCC配置选项较长的说明
Ubuntu官方源提供的GCC默认开启了多架构支持、多语言支持、安全加固等特性,因此配置参数较长属于正常现象,和你当前遇到的问题无关。
内容的提问来源于stack exchange,提问作者Robert Hu
相关产品推荐
相关产品推荐

