나는 현재 nm
주소와 유형과 함께 ELF 파일의 기호를 인쇄하는 유사한 프로그램을 작업 중입니다.
일반적인 출력은 다음과 같습니다.
$ nm ./my_exec
0000000000003d28 d _DYNAMIC
0000000000003f28 d _GLOBAL_OFFSET_TABLE_
0000000000002000 R _IO_stdin_used
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
첫 번째 열은 기호 주소, 두 번째 열은 기호 유형, 세 번째 열은 기호 이름입니다.
man은 각 문자의 의미를 나타내며, 대문자는 전역 기호, 소문자는 지역 기호 등입니다.
하지만 난 이해가 안 돼요어떻게사용할 문자를 선택합니다.
라이브러리를 사용하고 Gelf
있는데 문자를 확인할 수 있는 필드가 표시되지 않습니다.
답변1
nm
캐릭터는 주로 기호가 나타나는 부분을 기준으로 선택됩니다. ELF는 다음에 지정됩니다.시스템 V ABI;기호 테이블은 4-22 페이지에 설명되어 있으며 두 개의 필드로 구성 됩니다 st_info
.st_shndx
표시된 문자nm
.
심볼 바인딩( ELF32_ST_BIND(st_info)
)은 해당 심볼이 로컬 심볼( 의 소문자 nm
)인지, 글로벌 심볼(대문자)인지, 약한 심볼( v
, w
)인지를 결정합니다. sh_shndx
기호가 포함된 부분을 가리키며 많은 nm
s 문자는 이를 명시적인 부분( b
, d
...) 또는 특별한 의미가 있는 값( )으로 반영합니다.예를 들어 u
, 정의되지 않은 기호 의 경우 SHN_UNDEF
).
따라서 표시된 문자에 직접적으로 해당하는 단일 값을 찾을 수는 없지만 nm
위의 내용은 ABI 사양에 설명된 대로 값을 해석하는 데 충분한 정보를 제공해야 합니다.