gpt4 book ai didi

linux - 为什么 gcc 默认链接 '-z now',尽管延迟绑定(bind)是 ld 的默认值?

转载 作者:行者123 更新时间:2023-12-01 21:30:46 26 4
gpt4 key购买 nike

man ld-z lazy 有以下说法:

...tell the dynamic linker to defer function call resolution to the point when the function is called ... Lazy binding is the default.

另一方面,gcc --verbose main.c-z now -z relro 传递给 ld 以获取具有空 main 的 main.c ()

$ gcc --verbose main.c
Using built-in specs.
COLLECT_GCC=gcc
[...]
Thread model: posix
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
[...]
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/7/collect2 [...] -pie -z now -z relro [...]

我在默认安装 gcc 的 Ubuntu 18.04 和 19.04 中看到了这一点。

所以 -z lazy 可能是 ld 的默认设置,但是 gcc 在哪里/为什么将其更改为 -z now -z relro

最佳答案

它是 Ubuntu 16.10 中引入的 ELF 二进制加固功能,默认启用 PIE。

惰性绑定(bind)可以通过延迟函数符号的解析来提高程序启动性能。这意味着部分 GOT 数据(在 .got.plt 部分)必须在运行时可写。因此.got.plt 可能被“GOT 覆盖”攻击所利用。

启用 BIND_NOW 时,将在执行程序代码之前解析所有符号。 .got.plt 部分被 ld 合并到 .got 部分。 ld.so 在调用程序入口点之前将 .got 部分更改为只读。这称为完全 RELRO。

参见 this , 和 this文章了解更多详情。

关于linux - 为什么 gcc 默认链接 '-z now',尽管延迟绑定(bind)是 ld 的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62527697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com