使用gcc-12.1.0编译glibc-2.19遇movq操作数大小不匹配错误求助
解决gcc-12.1.0编译glibc-2.19时的
movq操作数大小不匹配错误 错误根源
这个错误的核心是新版本gcc(12.1.0)与旧版本glibc(2.19)的汇编语法兼容性冲突:
- glibc-2.19的
libc-start.c第200行使用了旧的内联汇编写法,依赖gcc旧版本的宽松语法检查; - gcc-12.x对汇编语法的严格性大幅提升,配套的GNU汇编器(gas)也更新了语法规则,导致原本在旧gcc下合法的
movq指令被判定为操作数大小不匹配; - glibc-2.20已经修复了该内联汇编的兼容性问题,因此可以正常编译。
解决办法
1. 降级编译器(最稳妥方案)
glibc-2.19的官方支持编译器版本范围是gcc 4.8~5.x,降级到该区间的gcc版本(比如gcc 5.5)可以直接解决兼容性问题,无需修改代码。
2. 给glibc-2.19打补丁
参考glibc-2.20的对应代码修改libc-start.c第200行的内联汇编:
原代码(glibc-2.19):
asm volatile ("movq %%rax, %%fs:%P1" : : "a" (pd), "i" (offsetof (tcbhead_t, pointer)));
修改为兼容新gcc的写法(参考glibc-2.20的实现):
asm volatile ("movq %%rax, %%fs:%c1" : : "a" (pd), "i" (offsetof (tcbhead_t, pointer)));
修改后重新执行配置和编译流程即可。
3. 尝试兼容编译选项
可以尝试给gcc添加-fno-asynchronous-unwind-tables或-mno-red-zone等旧兼容选项,部分场景下可以绕过语法检查,但该方案不保证100%有效。
glibc编译错误调试思路
- 版本兼容性核查:先确认目标glibc版本支持的编译器范围(可通过glibc官方发布文档或README获取),避免用超版本的编译器编译旧glibc;
- 定位核心代码:通过错误行号找到对应的代码片段,重点关注内联汇编、宏定义这类依赖编译器/汇编器语法的部分;
- 对比成功版本:将出错版本与同系列可正常编译的版本(如本例的glibc-2.20)的对应代码做diff,定位修复点;
- 查看详细编译日志:执行
make V=1输出完整编译命令,检查是否有不兼容的编译选项传递给gcc; - 启用调试模式:配置glibc时添加
--enable-debug参数,编译后保留更多调试信息,便于分析汇编生成过程; - 查阅官方bug库:访问GNU glibc的bugzilla平台,搜索是否有同类兼容性问题报告及官方补丁。
内容的提问来源于stack exchange,提问作者sangeetha
相关产品推荐
相关产品推荐

