컴파일할 때 어떤 옵션이 사용되었는지 알 수 있는 방법이 있나요?

컴파일할 때 어떤 옵션이 사용되었는지 알 수 있는 방법이 있나요?

다음 명령줄을 살펴보세요.

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

이제 "hello" 실행 파일에 대해 일부 처리를 수행하여 이러한 옵션을 이해할 수 있는 방법이 있습니까?

답변1

안타깝게도 그렇지 않습니다. 하지만 바이너리를 만들기 전에 생각해 보면 몇 가지 방법이 있습니다. 여기 또 하나가 있습니다. 최근 gcc에서는 찾고 있는 설명이 포함된 ELF 파일에 섹션을 추가하는 -frecord-gcc-switches 옵션을 사용할 수 있습니다.

$ 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++ 소스 파일에 문서화되어 있습니다. GNU 툴체인을 살펴보세요 autogen.

답변3

방법은 없지만 Makefile을 사용하는 경우 다른 방법이 있습니다.

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

관련 정보