如何为libc安装调试信息以在调试qemu时查看glibc源码?
glibc 调试信息配置方案
- 不需要替换当前系统正在运行的release版libc,也不需要重新编译qemu。仅安装和当前系统libc版本完全匹配的独立调试符号包,就可以在gdb调试时加载对应符号、查看libc源码。
- 调试符号包是独立于运行时libc二进制的文件,仅存储函数符号、源码行映射、调试段信息,存放在gdb默认搜索的独立调试路径下,不会和系统运行用的libc文件产生冲突,也不会影响现有程序的正常运行。
- 对Debian/Ubuntu类发行版,直接通过包管理器安装
libc6-dbg即可。需要保证安装的调试符号版本和当前系统的libc版本完全一致,否则gdb无法正确匹配符号。安装完成后gdb会自动识别对应调试符号,调试时遇到libc_csu_init这类libc内部函数,就可以直接跳转到对应源码位置单步执行,完全不需要改动qemu的编译配置。
ldd 输出的认知校正
- 你的认知是完全正确的:程序确实是基于glibc编译的。
/lib/x86_64-linux-gnu/是Debian/Ubuntu发行版x86_64架构下glibc的标准存放路径,musl、uClibc等其他C链接库都不会部署在这个路径下。 - 补充说明:你调试的
qemu-system-aarch64是运行在x86_64主机上的模拟器进程,它本身链接主机侧的x86_64版本glibc是完全符合预期的,和它所模拟的aarch64目标客户机架构没有关系。
调试实操提示
- 你对
libc_csu_init功能的推测基本准确,该函数会在main执行前完成全局静态构造函数调用、线程局部存储初始化、静态变量初始化等流程,单步调试时可以清晰看到整个初始化链路的调用顺序。 - 安装完调试符号包后,可以在gdb中执行
info sharedlibrary libc确认libc符号是否被正确加载。如果gdb未自动识别,可手动执行add-symbol-file /usr/lib/debug/lib/x86_64-linux-gnu/libc.so.6加载对应调试符号。 - 想要追踪main函数执行前的glibc初始化流程时,可使用gdb的
starti参数启动调试,让程序停在最开始的第一条指令处,即可直接单步追踪libc_csu_init等初始化函数的执行逻辑。
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

