首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么gcc默认使用“-z now”链接,虽然延迟绑定是ld的默认设置?

为什么gcc默认使用“-z now”链接,虽然延迟绑定是ld的默认设置?
EN

Stack Overflow用户
提问于 2020-06-23 05:06:57
回答 1查看 2.8K关注 0票数 2

man ld-z lazy有以下几点看法

将函数调用解析推迟到调用函数时的动态链接器( ...tell ).延迟绑定是默认的

另一方面,gcc --verbose main.c将带有空main()的main.c的-z now -z relro传递给ld

代码语言:javascript
运行
复制
$ 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 [...]

我在Ubuntu18.04和19.04的默认安装gcc中看到了这一点。

因此,-z lazy可能是ld的缺省值,但是gcc为什么将其更改为-z now -z relro呢?

EN

回答 1

Stack Overflow用户

发布于 2020-12-13 15:52:18

它是在Ubuntu16.10中引入的ELF二进制强化特性,以及默认启用的饼图。

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

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

有关详细信息,请参阅文章。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62527697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档