热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Whatisthe"-z"optionofClangandwhyisitneeded?

如何解决《Whatisthe"-z"optionofClangandwhyisitneeded?》经验,为你挑选了1个好方法。

Consider the following linker-specific options of Clang:

-Wl,                Pass the comma separated arguments in  to the linker
-Xlinker            Pass  to the linker
-z                   Pass -z  to the linker

What is meant by Pass -z to the linker and how does -z differ from -Xlinker ?

I sometimes see -z used with -Wl, like:

-Wl,-z,norelro

But why is this needed, if arguments to -Wl should merely be comma-separated?



1> Employed Rus..:

为什么-z与-Wl一起使用

以下3个命令完全等效:

clang main.c -o a.out -Wl,-z,norelro
clang main.c -o a.out -z norelro
clang main.c -o a.out -Xlinker -z -Xlinker norelro

它们都-z norelro在最终链接阶段传递给链接器。

第一种形式是许多编译器的标准形式。第二种形式稍短一些,但实际上不应该使用(因为使用“标准”形式总是更好)。仅支持第三种形式以与GCC兼容。它不必要地冗长。

更新:

我们不能只是写 -Wl,norelro

否:会将“裸” norelro选项传递给链接器,链接器会将其视为输入文件,并且会抱怨不存在这样的输入文件。(显然)pass -z norelro和just 之间有区别norelro

另外,考虑 clang ./noaslr.c -Wl,-z,-no_pie ...

那只是伪指令。该-no-pie 一个连接器选项,而不应被作为前缀-z。这也不是该-z选项的有效选项值。

更新2:

在哪里可以看到-z链接器选项的可能值?

ld 目标操作系统上的手册页中。例如,在Linux的最新BFD ld 了解以下-z选项:bndpltcall-nop-prefix=...combreloc,等等等等。

另外,您是否有任何线索为什么在macOS上的man不显示-z链接器选项?

可能是因为它根本不支持该选项。


推荐阅读
author-avatar
哥哥很霸道_277
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有