gpt4 book ai didi

c - 使用 DWARF 全局变量的位置(和重定位)

转载 作者:行者123 更新时间:2023-12-02 03:06:59 27 4
gpt4 key购买 nike

当动态链接二进制文件和库时,重定位信息用于绑定(bind)不同 ELF 对象的变量/函数。然而 DWARF 不受重定位的影响:调试器应该如何解析全局变量?

假设我有 liba.so (a.c) 定义了一个全局变量(使用带有 GCC 或 Clang 的 GNU/Linux):

#include <stdio.h>

int foo = 10;

int test(void) {
printf("&foo=%p\n", &foo);
}

和一个链接到 liba.so 的程序 b (b.c):

#include <stdio.h>

extern int foo;

int main(int argc, char** argv) {
test();
printf("&foo=%p\n", &foo);
return 0;
}

我期望“foo”将在liba.so中实例化但实际上它在 liba.so 和 b 中都被实例化:

$ ./b 
&foo=0x600c68 # <- b .bss
&foo=0x600c68 # <- b .bss

使用的 foo 变量(b 和 lib.so 都使用)位于 b 的 .bss 中而不是在 liba.so 中:

[...]
0x0000000000600c68 - 0x0000000000600c70 is .bss
[...]
0x00007ffff7dda9c8 - 0x00007ffff7dda9d4 is .data in /home/foo/bar/liba.so
0x00007ffff7dda9d4 - 0x00007ffff7dda9d8 is .bss in /home/foo/bar/liba.so

foo 变量被实例化两次:

  • 一次在liba.so中(与程序b链接时不使用该实例)

  • 在 b 中一次(此实例在 b 中使用另一个实例)。

(我真的不明白为什么在可执行文件中实例化变量。)

DWARF 信息中的 b 中只有一个声明(如预期):

$ readelf -wi b
[...]
<1><ca>: Abbrev Number: 9 (DW_TAG_variable)
<cb> DW_AT_name : foo
<cf> DW_AT_decl_file : 1
<d0> DW_AT_decl_line : 3
<d1> DW_AT_type : <0x57>
<d5> DW_AT_external : 1
<d5> DW_AT_declaration : 1
[...]

并且在liba.so中找到了一个位置:

$ readelf -wi liba.so
[...]
<1><90>: Abbrev Number: 5 (DW_TAG_variable)
<91> DW_AT_name : foo
<95> DW_AT_decl_file : 1
<96> DW_AT_decl_line : 3
<97> DW_AT_type : <0x57>
<9b> DW_AT_external : 1
<9b> DW_AT_location : 9 bloc d'octets: 3 d0 9 20 0 0 0 0 0 (DW_OP_addr: 2009d0)
[...]

此地址是 liba.so (.data) 中 foo 的(未使用的)实例的位置。

  • 我最终得到 foo 全局变量的 2 个实例(在 liba.so 中,一个在 b 中);
  • 使用 DWARF 只能看到第一个;
  • 仅使用第二个。

调试器应该如何解析 foo 全局变量?

最佳答案

I don't really understand why the variable is instanciated in the executable.

你可以找到答案here .

How is the debugger supposed to resolve the foo global variable

调试器读取符号表(除了调试信息之外),并且foo 确实在主可执行文件中得到定义b,以及在 liba.so 中:

nm b | grep foo
0000000000600c68 B foo

关于c - 使用 DWARF 全局变量的位置(和重定位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21566282/

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