编译器C的全局变量,静态和字符串文字的地址在哪里?

The*_*ask 2 c linux 32-bit elf

首先我读了地址是.data和.text持有字符串文字(加上我想的机器代码)之后在其他文章中有人说它已经改变了,而更长的字符串文字存在于.text但是.rodata而不是(这是真的我的铿锵声)编译器输出).但.data内容与我在C程序中的printf地址不匹配.

假设这个C程序:

static int a;
int main()
{
    printf("my address = %p\n", &a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个C程序的输出:

 $ ./a.out
my address = 0x804a01c
Run Code Online (Sandbox Code Playgroud)

然后是.data部分的内容:

$ objdump -s -j .data a.out

a.out:     file format elf32-i386

Contents of section .data:
 804a00c 00000000 00000000 
Run Code Online (Sandbox Code Playgroud)

0x804a01c这个内容没有.地址在哪里?

Emp*_*ian 5

首先我读了地址是.data和.text持有字符串文字(加上我想的机器代码)之后在其他文章中有人说它已经改变了,而更长的字符串文字存在于.text但是.rodata而不是

由编译器决定放置字符串文字(不是机器代码)的位置.

大多数现代编译器都会将字符串文字放入.rodata段中,该PT_LOAD段通常链接到第一段.text,.ctors以及其他只读段.

此内容中没有0x804a01c.地址在哪里?

.bss.如果您想要a驻留.data,则需要对其进行初始化.例如

static int a = 42;
Run Code Online (Sandbox Code Playgroud)

例如,可以放入字符串文字.rodata并将其地址放入.data

当然:

cat t.c
const char string_literal[] = "abcdefgh";       // in .rodata
const char *p_string_literal = string_literal;  // in .data
int main() { return 0; }

gcc -m32 t.c
readelf -x.rodata a.out

Hex dump of section '.rodata':
  0x08048488 03000000 01000200 61626364 65666768 ........abcdefgh
  0x08048498 00
                                 .
readelf -x.data a.out

Hex dump of section '.data':
  0x0804a008 00000000 00000000 90840408          ............
Run Code Online (Sandbox Code Playgroud)

注:地址string_literal- 0x08048490在"倒退"拼写.data,因为86是小端.