![`nm` 각 기호 유형에 대해 인쇄할 문자를 선택하는 방법은 무엇입니까?](https://linux55.com/image/203450/%60nm%60%20%EA%B0%81%20%EA%B8%B0%ED%98%B8%20%EC%9C%A0%ED%98%95%EC%97%90%20%EB%8C%80%ED%95%B4%20%EC%9D%B8%EC%87%84%ED%95%A0%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20%EC%84%A0%ED%83%9D%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
나는 현재 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 사양에 설명된 대로 값을 해석하는 데 충분한 정보를 제공해야 합니다.