一.目标文件有三种类型:
1.可重定位目标文件
2.可执行目标文件
3.共享目标文件
本次试验要用到的代码:
1.main.c
2.sum.c
二.
(1)首先执行命令:gcc -c sum.c 得到 sum.o
然后执行命令:readelf -s sum.o得到符号表(这里因为没有链接所以 Value都为0)
Value:在对应节的偏移。
Size:目标的大小。
type:函数或变量。
Bind:表示全局变量还是局部变量。
Ndx:符号所在的节。
Name:符号的名字。
(2)执行gcc -h sum.o 得到 头结构表
Class:表示该elf文件的类型。
Data:表示文件中的数据的组织方式为大端还是小端。
Type:表示该文件的类型。REL表示该文件为可重定位目标文件。
Entry point address:程序的虚拟地址入口。
Start of program headers:程序头的开始处。
Start of section headers:段头的开始处。
(3)执行readelf -S sum.o 得到
首地址 节名称 Size
00000000 ELF头 0
00000040 .text 45
00000085 .rodata 0
00000085 .bss 0
00000085 .comment 36
000000bb .note.GUN -stack 0
000000c0. .eh_frame 38
000000f8 .symtab d8
000001d0 .strtab b
000001e0 .rela.eh_frame 18
000001f8 .shstrtab 54
(4)执行gcc -c main.c 得到 main.o
接着执行objdump -d main.o 得到
可以发现main无法找到sum的位置;而我们接着执行gcc -o prog main.c sum.c 得到 可执行文件prog
再输入objdump -d prog 得到
可以发现此时main中为08000000,可以找到sum的位置。