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这个内容没有.地址在哪里?
首先我读了地址是.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是小端.