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.0
에 libmy.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]