命令:
gcc -fno-stack-protector -z execstack -o ExitCode ExitCode.c
我知道我需要包含-z execstack
才能使我的代码正常工作,我基本上知道execstack
是什么以及它允许我做什么。但我不知道-z
选项在这里做了什么。我在grep
和gcc
手册页上查看了execstack
并在--help
页面上使用了execstack
但未找到直接答案。我猜它正在添加{{1}}功能...?
答案 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.