这个 gcc 编译器命令中的 -z 选项是啥?
Posted
技术标签:
【中文标题】这个 gcc 编译器命令中的 -z 选项是啥?【英文标题】:What is the -z option for in this gcc compiler command?这个 gcc 编译器命令中的 -z 选项是什么? 【发布时间】:2015-05-24 13:34:37 【问题描述】:命令:
gcc -fno-stack-protector -z execstack -o ExitCode ExitCode.c
我知道我需要包含-z execstack
才能使我的代码工作,并且我基本上知道execstack
的用途以及它允许我做什么。但我不知道-z
选项在这里做什么。我在gcc
和execstack
手册页上查看了grep
并在两者上都使用了--help
,但没有找到直接的答案。我猜它正在启用添加execstack
功能......?
【问题讨论】:
【参考方案1】:在你的情况下是 -z execstack
-z 与关键字 execstack 一起直接传递给链接器。
来源:https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#index-z
关于执行栈
Linux 过去允许在堆栈上执行指令,并且有很多二进制文件和共享库都采用了这种行为。此外,GCC 蹦床代码例如嵌套函数在许多架构上都需要可执行堆栈。为了避免破坏需要可执行堆栈的二进制文件和共享库,ELF 二进制文件和共享库现在可以标记为需要可执行堆栈或不需要它。此标记是通过 PT_GNU_STACK 程序头条目中的 p_flags 字段完成的。如果标记丢失,内核或动态链接器需要假设它可能需要可执行堆栈。标记是由最近的 GCC 版本自动完成的(在堆栈上使用蹦床的对象被标记为需要可执行堆栈,所有其他新构建的对象被标记为不需要它)并且链接器将这些标记收集到整个二进制或共享库的标记中。用户可以在汇编时(通过 --execstack 或 --noexecstack 汇编器选项),在链接时(通过 -z execstack 或 -z noexecstack 链接器选项)覆盖它,并在已经链接器二进制或共享库上使用 execstack 工具.此工具对于已知不需要可执行堆栈或测试证明的第三方共享库特别有用。
来源:http://linux.die.net/man/8/execstack
希望这会有所帮助。
【讨论】:
【参考方案2】:这是一个链接器选项。手册页中没有提到 -z
直接传递给链接器,但在线文档中提到了 here。
所以查找它的地方是ld
联机帮助页。来自它:
-z keyword The recognized keywords are: (...) execstack Marks the object as requiring executable stack.
【讨论】:
以上是关于这个 gcc 编译器命令中的 -z 选项是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Xlc '-qthreaded' 编译器选项的 gcc 等效项是啥?