为什么 linux 在 x64 中使用两个 GOT 部分? .GOT 与 .got.plt
Why does linux use two GOT sections in x64? .GOT vs .got.plt
我试图弄清楚这两个部分之间的区别,这似乎是这个 question 的重复,但是那里给出的答案并没有解释太多,所以我会喜欢更详细和简洁的解释。
拆分是出于安全原因。默认情况下(过去仅在 -Wl,-z,relro
下)一旦动态加载程序在启动时解析所有数据重定位(即在进入 main
函数之前),.got
部分将重新映射为只读防止 some types of exploits. .got.plt
can not be remapped because of lazy symbol binding(除非使用了 LD_BIND_NOW
或 -Wl,-z,now
,在这种情况下延迟绑定被关闭并且 .got.plt
也被重新映射)。
我试图弄清楚这两个部分之间的区别,这似乎是这个 question 的重复,但是那里给出的答案并没有解释太多,所以我会喜欢更详细和简洁的解释。
拆分是出于安全原因。默认情况下(过去仅在 -Wl,-z,relro
下)一旦动态加载程序在启动时解析所有数据重定位(即在进入 main
函数之前),.got
部分将重新映射为只读防止 some types of exploits. .got.plt
can not be remapped because of lazy symbol binding(除非使用了 LD_BIND_NOW
或 -Wl,-z,now
,在这种情况下延迟绑定被关闭并且 .got.plt
也被重新映射)。