Linux 极客的 10 个重要 GCC 标志

让我们来看看一些最重要的 GCC 标志! GCC,又名 GNU 项目 C 和 C++ 编译器,是任何使用 C/C++ 编码的 Linux 极客的必备工具,并且可能是使用最广泛的编译器。 像大多数命令行实用程序一样,我们可以在标志的帮助下进一步扩展 GCC 的功能。 在本模块中,我们将查看 15 个这样的 GCC 标志。

介绍

如果您打算使用这两种语言中的任何一种进行编码,那么 GNU C/C++ 编译器是您必备的工具。 编译器有很多选项供您使用并测试它通过标志实现的选项。

重要的 GCC 标志

以下是一些可能会派上用场的重要 GCC 标志:

1.将输出文件命名为 -o file

该标志帮助我们指定 GCC 生成的最终可执行文件的名称。 它将最终可执行文件的输出放在一个文件“文件”与标志一起指定。

如果 -O 未提供标志,它将输出存储在名为“a.输出

$ gcc test.c -o out 

这将输出的可执行二进制文件存储在一个名为“出去

2. 产生调试信息 -g

添加“-G” 标志以操作系统的本机格式(stabs、COFF、XCOFF 或 DWARF)生成调试信息。 这些信息可以被 GNU 调试器解释,它可以在调试过程中帮助我们。 这些额外的信息使 GDB 中的调试工作更好,并有助于更好地理解正在发生的事情。

3. 使用共享库链接 C 程序 -l / -L

需要这两个标志的组合才能将 C 程序与共享库链接。 这两个标志的作用是:

  • -l :表示共享库的名称
  • -L : 共享库的位置

例如,要链接共享库“”存储在 /家/用户/所以,命令将是:

$ gcc -L/home/user/so -Wall -o test test.c -lfoo 

4. 将编译时警告转换为错误 -Werror

通常在编译二进制文件时,我们会遇到很多我们认为微不足道的警告。 这些警告表明代码中可能存在漏洞、安全功能或缺陷,并且由此代码生成的二进制文件可能存在错误。

因此,要将这些警告转换为错误,我们可以使用 -错误 旗帜。 结果,编译期间显示的所有警告都将转换为错误。 消除所有错误可能有点烦人,但结果是您的可执行文件错误较少。

5. 启用所有警告 -Wall

想要更多无错误代码? 试试 -墙 旗帜。 这将启用有关某些用户认为有问题的构造的所有警告,并且很容易避免(或修改以防止警告)。

-墙 标志,结合 -错误 标志提供确保您有一个非常防错误的可执行文件。 这些标志可帮助您开发安全编码实践并编写安全代码。

6. 生成与位置无关的代码 -fPIC

该标志生成位置无关代码,适用于动态链接并避免对全局偏移表的大小进行任何限制。 这个选项在创建共享库时特别有用。 这有助于共享库加载为任何地址而不是某个固定地址。

7.优化编译时间 -O2/-O3

优化编译时间和生成代码的性能。 这两个标志定义了代码的优化级别,以便您可以获得更优化的输出。

8. 编译时检查缓冲区溢出 -fstack-protector

这可以检查缓冲区溢出,例如堆栈粉碎攻击。 这可以在很大程度上保护对您的二进制文件的攻击,并可能防止劫持函数指针并防止堆栈被不需要的恶意数据覆盖

9. 使用管道代替临时文件 -pipe

这告诉编译器使用管道而不是临时文件在编译的各个阶段之间进行通信。 这避免了使用临时文件并加快了构建过程。

10. Save 临时文件 -save-temps

启用此选项后,所有编译阶段的输出都存储在当前目录中。 这包括原始 C 代码、汇编代码、预处理输出、编译代码和可执行文件本身。

$ gcc -save-temps test.c $ ls a.out  test.c  test.i  test.o  test.s 

通过文件传递 GCC 标志

您可以在“的帮助下存储您可能想要包含的所有标志@“ 象征。 例如,您拥有要在编译期间包含的所有标志,例如:

$ cat flags -Wall -Werror -O3 -save-temps  

然后你可以包含相同的:

$ gcc test.c @flags 

当您想确保所有可执行文件都具有一些通用标准或避免一遍又一遍地输入相同的长文件列表时,这会派上用场。

结论

因此,在这个模块中,我们看到了一些有用的 GCC 标志。 但是,您仍然可以使用命令查看更多标志 man gcc.