如何针对Linux位置无关可执行程序(PIE)正确使用addr2line工具?
处理PIE程序调用栈地址与Windows模块地址的调试方法
Linux下为PIE程序使用addr2line转换调用栈地址
位置无关可执行程序(PIE)加载时会被分配随机的内存基地址,调用栈里的原始地址是虚拟内存地址(VMA),必须先转换为相对虚拟地址(RVA)才能用addr2line解析:
- 获取程序加载基地址:
- 找到目标进程的PID,执行
cat /proc/<pid>/maps,找到对应可执行文件的内存映射行,取第一列的起始地址(例如55a1b3c00000-55a1b3c21000中的55a1b3c00000)。 - 也可以用gdb附加进程后,执行
info proc mappings查看加载基地址。
- 找到目标进程的PID,执行
- 计算相对虚拟地址(RVA):用调用栈里的原始地址减去基地址,得到RVA(例如原始地址
55a1b3c01456,基地址55a1b3c00000,RVA为0x1456)。 - 调用addr2line解析:指定可执行文件并传入RVA,确保编译程序时加了
-g调试参数:addr2line -e ./your_pie_executable 0x1456
Windows下对应地址转换方法
Windows中调试带.pdb符号的程序时:
- 先通过调试工具(如Windbg、Process Explorer)获取目标模块的加载基地址。
- 将调用栈中的原始地址减去模块基地址,得到的相对地址即可直接被.pdb文件识别,之后用调试工具(比如Windbg的
ln命令)就能定位到对应的代码行。
内容的提问来源于stack exchange,提问作者Myria
相关产品推荐
相关产品推荐

