为什么 linux 在 x64 中使用两个 GOT 部分?.GOT 与 .got.plt

Tre*_*rey 3 linux x86 x86-64 elf got

我试图弄清楚这两个部分之间的区别,这似乎是这个问题的重复,但那里给出的答案没有解释太多,所以我想要更详细和简洁的解释。

yug*_*ugr 5

拆分是出于安全原因。默认情况下(-Wl,-z,relro过去仅在过去).got部分被重新映射为只读,一旦动态加载器在启动时(即在进入main函数之前)解决了所有数据重定位,以防止某些类型的漏洞利用.got.plt由于惰性符号绑定而无法重新映射(除非LD_BIND_NOW-Wl,-z,now被使用在这种情况下惰性绑定被关闭并.got.plt重新映射)。