有没有办法知道编译时使用了哪些选项?

有没有办法知道编译时使用了哪些选项?

看一下下面的命令行:

gcc -o hello -Wall -D_BSD_SOURCE hello-world.c

现在,有没有办法通过对“hello”可执行文件进行一些处理来了解这些选项。

答案1

可悲的是没有。但如果您在创建二进制文件之前考虑一下,有一些方法。这是另一个。对于最近的 gcc,您可以使用 -frecord-gcc-switches 选项,该选项将在 ELF 文件中添加一个包含您要查找的描述的部分。

$ gcc -frecord-gcc-switches -o hello -Wall -D_BSD_SOURCE hello-world.c
$ readelf -p .GCC.command.line hello

String dump of section '.GCC.command.line':
  [     0]  -D _BSD_SOURCE
  [     f]  hello-world.c
  [    1d]  -mtune=generic
  [    2c]  -march=x86-64
  [    3a]  -Wall
  [    40]  -frecord-gcc-switches

正如您所看到的,它显示了所有使用过的选项,而不仅仅是您明确提供的选项。

答案2

不可能,但如果您不剥离二进制文件,编译器版本可能可用。

如果你提到宏的东西,即#ifdef HAVE_XXX,它被记录在C/C++源文件中。看一下 GNUautogen工具链。

答案3

没办法,但是如果用Makefile的话,还有一个办法:

TARGET=hello
CFLAGS=-Wall -D_BSD_SOURCE hello-world.c
all:
    cc -o $(TARGET) $(CFLAGS) -DCFLAGS="\"$(CFLAGS)\""

相关内容