ELF 파일 포맷에는 동적 라이브러리에 대한 의존성 태그가 포함되어 있으며, 다음과 같은 명령어들로 확인할 수 있다.
maeryo@aftermath.kr:~$ readelf -a "파일명" | grep NEED maeryo@aftermath.kr:~$ ldd "파일명" |
컴파일 시 -l 옵션을 이용하여 동적 라이브러리들을 링크할 때 실제로 참조하지 않는 라이브러리들은 ELF Dynamic Section에 기록되지 않는다.
최신 GCC 기준으로 기본값은 --as-needed 이며 실제 참조한 라이브러리만 기록하게 되는데, 경우에 따라서 반대의 경우가 필요한 상황이 있다.
다음은 간단한 예시이다.
/* test.c */ #include <stdio.h> int main() { printf("Hello World!\n"); return 0; } |
위와 같은 내용이 담긴 test.c 라는 소스 파일이 있다고 가정하겠다.
1. 일반
maeryo@aftermath.kr:~$ gcc -Wall test.c -o test maeryo@aftermath.kr:~$ readelf -a test | grep NEED [ 8] .gnu.version_r VERNEED 0000000000400360 00000360
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000006ffffffe (VERNEED) 0x400360
0x000000006fffffff (VERNEEDNUM) 1 maeryo@aftermath.kr:~$ ldd test linux-vdso.so.1 => (0x00007fff94520000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc7c2841000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc7c2c15000) |
2. -lz 추가
maeryo@aftermath.kr:~$ gcc -Wall test.c -o test -lpthread -lz maeryo@aftermath.kr:~$ readelf -a test | grep NEED [ 8] .gnu.version_r VERNEED 0000000000400360 00000360
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000006ffffffe (VERNEED) 0x400360
0x000000006fffffff (VERNEEDNUM) 1 maeryo@aftermath.kr:~$ ldd test linux-vdso.so.1 => (0x00007fff94520000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc7c2841000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc7c2c15000) |
3. -Wl,--no-as-needed 명령어와 -lz 사용시
maeryo@aftermath.kr:~$ gcc -Wall test.c -o test -Wl,--no-as-needed -lz maeryo@aftermath.kr:~$ readelf -a test | grep NEED [ 8] .gnu.version_r VERNEED 0000000000400398 00000398
0x0000000000000001 (NEEDED) Shared library: [libz.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000006ffffffe (VERNEED) 0x400398
0x000000006fffffff (VERNEEDNUM) 1 maeryo@aftermath.kr:~$ ldd test linux-vdso.so.1 => (0x00007fffc703e000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fb753bfc000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb75383c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb753e27000) |