리눅스 nm 명령어 사용 방법 (.so 파일 구성)
- 운영체제(OS)
- 2023. 8. 25.
리눅스에서 nm 명령어는 객체 파일이나 실행 파일에 어떤 심볼(함수, 변수 등)이 포함되어 있는지 확인할 때나 링킹 오류가 발생했을 때 원인을 파악하기 위해 주로 사용됩니다.
예를 들어, nm으로 확인할 수 있는 심볼은 이런 겁니다. 아래와 같은 c 프로그램이 있을 때
#include <stdio.h>
int globalVar = 10;
int add(int a, int b) {
return a + b;
}
int main() {
printf("Hello, World!\\n");
return 0;
}
이 코드를 컴파일하고 nm으로 심볼을 확인하면 아래와 같은 결과를 얻을 수 있습니다.
...
00000000004005b6 T add
...
00000000004005ca T main
...
0000000000601038 D globalVar
...
U printf
...
- T : 텍스트(코드) 섹션에 있는 심볼을 나타냅니다. add와 main 함수가 이에 해당됩니다.
- D : 초기화된 데이터 섹션에 있는 심볼을 나타냅니다. globalVar가 이에 해당됩니다.
- U : 정의되지 않은 심볼을 나타냅니다. printf 함수는 작성한 코드에 직접 정의되어 있지 않기 때문에 U로 표시됩니다.
리눅스 nm
구문
nm [객체 파일]
예시)
예를 들어, 리눅스 배포판에 있는 C표준 라이브러리인 libc.so.6을 nm으로 확인해보겠습니다. 매우 많은 심볼이 출력됩니다.
[root@localhost lib64]# nm libc.so.6
0000000000043990 T a64l
000000000017e900 r a64l_table
0000000000037930 T abort
00000000003c9b70 b abortfunc
00000000003c8e00 B __abort_msg
000000000003a1d0 T abs
00000000000ff5f0 W accept
00000000000ff5f0 t __accept
00000000000ffd90 T accept4
00000000000ff5f9 t __accept_nocancel
00000000000efa50 W access
00000000000efa50 t __access
.
.
.
옵션을 사용하면 심볼별로 나열할 수 있습니다. 예를 들어, 정의되지 않은 심볼을 나타내는 U는 장치에 존재하는 다른 공유 라이브러리에서 참조하는 심볼입니다.
[root@localhost lib64]# nm -u libc.so.6
U _dl_argv@@GLIBC_PRIVATE
v _dl_starting_up@@GLIBC_PRIVATE
U __libc_enable_secure@@GLIBC_PRIVATE
U _rtld_global@@GLIBC_PRIVATE
U _rtld_global_ro@@GLIBC_PRIVATE
U __tls_get_addr@@GLIBC_2.3
만약 GLIBC 관련해서만 찾고 싶다면 grep을 쓰면 됩니다.
[root@localhost lib64]# nm libc.so.6 | grep GLIBC
00000000003c8168 D __ctype32_b@GLIBC_2.2.5
00000000003c8150 D __ctype32_tolower@GLIBC_2.2.5
00000000003c8148 D __ctype32_toupper@GLIBC_2.2.5
00000000003c8170 D __ctype_b@GLIBC_2.2.5
00000000003c8160 D __ctype_tolower@GLIBC_2.2.5
00000000003c8158 D __ctype_toupper@GLIBC_2.2.5
U _dl_argv@@GLIBC_PRIVATE
v _dl_starting_up@@GLIBC_PRIVATE
000000000006e040 T fclose@@GLIBC_2.2.5
000000000006e320 T fdopen@@GLIBC_2.2.5
000000000006e7b0 T fgetpos64@@GLIBC_2.2.5
000000000006e7b0 T fgetpos@@GLIBC_2.2.5
00000000000ce230 T fnmatch@@GLIBC_2.2.5
000000000006ee20 T fopencookie@@GLIBC_2.2.5
반응형
'운영체제(OS)' 카테고리의 다른 글
아마존 리눅스 2023 PostgreSQL15 설치하는 방법 (0) | 2023.08.26 |
---|---|
리눅스 GLIBC 패키지란? 호환성 문제에 대해 (0) | 2023.08.26 |
리눅스 watch 명령어 사용 방법 (데이터 변화 확인) (0) | 2023.08.24 |
리눅스 systemctl 등록된 서비스 이름 확인하는 방법 (0) | 2023.08.24 |
윈도우 인스톨러 (Windows Installer)란? (0) | 2023.08.07 |