免费开源电商系统,搜索引擎优化的方法,云主机建站,中盛客户管理软件使用 -fPIC 选项#xff0c;会生成 PIC 代码。.so 要求为 PIC#xff0c;以达到动态链接的目的#xff0c;否则#xff0c;无法实现动态链接。non-PIC 与 PIC 代码的区别主要在于 access global data, jump label 的不同。比如一条 access global data 的指令#xff0c;n… 使用 -fPIC 选项会生成 PIC 代码。.so 要求为 PIC以达到动态链接的目的否则无法实现动态链接。 non-PIC 与 PIC 代码的区别主要在于 access global data, jump label 的不同。 比如一条 access global data 的指令 non-PIC 的形势是ld r3, var1 PIC 的形式则是ld r3, var1-offsetGOT,意思是从 GOT 表的 index 为 var1-offset 的地方处 指示的地址处装载一个值,即 var1-offsetGOT 处的4个 byte 其实就是 var1 的地址。这个地址只有在运行的时候才知道 是由 dynamic-loader(ld-linux.so) 填进去的。 再比如 jump label 指令 non-PIC 的形势是jump printf 意思是调用 printf。 PIC 的形式则是jump printf-offsetGOT,意思是跳到 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 一样。 可见动态链接执行很复杂比静态链接执行时间长;但是极大的节省了 sizePIC 和动态链接技术是计算机发展史上非常重要的一个里程碑。