gpt4 book ai didi

gdb - 如何从elf文件中提取函数原型(prototype)?

转载 作者:行者123 更新时间:2023-12-04 20:08:21 24 4
gpt4 key购买 nike

我没有成功找到这个问题的答案。

使用 GDB,我可以使用命令“调用”来获取函数的原型(prototype)。
例子:

(gdb) call fn
$1 = {void (int, int)} 0x8048414 <fn>

因此,GDB 只能从 elf 文件中找出 fn() 返回 void 并将两个整数作为参数。

但是,我需要使用其他工具从 elf 文件中提取函数原型(prototype)。最好,我想使用 objdump/readelf。

有谁知道这是否可能?
如果不可能,GDB是如何做到的?
函数原型(prototype)存储在 elf 文件的哪个部分?

最佳答案

GDB 通过 DWARF 知道函数的签名。调试信息。 readelf -w ELF会转储的。您可能想阅读 Introduction to theDWARF Debugging Format迈克尔 J. 渴望。使用 pyelftools您可以从交互式 Python session 中探索和试验 DWARF。

要提取函数原型(prototype),您需要 subprogram调试信息条目。 DWARF 格式教程中的一个示例是:

strndup.c

 1: #include "ansidecl.h"
2: #include <stddef.h>
3:
4: extern size_t strlen (const char*);
5: extern PTR malloc (size_t);
6: extern PTR memcpy (PTR, const PTR, size_t);
7:
8: char *
9: strndup (const char *s, size_t n)
10: {
11: char *result;
12: size_t len = strlen (s);
13:
14: if (n < len)
15: len = n;
16:
17: result = (char *) malloc (len + 1);
18: if (!result)
19: return 0;
20:
21: result[len] = '\0';
22: return (char *) memcpy (result, s, len);
23: }

strndup.c 的 DWARF 描述
<1>: DW_TAG_base_type
DW_AT_name = int
DW_AT_byte_size = 4
DW_AT_encoding = signed
<2>: DW_TAG_typedef
DW_AT_name = size_t
DW_AT_type = <3>
<3>: DW_TAG_base_type
DW_AT_name = unsigned int
DW_AT_byte_size = 4
DW_AT_encoding = unsigned
<4>: DW_TAG_base_type
DW_AT_name = long int
DW_AT_byte_size = 4
DW_AT_encoding = signed
<5>: DW_TAG_subprogram
DW_AT_sibling = <10>
DW_AT_external = 1
DW_AT_name = strndup
DW_AT_prototyped = 1
DW_AT_type = <10>
DW_AT_low_pc = 0
DW_AT_high_pc = 0x7b
<6>: DW_TAG_formal_parameter
DW_AT_name = s
DW_AT_type = <12>
DW_AT_location =
(DW_OP_fbreg: 0)
<7>: DW_TAG_formal_parameter
DW_AT_name = n
DW_AT_type = <2>
DW_AT_location =
(DW_OP_fbreg: 4)
<8>: DW_TAG_variable
DW_AT_name = result
DW_AT_type = <10>
DW_AT_location =
(DW_OP_fbreg: -28)
<9>: DW_TAG_variable
DW_AT_name = len
DW_AT_type = <2>
DW_AT_location =
(DW_OP_fbreg: -24)
<10>: DW_TAG_pointer_type
DW_AT_byte_size = 4
DW_AT_type = <11>
<11>: DW_TAG_base_type
DW_AT_name = char
DW_AT_byte_size = 1
DW_AT_encoding =
signed char
<12>: DW_TAG_pointer_type
DW_AT_byte_size = 4
DW_AT_type = <13>
<13>: DW_TAG_const_type
DW_AT_type = <11>

如需更完整的示例实现,请查看 this C reflection library通过彼得马查塔。它具有执行以下注意事项的代码:
  • 反射在进程内而不是像 GDB 那样在进程外运行
  • 这取决于 libdwlibdwfl来自 elfutils .不确定您对增加这些外部库依赖项有何感受。
  • 关于gdb - 如何从elf文件中提取函数原型(prototype)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22500296/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com