这个gcc编译器命令中的-z选项是用来做什么的?

19

该命令:

gcc -fno-stack-protector -z execstack -o ExitCode ExitCode.c

我知道我需要在我的代码中包含-z execstack才能使其工作,我基本上知道execstack是做什么的以及它允许我做什么。但我不知道这里的-z选项是在做什么。我已经查看过gccexecstack的手册并在两者上使用了--help,但都没有找到明确的答案。我猜想它是启用了添加execstack功能……?

2个回答

24
在您的情况下,是-z execstack。
-z 与关键字 execstack 一起直接传递给链接器。
来源:https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#index-z 关于 execstack。

Linux过去允许在堆栈上执行指令,并且有很多二进制文件和共享库假定这种行为。此外,例如嵌套函数的GCC跳板代码在许多体系结构上需要可执行堆栈。为避免破坏需要可执行堆栈的二进制文件和共享库,现在可以将ELF二进制文件和共享库标记为需要或不需要可执行堆栈。此标记通过PT_GNU_STACK程序头条目中的p_flags字段完成。如果缺少标记,则内核或动态链接器需要假设可能需要可执行堆栈。最近的GCC版本自动执行此标记(使用了堆栈上的跳板的对象被标记为需要可执行堆栈,所有其他新构建的对象被标记为不需要),并且链接器收集这些标记成为整个二进制文件或共享库的标记。用户可以在汇编时(通过--execstack或--noexecstack汇编器选项)、在链接时(通过-z execstack或-z noexecstack链接器选项)以及使用execstack工具在已经链接的二进制文件或共享库上覆盖此功能。该工具对于第三方共享库尤其有用,因为它们不需要可执行堆栈或测试证明他们不需要。

来源:http://linux.die.net/man/8/execstack

希望这有所帮助。


7
这是一个连接器选项。虽然man页中未提及该-z直接传递给连接器,但在在线文档中有提到。
因此,需要查找ld的man页。从中可知:
 -z keyword
     The recognized keywords are:

 (...)

     execstack
         Marks the object as requiring executable stack.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接