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

时间:2015-03-21 02:02:55

标签: c linux gcc command-line compilation

命令:

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

我知道我需要包含-z execstack才能使我的代码正常工作,我基本上知道execstack是什么以及它允许​​我做什么。但我不知道-z选项在这里做了什么。我在grepgcc手册页上查看了execstack并在--help页面上使用了execstack但未找到直接答案。我猜它正在添加{{1}}功能...?

2 个答案:

答案 0 :(得分:9)

在你的情况下是-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版本自动完成(使用堆栈上的trampolines的对象被标记为需要可执行堆栈,所有其他新构建的对象被标记为不需要它),并且链接器将这些标记收集到整个二进制或共享库的标记中。用户可以在汇编时(通过--execstack或--noexecstack汇编程序选项),在链接时(通过-z execstack或-z noexecstack链接器选项)和在已经使用链接器二进制文件或共享库上使用execstack工具来覆盖它。此工具对第三方共享库特别有用,因为众所周知,它们不需要可执行堆栈或测试证明它。

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

希望这有帮助。

答案 1 :(得分:5)

它是一个链接器选项。手册页中未提及-z直接传递给链接器,但在联机文档中提到了here

所以查找它的地方是ld联机帮助页。从它:

 -z keyword
     The recognized keywords are:

 (...)

     execstack
         Marks the object as requiring executable stack.