如何使用GDB获取共享库的基地址
GDB获取共享库基地址实操指南
下面是3种可直接落地的操作方法,按使用场景选择即可:
方法1:直接查询共享库加载信息(最常用)
这是最简单的原生命令,无需额外操作:
- 调试状态下(程序已启动并停在任意断点/
start之后),直接执行命令:info sharedlibrary或简写为info shared - 输出结果中第一列
From对应的地址就是目标共享库的基地址,示例输出如下:
(gdb) info shared From To Syms Read Shared Object Library 0x00007ffff7fc9000 0x00007ffff7fefadc Yes /lib64/ld-linux-x86-64.so.2 0x00007ffff7d81000 0x00007ffff7ee7170 Yes /lib/x86_64-linux-gnu/libc.so.6
上面示例中0x00007ffff7d81000就是libc库的基地址。
方法2:通过进程内存映射查询
如果需要更完整的内存段信息,可以用这个方法:
- 调试状态下执行命令:
info proc mappings - 找到对应共享库路径的内存段,权限为
r--p的第一段起始地址就是共享库基地址。
如果需要过滤特定库,可以配合shell命令,将其中$PID替换为当前调试进程的ID,libc替换为你要找的库名关键字即可:shell grep libc /proc/$PID/maps
示例输出:
(gdb) shell grep libc /proc/1234/maps 7f8a12345000-7f8a124c0000 r--p 00000000 103:02 123456 /usr/lib/x86_64-linux-gnu/libc.so.6
示例中7f8a12345000就是libc库的基地址。
方法3:脚本/自动化场景下获取
如果你需要把基地址存入GDB变量供后续调试逻辑使用,可以用如下方式:
以获取libc基地址为例,先获取__libc_start_main函数的运行时地址,减去该函数在libc中的静态偏移即可。静态偏移可以提前通过readelf -s /lib/x86_64-linux-gnu/libc.so.6 | grep __libc_start_main拿到,假设偏移为0x23ab0,执行:set $libc_base = (unsigned long long)__libc_start_main - 0x23ab0
后续直接调用$libc_base就能获取基地址数值。
注意事项
- 必须等待程序启动并完成动态链接后再查询,刚打开GDB程序还没运行时,共享库还未加载,查不到正确的地址。可以先执行
start命令让程序停在main函数入口后再执行查询操作。 - 开启ASLR的场景下,每次重启程序共享库的基地址都会变化,每次调试都要重新查询。
内容的提问来源于stack exchange,提问作者Kokomelom
相关产品推荐
相关产品推荐

