source

컴파일된 실행 파일에서 컴파일러 옵션을 가져오시겠습니까?

factcode 2022. 8. 27. 09:23
반응형

컴파일된 실행 파일에서 컴파일러 옵션을 가져오시겠습니까?

*nix에서 실행 파일을 작성하기 위해 어떤 컴파일러와 플래그가 사용되었는지 확인할 수 있는 방법이 있습니까?이전 버전의 코드를 컴파일하고 있는데 최적화 여부를 확인하고 싶습니다.구글은 별로 도움이 되지 않았지만, 제가 올바른 키워드를 사용하고 있는지 모르겠습니다.

에는 gcc가 .-frecord-gcc-switches★★★★

   -frecord-gcc-switches
       This switch causes the command line that was used to invoke the compiler to
       be recorded into the object file that is being created.  This switch is only
       implemented on some targets and the exact format of the recording is target
       and binary file format dependent, but it usually takes the form of a section
       containing ASCII text.

후, ELF 에는 「」, 「ELF」가 됩니다..GCC.command.line섹션으로 이동합니다.

$ gcc -O2 -frecord-gcc-switches a.c
$ readelf -p .GCC.command.line a.out 

String dump of section '.GCC.command.line':
  [     0]  a.c
  [     4]  -mtune=generic
  [    13]  -march=x86-64
  [    21]  -O2
  [    25]  -frecord-gcc-switches

물론 이 옵션이 없으면 컴파일된 실행 파일에서는 작동하지 않습니다.


간단한 최적화 사례의 경우 파일이 디버그 정보로 컴파일된 경우 디버거를 사용해 볼 있습니다.조금 더 자세히 살펴보면 일부 변수가 '최적화'된 것을 알 수 있습니다.이는 최적화가 이루어졌음을 시사합니다.

에 의해 "gcc"로 -g하다

readelf --debug-dump=info /path/to/executable | grep "DW_AT_producer"

예를 들어 다음과 같습니다.

% cat test.c
int main() {
    return 42;
}
% gcc -g test.c -o test
% readelf --debug-dump=info ./test | grep "DW_AT_producer"
    <c>   DW_AT_producer    : (indirect string, offset: 0x2a): GNU C17 10.2.0 -mtune=generic -march=x86-64 -g

안타깝게도, 적어도 버전 10에서는 비슷한 방식으로 옵션을 녹음하지 않는 것 같습니다.

★★★★★★★★★★★★★★★★★.strings 에서 한 바와 다음.

% strings ./test | grep march
GNU C17 10.2.0 -mtune=generic -march=x86-64 -g -O3

다른 옵션은 -grecord-gcc-swtiches입니다(주의: -f가 아니라 -g).gcc docs에 따르면 Dwarf 디버깅 정보에 플래그를 넣을 수 있습니다.gcc 4.8부터 디폴트로 유효하게 되어 있는 것 같습니다.

난쟁이 덤프 프로그램이 그 플래그를 추출하는데 유용하다는 걸 알아냈어.문자열 프로그램에서는 인식되지 않습니다.난쟁이 정보가 압축된 것 같아요

-frecord-gcc-switches플래그를 입력하면 명령줄 컴파일러 옵션이 노트 섹션의 바이너리로 작성됩니다.메뉴얼도 참조해 주세요.

나는 그것이 가능한지 매우 의심스럽다.

int main()
{
}

컴파일 대상:

gcc -O3 -ffast-math -g main.c -o main

생성된 개체에서 다음 매개 변수를 찾을 수 없습니다.

strings main | grep -O3
(no output)

이치노에 대해서는 않고, , 사용하시는 컴파일러는 없습니다.linux사용하고 않습니다(이을 실행하는 옵션입니다).는 사용하다이이((((((((((((( ( - frecord - gcc - switchs ; - frecrecord - gcc - switchs ) 。

바이너리를 검사하려면strings명령어는 파일 내에서 읽기 쉬운 문자열로 보이는 모든 문자열을 표시합니다.

사용하고 있는 컴파일러(같은 버전)가 아직 존재하고 있고, 그 플래그가 불분명한 플래그가1개밖에 없는 경우는, 플래그를 사용한 경우와 사용하지 않은 경우의 코드 컴파일을 재시도할 수 있습니다.그런 다음 실행 파일을 비교할 수 있습니다.이전 것은 새 것과 동일하거나 매우 유사해야 합니다.

언급URL : https://stackoverflow.com/questions/12112338/get-the-compiler-options-from-a-compiled-executable

반응형