2011-05-10 3 views
12

디버깅 심볼을 사용하여 ELF 오브젝트 파일에서 모든 C 구조체의 크기를 추출하는 방법은 무엇입니까?ELF 오브젝트 파일에서 C 구조체 크기를 덤핑하십시오.

개별 구조체 크기는 "print sizeof (some_struct)"를 사용하여 GDB에서 얻을 수 있지만 필요한 것은 모든 구조 목록을 얻는 것입니다.

"nm"및 "objdump"를 보았지만 찾고있는 옵션이 표시되지 않습니다. 표준 Unix 툴을 사용하여이 작업을 수행하는 방법이 있습니까? 아니면 ELF 파일에서 디버그 기호 섹션을 추출하여 직접 처리해야합니까? 나는 그것이 후자가 아니기를 바라고있다.

미리 조언 해 주셔서 감사합니다. 레이

답변

0

다른 사람이 뭔가를 안다면, nm의 출력을 처리해야한다고 생각합니다.

그러나 nm은 각 구조체의 시작 부분 만 제공하므로 끝 부분에 대해 아무 것도 모릅니다. 따라서 각 스트럿에 다른 기호가 바로 나오지 않으면 작동하지 않을 수도 있습니다. 이 문제에주의하십시오!

+0

답장을 보내 주셔서 감사합니다. 그러나 nm을 모든 유형 (즉, 구조체)으로 나열하고 주소가있는 기호 만 표시 할 수는 없습니다. –

11

.debug_info 섹션을 파헤쳐 야합니다. - 드워프 매개 변수를 사용하여 objdump를 실행하면이 파일이 덤프됩니다.

* DW_TAG_structure_type * 및 DW_AT_byte_size * 속성은 sizeof와 같습니다. 표준 유닉스 도구는이 데이터를보다 읽기 쉬운 목록으로 포맷하기에 충분해야합니다.

+0

정말 고마워요. 이제 출력을 처리하기 위해 Perl 스크립트를 작성하면됩니다. –

+0

@Ray Balogh 비슷한 것을하는 Perl 스크립트 인 pstruct에 관심이있을 것입니다. http://perldoc.perl.org/pstruct.html – sigjuice

+0

매우 유용한 기능입니다. –

3

패키지 드워프를 설치하면 "pahole"명령이 실행됩니다.

사용 "pahole"는 ELF 오브젝트 파일에 대한 명령은 모든 구조 정보를 얻을 수 있습니다, 또는 당신은 예를 들어, 특정 구조의 이름으로 "-C"매개 변수를 사용할 수 있습니다 :

$ pahole의 vmlinux -C task_struct