시스템에 바이너리가 설치되어 있으며, 주어진 함수의 디스 어셈블리를보고 싶습니다. 바람직하게는 objdump
을 사용하지만, 다른 해결책도 또한 허용 될 수있다.objdump를 사용하여 하나의 함수를 분해하십시오.
this questions 경계 주소 만 알면 코드의 일부를 분해 할 수 있다는 것을 알게되었습니다. this answer에서 분할 디버그 기호를 다시 단일 파일로 변환하는 방법을 배웠습니다.
심지어 단일 파일에서 작동하고 모든 코드를 분해 (즉, 시작 또는 중지 주소가 없지만 -d
매개 변수는 objdump
) 매개 변수로 설정하더라도 그 기호는 어디에도 표시되지 않습니다. 문제의 함수가 정적이기 때문에 어떤 의미를 가지므로 내 보낸 것이 아닙니다. 그럼에도 불구하고 valgrind
은 함수 이름을보고하므로 어딘가에 저장해야합니다.
디버그 섹션의 세부 정보를 보면 .debug_str
섹션에 언급 된 이름이 있지만 주소 범위로 바꿀 수있는 도구를 알지 못합니다.
사소한 보조 노트 : 함수는'static' 표시되어 있으면 컴파일러에서 호출 사이트로 인라인 될 수 있습니다.이것은 실제로 분해 할 수있는 기능이 없을 수도 있음을 의미합니다. 찾고있는 함수가 아닌 다른 함수의 기호를 찾아 낼 수 있다면 함수가 인라인되었음을 알리는 강력한 힌트입니다. Valgrind는 ELF 파일 디버깅 정보가 지침이 다른 곳으로 옮겨 졌더라도 각 개별 명령의 출처를 저장하기 때문에 원래의 사전 인라인 함수를 계속 참조 할 수 있습니다. – davidg
@ davidg : true이지만, Tom의 답변이이 경우에 효과가있어이 경우가 아닌 것 같습니다. 그럼에도 불구하고 예를 들어 어셈블리 코드에 각 명령어의 출처에 대한 정보를 주석으로 추가 하시겠습니까? – MvG
좋은 소식입니다! 'addr2line'은'stdin'으로부터 PC/IP를 받아들이고 해당 소스 코드 행을 출력합니다. 비슷하게,'objdump -l'은 objdump를 소스 라인과 섞을 것입니다; 무거운 인라인이있는 고도로 최적화 된 코드의 경우, 두 프로그램의 결과가 항상 도움이되는 것은 아닙니다. – davidg