分类: C/C++
2008-12-25 16:26:20
节头部表 |
.strtab |
.line |
.debug |
.rel.data |
.rel.text |
.symtab |
.bss |
.data (3) |
.rodata |
.text (1) |
ELF头 |
节 |
含义 |
.text |
已编译程序的机器代码 |
.rodata |
只读数据,如pintf和switch语句中的字符串和常量值 |
.data |
已初始化的全局变量 |
.bss |
未初始化的全局变量 |
.symtab |
符号表,存放在程序中被定义和引用的函数和全局变量的信息 |
.rel.text |
当链接器吧这个目标文件和其他文件结合时,.text节中的信息需修改 |
.rel.data |
被模块定义和引用的任何全局变量的信息 |
.debug |
一个调试符号表。 |
.line |
原始C程序的行号和.text节中机器指令之间的映射 |
.strtab |
一个字符串表,其内容包含.systab和.debug节中的符号表 |
#include
#include
#include
int z = 9;
int a;
static int b =10;
static int c;
void swap(int* x,int* y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
int main()
{
int x=4,y=5;
swap(&x,&y);
printf(“x=%d,y=%d,z=%d,w=%d\n”,x,y,z,b);
return 0;
} |
变量 |
存储区域 |
a |
.bss |
b |
.data |
c |
.bss |
x |
stack |
y |
stack |
temp |
stack |
z |
.data |
swap |
.text |
main |
.text |
x=…… |
.rodata |
.file "var.c"
.globl z
.data #数据段
.align 4
.type z, @object
.size z, 4
z:
.long 9
.align 4
.type b, @object
.size b, 4
b:
.long 10
.text #代码段
.globl swap
.type swap, @function
swap:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movl (%eax), %eax
movl %eax, -4(%ebp)
movl 8(%ebp), %edx
movl 12(%ebp), %eax
movl (%eax), %eax
movl %eax, (%edx)
movl 12(%ebp), %edx
movl -4(%ebp), %eax
movl %eax, (%edx)
leave
ret
.size swap, .-swap
.section .rodata #只读段
.LC0:
.string "x=%d,y=%d,z=%d,w=%d\n"
.text #代码段
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $40, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
movl $4, -4(%ebp)
movl $5, -8(%ebp)
leal -8(%ebp), %eax
movl %eax, 4(%esp)
leal -4(%ebp), %eax
movl %eax, (%esp)
call swap
movl b, %eax
movl %eax, 16(%esp)
movl z, %eax
movl %eax, 12(%esp)
movl -8(%ebp), %eax
movl %eax, 8(%esp)
movl -4(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
movl $0, %eax
leave
ret
.size main, .-main
.comm a,4,4
.local c
.comm c,4,4
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.3.5 (Debian 1:3.3.5-13)" |
字段名 |
含义 |
Num |
序号 |
Value |
符号地址。
可重定位目标文件:距定义目标文件的节的起始位置的偏移
可执行目标文件:一个绝对运行的地址 |
Size |
目标的大小 |
Type |
要么是数据,要么是函数,或各个节的表目 |
Bind |
符号是全局的还是本地的 |
Vis |
目前还没有查到资料,待以后改正 |
Ndx |
通过索引来表示每个节
ABS:不该被重定位的符号
UND:代表未定义的符号(在其他地方定义)
COM:未初始化的数据目标 |
Name |
指向符号的名字 |
……
.comm a,4,4
.local c
.comm c,4,4
…… |