새 라이브러리가있는 경로를 추가합니다 LD_LIBRARY_PATH
(Mac에서는 이름이 약간 다릅니다 ...).
솔루션은 -L/my/dir -lfoo
옵션 을 사용하여 작동해야 하며 런타임시 LD_LIBRARY_PATH를 사용하여 라이브러리 위치를 가리 킵니다.
LD_LIBRARY_PATH 사용에주의하십시오 -간단히 말해서 (링크에서) :
..implications .. :
보안 : LD_LIBRARY_PATH에 지정된 디렉토리가 표준 위치보다 먼저 (!) 검색된다는 것을 기억하십니까? 이런 식으로, 불쾌한 사람이 악성 코드가 포함 된 공유 라이브러리 버전을 애플리케이션에로드하도록 할 수 있습니다! 이것이 setuid / setgid 실행 파일이 해당 변수를 무시하는 이유 중 하나입니다!
공연: 링크 로더는 공유 라이브러리가있는 디렉토리를 찾을 때까지 지정된 모든 디렉토리를 검색해야합니다. 모든 공유 라이브러리의 경우 응용 프로그램이 링크됩니다! 이것은 open ()에 대한 많은 시스템 호출을 의미하며, "ENOENT (해당 파일 또는 디렉토리 없음)"로 실패합니다! 경로에 많은 디렉토리가 포함 된 경우 실패한 호출 수가 선형 적으로 증가하며 애플리케이션 시작 시간에서이를 알 수 있습니다. 디렉토리의 일부 (또는 전체)가 NFS 환경에 있으면 응용 프로그램의 시작 시간이 실제로 길어질 수 있으며 전체 시스템 속도가 느려질 수 있습니다!
불일치: 이것이 가장 일반적인 문제입니다. LD_LIBRARY_PATH는 응용 프로그램이 링크되지 않은 공유 라이브러리를로드하도록 강제하며 이는 원래 버전과 호환되지 않을 가능성이 높습니다. 이것은 매우 명백 할 수 있습니다. 즉, 응용 프로그램이 충돌하거나, 선택한 라이브러리가 원래 버전에서 수행 한 작업을 수행하지 않는 경우 잘못된 결과가 발생할 수 있습니다. 특히 후자는 때때로 디버그하기 어렵습니다.
또는
링커에 gcc를 통해 rpath 옵션을 사용하십시오-런타임 라이브러리 검색 경로는 표준 dir (gcc 옵션)을 찾는 대신 사용됩니다.
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
이것은 임시 솔루션에 좋습니다. 링커는 표준 디렉토리를 조사하기 전에 먼저 LD_LIBRARY_PATH에서 라이브러리를 검색합니다.
LD_LIBRARY_PATH를 영구적으로 업데이트하지 않으려면 명령 줄에서 즉시 수행 할 수 있습니다.
LD_LIBRARY_PATH=/some/custom/dir ./fooo
링커가 사용에 대해 알고있는 라이브러리 (예제)를 확인할 수 있습니다.
/sbin/ldconfig -p | grep libpthread
libpthread.so.0 (libc6, OS ABI: Linux 2.6.4) => /lib/libpthread.so.0
또한 애플리케이션이 사용중인 라이브러리를 확인할 수 있습니다.
ldd foo
linux-gate.so.1 => (0xffffe000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7f9e000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7e6e000)
librt.so.1 => /lib/librt.so.1 (0xb7e65000)
libm.so.6 => /lib/libm.so.6 (0xb7d5b000)
libc.so.6 => /lib/libc.so.6 (0xb7c2e000)
/lib/ld-linux.so.2 (0xb7fc7000)
libdl.so.2 => /lib/libdl.so.2 (0xb7c2a000)
libz.so.1 => /lib/libz.so.1 (0xb7c18000)
libfoo.*
파일이 존재하고 -.so
/ O를 w.0
,.a
, 등 등?