命令:

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

我知道我需要包括-z execstack才能使我的代码正常工作,并且我基本上了解execstack的用途以及它允许​​我做什么。但是我不知道-z选项在做什么。我已经在grepgcc手册页上进行了execstack的查找,并在两者上都使用了--help,但没有找到直接的答案。我猜它正在启用execstack功能的添加...?

最佳答案

您的情况是-z execstack

-z与关键字execstack一起直接传递到链接器。

资料来源:https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#index-z

关于execstack

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

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

希望这可以帮助。

关于c - 此gcc编译器命令中的-z选项是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29178445/

10-09 09:00