You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无源码时如何用GDB定位未被main调用的函数内存地址?

用GDB查找未被引用的函数foo1的内存地址

情况1:可执行文件未剥离符号表(保留符号信息)

这是最直接的场景,直接利用符号表定位:

  • 执行info functions:会列出所有全局函数,在列表里找到foo1,对应行开头就是它的内存地址。
  • 或直接执行print &foo1:GDB会直接输出foo1的内存地址。
  • 如果函数名带前缀/命名空间,用通配符匹配:info functions *foo1* 或 print &*foo1*。

情况2:可执行文件已被剥离符号表(无符号信息)

此时需要通过函数的汇编特征扫描代码段(.text段):

  1. 先用info files获取.text段的起始和结束地址(输出中会显示.text对应的0xXXXXXX到0xYYYYYY范围)。
  2. 利用GDB Python API扫描.text段,查找x86/x86_64平台下函数的典型起始特征(通常是push rbp; mov rbp, rsp,对应字节序列0x55 0x48 0x89 0xe5):
    在GDB中输入python进入Python交互模式,执行以下代码(替换start_addr和end_addr为你的.text段实际范围):
    start_addr = 0x400500  # 替换为你的.text段起始地址
    end_addr = 0x400800    # 替换为你的.text段结束地址
    func_start_sig = b'\x55\x48\x89\xe5'  # x86_64函数开头特征
    
    current = start_addr
    while current < end_addr:
        try:
            # 读取当前地址的4字节数据
            mem_data = gdb.selected_inferior().read_memory(current, len(func_start_sig))
            if mem_data == func_start_sig:
                print(f"发现可疑函数起始地址:0x{current:x}")
                # 可选:反汇编该地址附近代码验证
                gdb.execute(f"disassemble 0x{current:x}, +32")
            current += 1
        except Exception:
            current += 1
    
  3. 对扫描出的可疑地址,用disassemble 地址查看汇编代码,结合你对foo1功能的预期(比如是否包含特定字符串、运算逻辑)判断是否为目标函数。

补充:关于你之前尝试的Python-GDB API用法

如果文件未被剥离符号表,正确使用lookup_global_symbol的方式是:

sym = gdb.lookup_global_symbol("foo1")
if sym:
    print(f"foo1的内存地址:0x{sym.value():x}")

之前你得到的内置方法输出,应该是未正确指定符号名导致的。

内容的提问来源于stack exchange,提问作者nastya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 20:42:03