'no-as-needed'에 해당되는 글 1건

  1. -Wl,--no-as-needed 옵션

-Wl,--no-as-needed 옵션

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)