elf 바이너리에서 컴파일러 정보를 얻을 수 있나요?

elf 바이너리에서 컴파일러 정보를 얻을 수 있나요?

Linux에서 바이너리가 어떻게 구축되는지 이해할 기회가 있습니까? (그리고/또는 다른 유닉스)

컴파일러, 버전, 시간, 플래그 등...

찾아봤는데 readelf많이 찾을 수 없었지만 바이너리 코드/부분 등을 분석하는 다른 방법이 있을 수 있습니다.

추출하는 방법을 아시나요?

답변1

모든 경우에 적용되는 일률적인 접근 방식은 없지만 단 하나의 컴파일러에서 수행되는 작업을 검색하여 정보를 바탕으로 추측할 수 있습니다.

GCC는 가장 간단합니다. .commentGCC 버전 문자열(런타임에 얻는 것과 동일한 문자열 gcc --version)을 포함하는 섹션을 작성합니다. 표시하는 방법이 있는지는 모르겠지만 readelf사용 objdump방법은 다음과 같습니다.

objdump -s --section .comment /path/binary

방금 귀하의 질문의 나머지 부분을 무시했다는 것을 깨달았습니다. 플래그는 일반적으로 어디에도 저장되지 않습니다. 댓글 섹션에 표시될 가능성이 높지만 이런 경우는 본 적이 없습니다. 타임스탬프에 대한 위치는 COFF 헤더에 있지만 ELF에는 해당 위치가 없으므로 컴파일 시간도 사용할 수 없는 것으로 가정합니다.

답변2

어때요?

readelf -p .comment a.out

답변3

이 명령을 시도해 볼 수 있습니다 strings. 그러면 많은 텍스트 출력이 생성됩니다. 검사를 통해 컴파일러를 추측할 수 있습니다.

pubuntu@pubuntu:~$ strings -a a.out |grep -i gcc
GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3

여기서 나는 그것이 그것으로 컴파일되었다는 것을 알고 있지만 gcc언제든지 strings출력을 파일로 리디렉션하고 확인할 수 있습니다.

라는 아주 좋은 유틸리티가 있습니다peidWindows의 경우 Linux에서는 대안을 찾을 수 없습니다.

답변4

readelf아니면 objdump둘 다 할 수 있습니다.

.note.ABI-taggcc로 컴파일된 ELF 파일에는 및 섹션이 추가됩니다 .note.gnu.build-id. 둘 다 다음을 통해 표시될 수 있습니다.

objdump -sj .note.ABI-tag ELFFILE
objdump -sj .note.gnu.build-id ELFFILE

옵션 "s"는 전체 내용을 표시한다는 의미이고, "j"는 부분 이름을 의미합니다. 이 스타일은 섹션의 16진수 콘텐츠를 가져옵니다.

이 명령은 readelf -nELFFILE의 사람이 읽을 수 있는 내용을 한 번 표시합니다. 옵션 'n'은 주석을 의미합니다. 당신이 좋아하는 것을 선택하십시오.

그런데 를 사용하면 objcopyelf 파일에 자신만의 섹션을 추가할 수 있습니다.

관련 정보