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

标签 c linux gcc command-line compilation

命令:

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

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

最佳答案

在你的情况下是 -z execstack

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

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

关于执行栈

Linux 过去允许在堆栈上执行指令,并且有很多二进制文件和共享库都采用这种行为。此外,GCC 蹦床代码例如嵌套函数在许多体系结构上都需要可执行堆栈。为了避免破坏需要可执行堆栈的二进制文件和共享库,现在可以将 ELF 二进制文件和共享库标记为需要可执行堆栈或不需要它。此标记是通过 PT_GNU_STACK 程序头条目中的 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/

相关文章:

.net - 单声道中的 P/调用

linux - 到 stderr 的输出改为到 stdout

c++ - 宏替换,-E 选项 gcc

c - 函数以某种方式从一次调用中返回两次

c - 在给定值之后反转链表,而不创建新节点

c - 在 osx 上使用 gcc 编译 allegro5 程序时出错

c++ - 使用 OpenMP 并行化此递归的最佳方法

c - 无法找到-lGL,没有符号链接(symbolic link)怎么办?

linux - 从具有多个单词的文件名创建目录

linux - CMP 命令无法正常工作