标签:ber 全局 span sed plt linu 意思 地方 lin
PIC 的形式则是:jumpprintf-offset@GOT,
意思是跳到 GOT 表的 index 为 printf-offset 的地方处指示的地址去运行,
这个地址处的代码摆放在 .plt section,
每一个外部函数相应一段这种代码,其功能是呼叫dynamic-loader(ld-linux.so)来查找函数的地址(本例中是 printf),然后将其地址写到 GOT 表的 index 为 printf-offset的地方,
同一时候运行这个函数。这样。第2次呼叫printf 的时候,就会直接跳到 printf 的地址,而不必再查找了。
GOT是 data section, 是一个 table, 除专用的几个 entry。每一个 entry的内容能够再运行的时候改动;
PLT是 text section, 是一段一段的 code,运行中不须要改动。
每一个 target 实现 PIC的机制不同,但大同小异。
比方 MIPS 没有 .plt, 而是叫 .stub,功能和 .plt一样。
可见,动态链接运行非常复杂。比静态链接运行时间长;可是,极大的节省了size。PIC 和动态链接技术是计算机发展史上非常重要的一个里程碑。
gccmanul上面有说
-fpic
-fPIC
关键在于GOT全局偏移量表里面的跳转项大小。
intel处理器应该是统一4字节,没有问题。
powerpc上因为汇编码或者机器码的特殊要求,所以跳转项分为短、长两种。
-fpic为了节约内存,在GOT里面预留了“短”长度。
而-fPIC则採用了更大的跳转项。
ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so
标签:ber 全局 span sed plt linu 意思 地方 lin
原文地址:http://www.cnblogs.com/cynchanpin/p/6883903.html