라이브러리가 -g로 컴파일되었는지 어떻게 알 수 있습니까?
x86 Linux에 컴파일된 라이브러리가 몇 개 있는데 디버깅 기호를 사용하여 컴파일되었는지 빨리 확인하고 싶습니다.
Linux 를 실행하고 있는 경우는,objdump --debugging
. 라이브러리의 각 오브젝트 파일에 엔트리가 있어야 합니다.디버깅 기호가 없는 오브젝트 파일의 경우 다음과 같이 표시됩니다.
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
디버깅 기호가 있는 경우 출력은 훨씬 상세해집니다.
도움이 된 것은 다음과 같습니다.
gdb mylib.so
디버깅 기호를 찾을 수 없는 경우 다음과 같이 출력됩니다.
Reading symbols from mylib.so...(no debugging symbols found)...done.
또는 발견 시:
Reading symbols from mylib.so...done.
디버깅 기호가 없는 libs는 많은 출력을 제공하는 등 이전 답변은 의미 있는 결과를 제공하지 않았습니다.
권장 명령어
objdump --debugging libinspected.a
objdump --debugging libinspected.so
적어도 Ubuntu/Linaro 4.5.2에서는 항상 같은 결과를 얻을 수 있습니다.
libinspected.a: file format elf64-x86-64
libinspected.so: file format elf64-x86-64
아카이브/공유 라이브러리의 구축 유무에 관계없이-g
선택
내가 정말 도움이 된 건-g
사용된 것은 readelf 도구입니다.
readelf --debug-dump=decodedline libinspected.so
또는
readelf --debug-dump=line libinspected.so
이러한 디버깅 정보가 라이브러리에 포함되어 있는 경우 소스 파일 이름, 행 번호 및 주소로 구성된 행 세트가 인쇄됩니다.그렇지 않으면 아무것도 인쇄되지 않습니다.
필요한 모든 가치를 전달할 수 있습니다.--debug-dump
대신 옵션decodedline
.
nm -a <lib>
는 디버깅 기호를 포함한 라이브러리의 모든 기호를 인쇄합니다.
이 때문에, 다음의 결과를 비교할 수 있습니다.nm <lib>
그리고.nm -a <lib>
- 다른 경우 lib에 디버깅 기호가 포함되어 있습니다.
사용법을 제안하는 답변objdump --debugging
또는readelf --debug-dump=...
디버깅 정보가 바이너리와는 다른 파일에 저장되어 있는 경우, 즉 바이너리에 디버깅링크 섹션이 포함되어 있는 경우에는 동작하지 않습니다.아마도 누군가는 그것을 버그라고 부를 수 있을 것이다.readelf
.
이 문제는 다음 코드로 올바르게 처리됩니다.
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
자세한 내용은 GDB 매뉴얼의 개별 디버깅 파일을 참조하십시오.
OSX에서는dsymutil -s
그리고.dwarfdump
.
사용.dsymutil -s <lib_file> | more
디버깅 기호가 있는 파일에는 소스 파일 경로가 표시되지만 그 이외의 파일에는 함수 이름만 표시됩니다.
여기에는 objdump를 사용할 수 있습니다.
편집: man 페이지부터:
-W
--dwarf
Displays the contents of the DWARF debug sections in the file, if
any are present.
언급URL : https://stackoverflow.com/questions/1999654/how-can-i-tell-if-a-library-was-compiled-with-g
'programing' 카테고리의 다른 글
JPanel에 이미지를 추가하는 방법 (0) | 2022.08.12 |
---|---|
Vuex getter가 null을 반환함 (0) | 2022.08.12 |
Java에서 두 정수를 올바르게 비교하려면 어떻게 해야 합니까? (0) | 2022.08.12 |
스프링 데이터 JPA - "유형에 대한 속성을 찾을 수 없습니다" 예외 (0) | 2022.08.12 |
Vuex 모듈은 다른 Vuex 모듈을 감시할 수 있습니까? (0) | 2022.08.12 |