实例分析ELF文件静态链接

时间:2023-03-09 02:19:08
实例分析ELF文件静态链接

参考文献:

《ELF V1.2》

《程序员的自我修养---链接、装载与库》第4章 静态链接

开发平台:

[thm@tang* static_link]$ uname -a
Linux tang* 2.6.-.el6.x86_64 # SMP Fri Feb :: UTC x86_64 x86_64 x86_64 GNU/Linux

1.ELF文件格式概貌

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcgAAAElCAIAAADvGeXhAAAAA3NCSVQICAjb4U/gAAAAGXRFWHRTb2Z0d2FyZQBnbm9tZS1zY3JlZW5zaG907wO/PgAAIABJREFUeJzt3XtAE2e2APAzBBEQBYEg8hCIUJCHojzkpRUNxQe0oNK6ZV11rVrZXrF62+LVrrqtpS9tkVvULVuL7pa2+ChKlBWVIkJAkacaAREETHgohHcSEub+MW1uFpIIZBSB8/sr+TJz5pvhcAjfzDdDkCQJCCGE6KM10h1ACKGxBgsrQgjRDAsrQgjRDAsrQgjRDAsrQgjRDAsrQgjRDAsrQgjRDAsrQgjRDAsrQgjRDAsrQgjRDAsrQgjRDAsrQgjRbOwX1tdee43NZre1tSk2Njc3s9ns7du3q1nx7t27bDb7448/7tc+mHWf6ujRo2w2OyUlRd7yr3/9i81mHz9+nJb4aJSi0rWflpaW57N1unIP01t7pDvwzGVlZbW1tfX29io2SiSSgoICbW11u9/e3n7lyhVTU9N+7YNZ96leeumlK1euTJw4MSIigmo5fvz4lStXDhw4QEt8NEpR6TplyhSCIOSN/bKXdlZWVg0NDVKplK7cw/Qe47uniqmpaXp6+uTJkwGgp6enpKTE0NDQysoqOzt70qRJAQEBDAZDcfne3t5bt24BgJeXl3xd9StWV1ffvn3b29tbJBIJBAJnZ+cpU6bIAy5cuNDMzOzq1avd3d36+vodHR3Xrl2ztbX19vaWSCTyvlEePHhw+/Ztc3NzT09PLS2tW7du9fb2ent7a2lp3b59u7Ozc86cOXp6ejwer62tzdXV1cDA4HkcRPTMPHz40MjISP62oqKiurp62rRpdnZ2HR0dd+7cAQAqAWBAelCrNDQ0FBQU6Ovr+/r66unpAQC1oqmpqb29PQDcv3//8ePHzs7OBEH09fWRJCkUCk1MTPrlnlAozM/Pl0ql3t7eTCYTBvf7Mvj0Htj5MZLe5FhnaGgIAM3NzYqNdXV1AODv70+SJI/HAwA3NzcrKyvqmCxatEgmk3G5XAB44403+vr63n77bQDYt2+f4rqqViRJMiEhgcoSQ0NDNpsNANnZ2f06tnXrVgBIS0sjSfLMmTMAEBMT069vfX19O3fulP+w/Pz8njx5snjxYgC4c+dOX1+fmZkZAKSnp5MkyWKxtLW129ransdhRc8Gla6tra2KjZcuXQIAGxsbkUj03nvvAcD69etJFelBkmRcXJz8K6GFhUVpaSlJklQ+R0ZGUjEjIyOptJwzZ448QnV1tTz3SJI8efKkvr4+9ZGOjk58fDyp+vel3448Nb1VdX5spDcW1t8SRUtL69ChQ2fPnrWwsACAvLw8eWGNi4sDgM2bN1N/2PsV1oErVldXa2trGxsb//zzz5988gmVNwML66+//goAb7/9NkmSb731FgAUFxf369vFixcB4LXXXquqqtq3bx8AbNq06fPPPweAv//979SvAQDs37+/qamJSvHnc1TRM0Klq62t7czfUTWUypD33ntPV1fX3Ny8paWFVJEePB6PIAgWi5WVlfXtt98CwOLFi0nVhbWystLMzExLS6usrKy2tlaee9XV1RMmTDAyMjp79iyHwzE3NycIorS0VFXa99uRp6a30s6TJDk20nvsn7wapICAgHfffTcsLCwkJAQAmpubqfYbN268++67dnZ233zzjeKwl5oVz507J5VKt2/fHhERsWvXrmXLlqnaorm5OYfDIUnywoULTk5Os2fP7rfML7/8AgD+/v4PHjyYP3++lpZWamrq0qVLASA3NzcvL09LS2vhwoX5+fn5+fkAoGpbaHQxUED9I//ll19aWlp+8cUXIpHoyJEjU6dOBRXpQWXUX/7yl4ULF7711ltxcXHqs8Le3n7ChAkEQbi6uipm+Llz53p7e6Ojo8PCwpYvX75r1y6SJKktgurfF7mnprfSzgPA2EjvcTrGOhCVvgAwYcIExXbq62d1dXVmZmZQUNBgVuTz+QDw0ksvUW/d3NyoP879MBiM1atX/+///u+//vUvPp+/efPmgYW7oaEBAGJiYqiPCIJ48uSJs7OzhYVFTk6OkZHR7NmzlyxZEh8fP3fuXPg9KdFol52drTjGCgCGhoavv/76V199NW3atOXLl1ONStODarS0tKSW2bZt2/D6QH1JpAZkAcDBwQEAGhsbqbeqfl/knpreSjvf19fn6uo6BtIbv7E+xezZsy9cuAAA0dHRgzw5a2xsDAAPHjyg3paXl6ta8o033gCA999/X/5aaSgulyuVSqVSaWdnZ2dnJ4PBWLp0aWVlJYfD8fPz8/b2fvz48U8//WRhYeHm5jbkPUSjwd27d7/55puJEyc2NjbGxsZSjUrTgxqXpP6p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" alt="" />

readelf -h 查看elf文件头部信息可以看到Type值有三种:REL,EXEC,DYN。

REL文件是只被编译没有被链接过的文件,其格式属于左边一种,elf header+section1,2,3...+section header table,每个section对应一个section header table entry,section header table为各个section提供索引。没有被链接过的文件没有program header,不能被加载到内存中运行,readelf -l会提示”There are no program headers in this file”。

EXEC和DYN文件属于被链接过的文件,其格式属于右边一种,elf header+program header table+segment1,2,3...+section header table。每个segment对应一个program header table entry,program header table为各个segment提供索引。EXEC和DYN文件有program headers,可以被加载到内存中运行,readelf -l可以看到一个segment是由一个或多个section构成,Type为LOAD的segment可以被加载到内存中运行,其他类型的segment提供辅助信息。

2.实例分析

(1)创建文件

创建文件common.c

int val = ; 

int func(void)
{
return (val+);
}

创建文件test.c

extern int val;
extern int func(void); int main()
{
val = ;
func();
return ;
}

(2)编译

编译两个.c文件

gcc -c test.c

gcc -c common.c

生成的test.o和common.o属于REL类型

来分析一下编译后生成的REL文件

(2.1)先看看test.o:

readelf -s test.o查看test.o的符号表

[thm@tang* static_link]$ readelf -s test.o 

Symbol table '.symtab' contains  entries:
Num: Value Size Type Bind Vis Ndx Name
: NOTYPE LOCAL DEFAULT UND
: FILE LOCAL DEFAULT ABS test.c
: SECTION LOCAL DEFAULT
: SECTION LOCAL DEFAULT
: SECTION LOCAL DEFAULT
: SECTION LOCAL DEFAULT
: SECTION LOCAL DEFAULT
: SECTION LOCAL DEFAULT
: FUNC GLOBAL DEFAULT main
: NOTYPE GLOBAL DEFAULT UND val
: NOTYPE GLOBAL DEFAULT UND func

因为val和func不是在test.c中定义的,所以这两个符号的Ndx(符号所在section的index)为UND。为了能让程序顺利执行,我们希望在未来链接的过程中可以从其他文件中找到val和func这两个符号,并确定这两个符号的地址,确定未定义符号的地址的过程即是“重定位”(relocation)。

readelf -S test.o可以看到test.o的section header table

[thm@tang* static_link]$ readelf test.o -S
There are section headers, starting at offset 0x128: Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ ] NULL [ ] .text PROGBITS
000000000000001a AX
[ ] .rela.text RELA [ ] .data PROGBITS 0000005c
WA
[ ] .bss NOBITS 0000005c
WA
[ ] .comment PROGBITS 0000005c
000000000000002d MS
[ ] .note.GNU-stack PROGBITS [ ] .eh_frame PROGBITS
A
[ ] .rela.eh_frame RELA [ ] .shstrtab STRTAB 000000c8 [] .symtab SYMTAB [] .strtab STRTAB Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

我们重点关注rela section。

可以看到rela.text entry的描述中,link=10,info=1,link表示被重定位的符号所在的符号表的section index,info表示需要被重定位的section的index,通俗点讲就是,将来有朝一日我知道了该符号的地址,我该把这个地址写到哪个section里面去,这里是.text。

readelf -r test.o可以看到rel section里的详细信息。

[thm@tang* static_link]$ readelf test.o -r 

Relocation section '.rela.text' at offset 0x548 contains  entries:
Offset Info Type Sym. Value Sym. Name + Addend
R_X86_64_PC32 val -
00000000000f 000a00000002 R_X86_64_PC32 func - Relocation section '.rela.eh_frame' at offset 0x578 contains entries:
Offset Info Type Sym. Value Sym. Name + Addend
R_X86_64_PC32 .text +

offset表示该符号在被重定位的section中的偏移,info的高4个字节表示该符号在.symtab中的index,低4字节表示重定位的类型,不同的类型计算目标地址的方法不一样。

综上所述,我们可以得出符号val和func的种种信息:

val的重定位地址是在.text的偏移为6处,将来的链接过程中,连接器要将val的地址写到这个位置上来,val在.symtab中的index为9。

func的重定位地址是在.text的偏移为f处,将来的链接过程中,连接器要将func的地址写到这个位置上来,func在.symtab中的为a。

关于重定位的类型,《ELF V1.2》的第57和93页有详细说明。

aaarticlea/png;base64,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" alt="" />

这里两个符号的类型 R_X86_64_PC32,重定位地址的计算方法为S+A-P,即符号地址和下条指令间的偏移量。

objdump -S test.o查看汇编文件

[thm@tang* static_link]$ objdump -S test.o 

test.o:     file format elf64-x86- 

Disassembly of section .text: 

 <main>:
: push %rbp
: e5 mov %rsp,%rbp
: c7 0a movl $0xa,0x0(%rip) # e <main+0xe>
b:
e: e8 callq <main+0x13>
: b8 mov $0x0,%eax
: c9 leaveq
: c3 retq

可以看到.text中偏移6处四个字节(val的地址)为全0,偏移f处四个字节(func的地址)为全0。

(2.2)再来看看common.o:

readelf -s查看common.o的符号表

......
: OBJECT GLOBAL DEFAULT val
: FUNC GLOBAL DEFAULT func

可以看到val定义在index为3的.data里,func定义在index为1的.text里,这两个符号都是在common.c文件内部定义的。

readelf -S查看common.o的section header table

......
[ ] .rela.text RELA ......

readelf -r查看common.o的重定位详细信息

Relocation section '.rela.text' at offset 0x528 contains  entries:
Offset Info Type Sym. Value Sym. Name + Addend
R_X86_64_PC32 val –
......

以上信息可以得出,需要被重定位的符号是val,它在.symtab中的index为8,需要被重定位的地址是在.text中偏移为6处,重定位类型为 R_X86_64_PC32,即.text偏移为6处的地址是val地址和下一条指令间的偏移。

Objdump -S查看common.o的汇编文件:

......
<func>:
: push %rbp
: e5 mov %rsp,%rbp
: 8b mov 0x0(%rip),%eax # a <func+0xa>
a: c0 0a add $0xa,%eax
d: c9 leaveq
e: c3 retq

可以看到偏移为6处的四个字节(val的地址)全为0,需要在链接的时候写入val的地址。

(3)链接

将两个.o文件链接,

gcc -o test test.o common.o

生成的test为EXEC类型

静态链接的过程引用《程序员的自我修养》第101页的概述:

第一步:空间与地址分配

扫描所有的输入目标文件,获得它们的各个段的长度、属性和位置,并且将输入目标文件中的符号表中所有的符号定义和符号引用收集起来,统一放到一个全局符号表。这一步中,连接器将能获得所有输入目标文件的段长度,并且将它们合并,计算出输出文件中各个段合并后的长度与位置,并建立映射关系。

第二步:符号解析与重定位

使用上面第一步中收集到的所有信息,读取输入文件中段的数据、重定位信息,并且进行符号解析与重定位、调整代码中的地址等。事实上第二步是链接过程的核心,特别是重定位的过程。

提取关键字可以是:合并段,全局符号表,重定位

来看看重定位之后的test文件

readelf -l查看test进程在内存中的映像分布:

......
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x0000000000000664 0x0000000000000664 R E
LOAD 0x0000000000000668 0x0000000000600668 0x0000000000600668
0x00000000000001e8 0x00000000000001f8 RW
......

可以看到text segment被映射到虚拟地址0x400000处,data segment被映射到虚拟地址0x600668处。

readelf test -s查看test的符号表

......
: 000000000060084c OBJECT GLOBAL DEFAULT val
......
: FUNC GLOBAL DEFAULT func
......
: FUNC GLOBAL DEFAULT main
......

反汇编

objdump -S test > test.S

......
<main>:
: push %rbp
: e5 mov %rsp,%rbp
: c7 ca 0a movl $0xa,0x2003ca(%rip) # 60084c <val>
40047f:
: e8 callq <func>
: b8 mov $0x0,%eax
40048c: c9 leaveq
40048d: c3 retq
40048e: nop
40048f: nop <func>:
: push %rbp
: e5 mov %rsp,%rbp
: 8b b2 mov 0x2003b2(%rip),%eax # 60084c <val>
40049a: c0 0a add $0xa,%eax
40049d: c9 leaveq
40049e: c3 retq
40049f: nop
......

main函数中

地址0x400478处:

400478: c7 05 ca 03 20 00 0a movl $0xa,0x2003ca(%rip) # 60084c <val>

%rip+0x2003ca=0x400482+0x2003ca=0x60084c=val的地址

地址0x400482处:

118 400482: e8 09 00 00 00 callq 400490 <func>

该条指令的下一条指令地址为0x400487,0x400487+0x09=0x400490=func的地址

func中

地址0x 400494处:

128 400494: 8b 05 b2 03 20 00 mov 0x2003b2(%rip),%eax # 60084c <val>

%rip+ 0x2003b2= 0x40049a+0x2003b2=0x60084c=val的地址

由此可见这三处重定位的地址都为符号地址与下条指令间的偏移,符合上面分析的重定位类型。