리눅스 ldd, 공유 라이브러리 의존성 확인 방법

리눅스에서 공유 라이브러리 의존성을 확인할 때 ldd 명령어를 사용합니다. 라이브러리는 정적 라이브러리, 동적 (또는 공유) 라이브러리로 구분할 수 있습니다. 정적 라이브러리는 실행 파일에 포함시켜 배포하며, 동적 라이브러리는 독립적으로 존재하되 실행 파일 런타임 시 연결되는 형태입니다. 즉 프로그램에 자동으로 사용되지만 독립적으로 존재합니다. 리눅스에서는 주로 .o 또는 .so 파일 확장자입니다.

 

ldd가 확인해주는 건 이런 공유 라이브러리가 정상적으로 존재하는지입니다. 가령, 리눅스의 명령어들도 모두 공유 라이브러리가 사용됩니다. cp라는 명령 기능을 하나 사용해도 libselinux.so, librt.so, libacl.so, libattr.so … 등 여러 라이브러리가 필요합니다. 그중 하나라도 없으면 cp는 동작할 수 없습니다. 그래서 ‘의존성’이라고 부릅니다.

ldd

ldd 구문

ldd [옵션] 실행 파일

ldd 예시

cp 명령어의 공유 라이브러리 의존성을 확인하는 방법은 아래와 같습니다.

$ ldd /bin/cp
    linux-vdso.so.1 =>  (0x00007fffaf3ff000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a06a00000)
    librt.so.1 => /lib64/librt.so.1 (0x0000003a06200000)
    libacl.so.1 => /lib64/libacl.so.1 (0x0000003a13000000)
    libattr.so.1 => /lib64/libattr.so.1 (0x0000003a0ea00000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003a05200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003a05a00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003a04a00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003a05600000)

이처럼 cp 명령어를 동작하는데 필요한 라이브러리가 모두 메모리에 로드된 것을 확인할 수 있습니다.

 

만약 라이브러리를 찾지 못하면 확인된 경로 대신 not found라는 결과를 출력합니다. 그런 경우 모듈의 경로를 제대로 인식하지 못했거나 모듈이 존재하지 않는 것이니 확인이 필요합니다.

 

ldd는 동적 실행 파일에서만 작동합니다. 그렇지 않으면 아래와 같은 메시지를 출력합니다.

Output:
     not a dynamic executable

실행 파일을 입력할 땐 반드시 전체 경로를 입력해야 합니다. 그렇지 않으면 동작하지 않습니다. 그게 번거롭다면 which 명령어를 사용할 수도 있습니다.

$ which pwd
/usr/bin/pwd

$ ldd `which pwd`
        linux-vdso.so.1 (0x00007ffc3b9e4000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f2d491a9000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2d49396000)
반응형

댓글

Designed by JB FACTORY