回答
链接问题中接受的答案是非常简单的,只会引出PIC和非PIC代码之间不同的一个事物,即生成相对而非绝对的跳转。
制作PIC代码时,不仅是位置独立的代码,也是数据。并不是所有的代码或数据都可以简单地通过使用相对偏移量来寻址,它必须在加载时(库/程序加载到内存中)或甚至在运行时解决。另外,使用相对寻址意味着CPU必须将相对偏移量转换为绝对地址,而不是由编译器完成。
在带虚拟内存的系统上,编译器可以一劳永逸地完成这些相对地址分辨率时,通常不需要花费负载或运行时间。
在某些体系结构上,包括x86,-fPIC
生成很多加载/存储数据的较差代码(即函数调用)。虽然这对图书馆来说是可以忍受的,但对于可执行文件来说这是不可取的
amd64指令集(以及最近的gnu-x32 ABI)的主要卖点之一是增加了“PC相对加载/存储”指令,从而解决了效率问题。
注意,硬化系统通常做使-fPIE
所有可执行文件,因为它允许地址空间布局随机。
这与函数调用没有可比性,但它占用一个寄存器。 – DevSolar
@DevSolar uh,它绝对需要一个函数调用(尽管它可能会在第一次显然后将其缓存在寄存器中)。它出现在反汇编中,使用'__x86.get_pc_thunk.cx'这样的名字,显然这个寄存器取决于当前使用的内容。 – o11c
啊......我们的意思是一样的。 “函数调用”是将偏移表的地址存入寄存器的技巧。保持缓存需要一个寄存器(如我所说),而不是缓存它使数据访问需要一个函数调用(如你所说)。应该指出的是,这是x86体系结构的典型“丑陋点”之一;大多数(如果不是所有其他的CPU系列的话)在20世纪80年代允许适当的PC相对寻址... – DevSolar
- 1. PIC(位置独立代码)
- 2. 使用gas生成与位置无关的代码(-fPIC)
- 3. 静态库中的fPIC代码:为什么?怎么了?
- 4. 为什么我的Django的代码不能是“独立的Django的脚本”
- 5. 为什么fPIC绝对需要64位而不是32位平台?
- 6. api独立顶点处理的好代码结构是什么?
- 7. “独立”是什么意思?
- 8. 为什么编码不总是工作?
- 9. 为什么我不能在此代码中设置位置(AS3)?
- 10. 从独立代码
- 11. 什么是独立应用程序或独立服务器?
- 12. 应该是独立的子查询不是。为什么?
- 13. 为什么这段代码总是打印“不匹配”?
- 14. Java中的单独代码是什么?
- 15. 为什么独立应用程序?
- 16. 为什么CDN总是使用单独的主机而不是子域?
- 17. 为什么不能使用此代码?
- 18. 位置独立可执行文件的正确Xcode设置是什么
- 19. 为什么css转换属性不是独立的css属性?
- 20. 为什么我的布局不是密度独立的?
- 21. 为什么IsDebugEnabled在我的代码中总是为True?
- 22. 为什么不是PHP代码呼应
- 23. Java独立代码块
- 24. 触摸即使我的代码总是在右侧的位置
- 25. 为什么程序与-fpic和-pie编译有重定位表?
- 26. 什么是与CSS的dp(密度独立像素)单位?
- 27. 为什么此代码更改位置,因为我需要它
- 28. 为什么总是使用object = null?
- 29. 为什么getLocationOnScreen(位置)总是返回0?
- 30. 为什么我的uialeartview总是在旋转时改变位置
PIC通常不能在Windows中使用,因为在加载期间DLL地址是固定的。而且在x86 PIC中效率不如x86_64 –