看一下下面的命令行:
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)\""