Yocto 3.4编译glibc 2.34出现__dso_handle未定义链接错误如何解决
问题原因分析
该错误是glibc 2.34版本的原生编译bug,Yocto 3.4的官方glibc配方未合入对应修复补丁,触发逻辑如下:
- glibc 2.34重构malloc调试组件后,
mtrace-impl.c中调用__cxa_atexit注册销毁回调时,直接引用了__dso_handle符号 - 该符号默认由gcc在编译共享库时自动注入,但glibc编译
libc_malloc_debug_pic.a的规则中未添加对应编译参数,导致符号未生成 - 链接生成
libc_malloc_debug.so时,找不到该隐藏符号,同时x86_64架构下PIC代码的重定位类型不匹配,最终触发链接失败。
可行解决方案
可根据使用场景选择对应方案:
- 方案1:合并上游修复补丁。修改逻辑为将
mtrace-impl.c中__cxa_atexit调用的第三个参数从__dso_handle替换为&__libc_malloc_debug,该符号是libc_malloc_debug.so自身的导出符号,可完全替代__dso_handle的作用。在自定义层中创建recipes-core/glibc/glibc_2.34.bbappend文件,添加SRC_URI += "file://fix-mtrace-dso-handle.patch",将补丁放到对应配方的files目录下重新编译即可。 - 方案2:临时禁用malloc调试组件。如果不需要用到malloc调试能力,可直接在上述
glibc_2.34.bbappend中添加配置EXTRA_OECONF += "--disable-malloc-debug",编译时会跳过libc_malloc_debug.so的生成,不影响glibc核心功能的使用,改法最简单。 - 方案3:升级Yocto版本到4.0及以上,后续版本的官方glibc配方已经合入了该问题的修复补丁,无需额外修改即可正常编译。
内容的提问来源于stack exchange,提问作者Thảo M. Hoàng
相关产品推荐
相关产品推荐

