.text段即为代码段,是存储指令的段,为防止在运行过程中指令被修改,该段是只读的
首先看下面的例子:
#include <stdio.h>
const int A = 10;
int a = 20;
static int b = 30;
int c;
int main(int argc, const char *argv[])
{
static int a = 40;
char b[] = "Hello world";
register int c = 50;
a = 10;
printf("Hello world %d\n", c);
return 0;
}
从readelf的输出可以看出.text段的地址:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[14] .text PROGBITS 08048390 000390 0001bc 00 AX 0 0 16
[16] .rodata PROGBITS 08048568 000568 00001c 00 A 0 0 4
[24] .data PROGBITS 0804a010 001010 000014 00 WA 0 0 4
[25] .bss NOBITS 0804a024 001024 00000c 00 WA 0 0 4
.text段在内存中的起始地址是0x08048390,我们用hexdump先看下这段。
0000390 ed31 895e 83e1 f0e4 5450 6852 84c0 0804
00003a0 d068 0484 5108 6856 8444 0804 a3e8 ffff
00003b0 f4ff 9090 9090 9090 9090 9090 9090 9090
00003c0 8955 53e5 ec83 8004 243d 04a0 0008 3f75
00003d0 28a1 04a0 bb08 9f18 0804 eb81 9f14 0804
00003e0 fbc1 8302 01eb d839 1e73 b68d 0000 0000
00003f0 c083 a301 a028 0804 14ff 1485 049f a108
0000400 a028 0804 d839 e872 05c6 a024 0804 8301
0000410 04c4 5d5b 8dc3 2674 8d00 27bc 0000 0000
0000420 8955 83e5 18ec 1ca1 049f 8508 74c0 b812
0000430 0000 0000 c085 0974 04c7 1c24 049f ff08
这些就是编译好的机器指令。