gcc的参数-fPIE是什么意思?
gcc的参数-fPIE是什么意思? 用于产生与位置无关的代码。创建动态库时,必须加这几个参数进行编译。[ 本帖最后由 阿旺 于 2006-4-6 13:00 编辑 ] 楼上的,
-fPIE is not -fPIC Pattern not found 那-Fpic 什么意思? ok.
-fPIE的意思其实和-fPIC是差不多的. 它们都是产生位置无关的代码.
只不过, -fPIE是为可执行文件产生位置无关代码, -fPIC是为共享库产生位置无关代码.
---------------------分割线-------------------------------------
地址无关代码技术是一种编译期的, 由编译器实施的技术 -- 这句话是口水话, 不过却是理解地址无关技术的关键所在之一. 很多人容易把地址无关技术和链接过程混淆起来(当然, 这些技术确实和链接过程是相关的), 导致对这种技术的理解有偏差.
TMD... 一不小心, 没发现又是一张挖坟贴, 艹. 回复 7# captivated
{:3_184:}
这贴有点略久啊。
谁挖的。 锹挺长啊。 关于符号重定位,动态填写.got程序员的自我修养这本书有解释, 本帖最后由 captivated 于 2012-09-17 21:32 编辑
回复 9# mr_sev
嗯. 回答没错, 不过你还是没有注意到我的解释. 这证明你看得不够仔细(小小得意一下, 哈哈).
地址无关代码技术是编译期由编译器实施的技术, .got不过是个类似于.data的数据段, 而且它里面的item是在加载期由动态链接器填写的. Lazy Binding先不讨论, 总体上是这样的.
关键的地方在于, 地址无关代码的实现本身要求访问数据时对于指令的选择 -- 简单的说, 你要mov一个内存数据到寄存器, 不是简单的 movl var_addr, %ebx 这种指令的事情, 而是必须要获得内存数据对于eip亦即pc的相对偏移量, 这个才是PIC(Position Independent Code)的关键啊. 而选择使用(或者把C语言代码编译为)哪个(或者哪一系列)汇编指令, 是编译器的事情. 至于.got的填写已经和编译器没有关系了(前面已经解释过那是运行期行为了), 注意到这一点才能算是对地址无关代码技术有透彻的理解了哦.