본문 바로가기
IT/linux

바이너리 동적 라이브러리 링크 확인, Dynamic linker

by 어느해겨울 2022. 9. 7.

바이너리 동적 라이브러리 링크 확인, Dynamic linker

 
readelf 명령을 이용하여 바이너리가 어떤 동적 라이브러리를 링크하고 있는지 확인해본다.
해당 명령어는 ELF files의 정보를 나타내고 각 옵션을 통해 다양한 정보를 취득할 수 있다.
본인은 여기서 동적 라이브러리 정보만 다룰 것이니 자세한 옵션 목록은 아래 man page를 참고하자.

https://man7.org/linux/man-pages/man1/readelf.1.html

 

readelf(1) - Linux manual page

readelf(1) — Linux manual page READELF(1) GNU Development Tools READELF(1) NAME         top readelf - display information about ELF files SYNOPSIS         top readelf [-a|--all] [-h|--file-header] [-l|--program-headers|--segments] [-S|--section-h

man7.org

 

명령 수행 : readelf -d [대상] 

-d 옵션을 이용하여 동적 섹션정보만 확인한다.

% readelf -d /usr/bin/expect

Dynamic section at offset 0x1dc8 contains 28 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libexpect5.45.so]
 0x0000000000000001 (NEEDED)             Shared library: [libtcl8.5.so]
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x400b28
 0x000000000000000d (FINI)               0x400f04
 0x0000000000000019 (INIT_ARRAY)         0x601db0
 0x000000000000001b (INIT_ARRAYSZ)       8 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x601db8
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x400298
 0x0000000000000005 (STRTAB)             0x400670
 0x0000000000000006 (SYMTAB)             0x4002f8
 0x000000000000000a (STRSZ)              566 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x602000
 0x0000000000000002 (PLTRELSZ)           384 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x4009a8
 0x0000000000000007 (RELA)               0x400930
 0x0000000000000008 (RELASZ)             120 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x4008f0
 0x000000006fffffff (VERNEEDNUM)         1
 0x000000006ffffff0 (VERSYM)             0x4008a6
 0x0000000000000000 (NULL)               0x0

이 중 'NEEDED' 만 추려서 다시 보자.

 

명령 수행 : readelf -d [대상] | grep 'NEEDED'

% readelf -d /usr/bin/expect | grep 'NEEDED'
4: 0x0000000000000001 (NEEDED)             Shared library: [libexpect5.45.so]
5: 0x0000000000000001 (NEEDED)             Shared library: [libtcl8.5.so]
6: 0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
7: 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
8: 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

 

해당 바이너리가 어떤 동적 라이브러리를 링크하고 있는지 확인할 수 있다.

가리키고 있는 라이브러리의 버전이나 어떤 라이브러리를 사용하는지 파악할 때 쓰인다.

댓글