编译x86_64平台Xen hypervisor始终生成32位ELF可执行文件问题
问题场景
在x86_64架构的Ubuntu 22.04主机上,使用qemu-system-x86_64模拟x86_64环境,编译Xen 4.17版本源码时,执行./configure x86_64和make dist-xen XEN_TARGET_ARCH=x86_64后,生成的xen二进制文件始终为32位版本,不符合预期。
编译后二进制文件信息(翻译后):
xen/xen: ELF 32位LSB可执行文件,Intel 80386架构,版本1(SYSV),静态链接,BuildID[sha1]=c89a133d28ae630dfed7ab0d5d6bdde483e932ce,已去除符号表
排查与解决步骤
检查configure阶段输出
执行./configure x86_64后,查看输出日志,确认是否存在Target architecture: x86_64的提示。同时确保已安装x86_64编译所需的依赖包,比如gcc-multilib、libc6-dev-amd64等,避免因依赖缺失导致构建降级到32位。修正configure参数格式
Xen的configure命令对目标架构的正确指定方式并非直接传入x86_64,正确写法为:./configure --target=x86_64-unknown-linux-gnu或者直接执行
./configure(主机为x86_64时,脚本默认会检测并使用64位目标架构)。清理编译残留后重新构建
先彻底清理之前的编译生成文件和配置缓存:make distclean再重新执行配置与编译:
./configure make dist-xen XEN_TARGET_ARCH=x86_64补充指定架构参数
部分Xen 4.17的构建脚本中,XEN_ARCH参数也会影响目标架构,可尝试同时指定:make dist-xen XEN_ARCH=x86_64 XEN_TARGET_ARCH=x86_64确认依赖完整性
确保Ubuntu 22.04上已安装Xen 4.17编译所需的全部依赖:sudo apt install build-essential libssl-dev libncurses5-dev libyajl-dev uuid-dev libc6-dev-amd64
内容的提问来源于stack exchange,提问作者user2679476

