该命令:
gcc -fno-stack-protector -z execstack -o ExitCode ExitCode.c
我知道我需要在我的代码中包含-z execstack
才能使其工作,我基本上知道execstack
是做什么的以及它允许我做什么。但我不知道这里的-z
选项是在做什么。我已经查看过gcc
和execstack
的手册并在两者上使用了--help
,但都没有找到明确的答案。我猜想它是启用了添加execstack
功能……?
该命令:
gcc -fno-stack-protector -z execstack -o ExitCode ExitCode.c
我知道我需要在我的代码中包含-z execstack
才能使其工作,我基本上知道execstack
是做什么的以及它允许我做什么。但我不知道这里的-z
选项是在做什么。我已经查看过gcc
和execstack
的手册并在两者上使用了--help
,但都没有找到明确的答案。我猜想它是启用了添加execstack
功能……?
Linux过去允许在堆栈上执行指令,并且有很多二进制文件和共享库假定这种行为。此外,例如嵌套函数的GCC跳板代码在许多体系结构上需要可执行堆栈。为避免破坏需要可执行堆栈的二进制文件和共享库,现在可以将ELF二进制文件和共享库标记为需要或不需要可执行堆栈。此标记通过PT_GNU_STACK程序头条目中的p_flags字段完成。如果缺少标记,则内核或动态链接器需要假设可能需要可执行堆栈。最近的GCC版本自动执行此标记(使用了堆栈上的跳板的对象被标记为需要可执行堆栈,所有其他新构建的对象被标记为不需要),并且链接器收集这些标记成为整个二进制文件或共享库的标记。用户可以在汇编时(通过--execstack或--noexecstack汇编器选项)、在链接时(通过-z execstack或-z noexecstack链接器选项)以及使用execstack工具在已经链接的二进制文件或共享库上覆盖此功能。该工具对于第三方共享库尤其有用,因为它们不需要可执行堆栈或测试证明他们不需要。
来源:http://linux.die.net/man/8/execstack
希望这有所帮助。
-z
直接传递给连接器,但在在线文档中有提到。ld
的man页。从中可知:
-z keyword The recognized keywords are: (...) execstack Marks the object as requiring executable stack.