Skip to content

Readelf

Dynamic section

runpath

RUNPATH 또는 RPATH 로 말하는 라이브러리를 찾는 경로이다.

실행 파일을 readelf -d ./answer-jet 같이 읽으면:

Dynamic section at offset 0x12fd50 contains 39 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libgstreamer-1.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libgobject-2.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libglib-2.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libgstapp-1.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libnvdsgst_helper.so]
 0x0000000000000001 (NEEDED)             Shared library: [libnvdsgst_meta.so]
 0x0000000000000001 (NEEDED)             Shared library: [libgstrtspserver-1.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [ld-linux-x86-64.so.2]
 0x000000000000001d (RUNPATH)            Library runpath: [/root/Project/answer-jet/build/external/local/lib:/opt/nvidia/deepstream/deepstream/lib]
 0x000000000000000c (INIT)               0xf000
 0x000000000000000d (FINI)               0xdc1e4
 0x0000000000000019 (INIT_ARRAY)         0x12c000
 0x000000000000001b (INIT_ARRAYSZ)       56 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x12c038
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x3d8
 0x0000000000000005 (STRTAB)             0x2578
 0x0000000000000006 (SYMTAB)             0x490
 0x000000000000000a (STRSZ)              9170 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x131000
 0x0000000000000002 (PLTRELSZ)           7608 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0xcc88
 0x0000000000000007 (RELA)               0x4d98
 0x0000000000000008 (RELASZ)             32496 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000000000001e (FLAGS)              BIND_NOW
 0x000000006ffffffb (FLAGS_1)            Flags: NOW PIE
 0x000000006ffffffe (VERNEED)            0x4c08
 0x000000006fffffff (VERNEEDNUM)         5
 0x000000006ffffff0 (VERSYM)             0x494a
 0x000000006ffffff9 (RELACOUNT)          1280
 0x0000000000000000 (NULL)               0x0

soname

soname 은 실제 만들 라이브러리인 libmy.so.0.0.0libmy.so.0 이라는 soname 을 생성하여 나중에 동적링크(/lib/ld-linux.so.2)가 공유 라이브러리를 찾을때 libmy.so.0.0.0 을 찾는게 아니라 soname 인 libmy.so.0 를 찾아 링크 하도록 한다.

버전 관리를 융통성 있게 하기 위함이며, 실제 gcc 가 링크 하는 파일명은 버전 정보가 없는 libmy.so 를 상용 하며, 이 또한 </code>libmy.so.0.0.0</code> 의 링크 파일로 만들어 사용 하는 것이다.

soname 필드는 readelf -d /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstopenmpt.so 와 같이 라이브러리를 읽으면 SONAME 항목으로 출력된다.

Dynamic section at offset 0x6d90 contains 31 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libgstbadaudio-1.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libgstaudio-1.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libgstreamer-1.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libgobject-2.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libglib-2.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libopenmpt.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000e (SONAME)             Library soname: [libgstopenmpt.so]
 0x000000000000000c (INIT)               0x2000
 0x000000000000000d (FINI)               0x4848
 0x0000000000000019 (INIT_ARRAY)         0x7d10
 0x000000000000001b (INIT_ARRAYSZ)       8 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x7d18
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x2f0
 0x0000000000000005 (STRTAB)             0xa68
 0x0000000000000006 (SYMTAB)             0x318
 0x000000000000000a (STRSZ)              2178 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000003 (PLTGOT)             0x8000
 0x0000000000000002 (PLTRELSZ)           1680 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x15b0
 0x0000000000000007 (RELA)               0x13b8
 0x0000000000000008 (RELASZ)             504 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x1388
 0x000000006fffffff (VERNEEDNUM)         1
 0x000000006ffffff0 (VERSYM)             0x12ea
 0x000000006ffffff9 (RELACOUNT)          16
 0x0000000000000000 (NULL)               0x0

library dependencies

ldd를 사용하거나 아래와 같이 입력하면 된다. NEEDED 로 표시된 항목이 라이브러리 이름이다.

$ readelf -d a.out | grep NEEDED

 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

See also

Favorite site