ldd 명령어는 특정 프로그램이 실행될 때 필요로 하는 공유 라이브러리(shared libraries)를 표시하는 리눅스 도구입니다. 프로그램이 정상적으로 실행되지 않을 때 누락된 의존성(dependency)을 파악하는 데 매우 유용하며, 빠진 함수나 오브젝트까지 함께 목록으로 보여줍니다.
ldd 명령어 기본 문법
오류 없이 명령어를 사용하려면 먼저 ldd의 올바른 문법을 숙지해야 합니다.
ldd [OPTION]... FILE...
위 명령어에서 [OPTION] 자리에 아래 옵션 중 하나 이상을 조합하여 사용할 수 있습니다.
- --help: 도움말을 출력하고 종료합니다.
- --version: 버전 정보를 출력하고 종료합니다.
- -d, --data-relocs: 데이터 재배치(data relocations)를 처리합니다.
- -r, --function-relocs: 데이터와 함수 재배치를 모두 처리합니다.
- -u, --unused: 사용되지 않는 직접 의존성을 출력합니다.
- -v, --verbose: 모든 정보를 상세하게 출력합니다.
ldd 명령어 사용 방법
프로그램에 대한 상세 정보를 확인하려면 다음과 같이 명령어를 실행합니다.
ldd -v /path/to/program/executable
실행 결과에는 버전 정보와 함께 각 공유 라이브러리의 경로와 메모리 주소가 표시됩니다.
libshared.so
linux-vdso.so.1 => (0x00007fff26ac8000)
libc.so.6 => /lib/libc.so.6 0x00007ff1df55a000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff1dfafe000)
누락된 라이브러리 찾기
필요한 SO 파일이 시스템에 존재하지 않는 경우, 다음 명령어로 어떤 라이브러리가 빠져 있는지 확인할 수 있습니다.
ldd -d path/to/program
출력 결과는 대략 다음과 같습니다.
linux-vdso.so.1 (0x00007ffc2936b000)
/home/gary/demo/garylib.so => not found
libc.so.6 => usr/lib/libc.so.6 (0x00007fd0c6259000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd0c65fd000)
위 예시에서 garylib.so => not found 부분이 바로 누락된 라이브러리를 나타냅니다. 이렇게 'not found'로 표시된 항목을 찾아 해당 라이브러리를 설치하거나 경로를 설정해 주면 됩니다.
보안 주의사항: 신뢰할 수 없는 프로그램에는 사용 금지
출처가 불분명하거나 신뢰할 수 없는 프로그램에 ldd를 실행해서는 안 됩니다. ldd는 내부적으로 해당 프로그램을 실제로 실행할 수 있기 때문에 악성 코드가 포함된 경우 위험할 수 있습니다.
대신 직접 의존성만 표시하고 전체 의존성 트리를 불러오지 않는 더 안전한 방법을 사용하는 것이 좋습니다.
objdump -p /path/to/program | grep NEEDED
애플리케이션 경로 찾는 방법
ldd로 프로그램의 의존성을 확인하려면 실행 파일의 전체 경로(full path)를 지정해야 합니다. 경로를 찾는 방법은 여러 가지가 있습니다.
예를 들어 Firefox의 경로를 찾으려면 다음과 같이 입력합니다.
find / -name firefox
그런데 find 명령어는 실행 파일뿐 아니라 Firefox와 관련된 모든 디렉터리를 한꺼번에 나열한다는 단점이 있습니다.
/etc/skel/.mozilla/firefox
/home//cache/mozilla/firefox
/home//.mozilla/firefox
/usr/bin/Firefox
/usr/lib/Firefox
/usr/lib/Firefox/Firefox
이 방식은 다소 비효율적이며, 검색 범위가 시스템 전체이므로 권한 부족으로 인한 permission-denied 오류가 발생할 수 있습니다. 이 경우 sudo 명령어로 권한을 상승시켜야 할 수도 있습니다.
대신 whereis 명령어를 사용하면 훨씬 간단하게 애플리케이션의 경로를 찾을 수 있습니다.
whereis firefox
출력 결과는 다음과 비슷하게 나타납니다.
/usr/bin/firefox
/etc/firefox
/usr/lib/firefox
Firefox의 공유 라이브러리 확인하기
경로를 확인했다면, 이제 다음 명령어로 Firefox가 사용하는 공유 라이브러리 목록을 조회할 수 있습니다.
ldd /usr/bin/firefox
명령어 출력은 대략 다음과 같습니다.
linux-vdso.so.1 (0x00007ffff8364000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007feb9917a000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007feb98f76000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007feb98bf4000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007feb988f6000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007feb986e0000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007feb9833c000)
/lib64/ld-linux-x86-64.so.2 (0x00007feb99397000)
출력 결과 해석하기
출력 형식을 이해하면 ldd를 더욱 효과적으로 활용할 수 있습니다.
- 라이브러리 이름: linux-vdso.so.1처럼 줄 맨 앞에 표시되는 것이 라이브러리의 이름입니다.
- 16진수 주소: 괄호 안의 16진수 값은 해당 라이브러리가 메모리에 로드된 주소를 의미합니다.
- => 기호와 경로: 많은 줄에서 => 기호 뒤에 경로가 붙어 있는데, 이것이 바이너리 파일의 실제 물리적 경로입니다. 그 뒤의 16진수는 라이브러리가 로드된 메모리 주소입니다.
이처럼 ldd 명령어 하나만 익혀두면 프로그램의 의존성 문제를 신속하게 진단하고, 누락된 라이브러리를 빠르게 해결할 수 있습니다.