PIC机制
PIC机制,主要是为了program可以在内存地址空间复用,从而节约内存。
PIC机制总是和GOT表在一起。GOT表每个进程一份,维护了到唯一一份SO的symbol跳转表。
如进程A需要调用func,首先经过GOT,找到func的重定位地址。
The rationale behind this indirect addressing is to generate code that can be independently accessed of the actual load address
即编译的时候,只知道B.SO的相对GOT ENTRY的地址,把它encode到执行文件A中。A在执行的时候,通过GOT表找就可以了。GOT ENTRY有一个专门的寄存器维护。
相关:.a连接到.so,需要把.a中的代码,也用-PIC编译,再archieve。
见:https://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/
https://wiki.gentoo.org/wiki/Hardened/Introduction_to_Position_Independent_Code
https://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/