다음과 같이 연결된 실행 파일이 있습니다.
$ ldd a.out
libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.
libcrypto 및 libssl 라이브러리는 openssl 1.0.0-fips 라이브러리입니다. 나는 1.0.1 라이브러리를 사용해 보고 싶었기 때문에 내 홈 디렉터리에 라이브러리를 구축했습니다. a.out
새로운 openssl 라이브러리에 쉽게 다시 연결할 수 있는 방법이 있습니까 ? 나는 피하고 싶다
- 다시 연결해야 함
a.out
(빌드 도구가 매우 복잡하기 때문에) - 전역 설정 변경(다른 개발자가 이 컴퓨터에서 작업하므로)
여기서 내가 원하는 대로 할 수 있나요?
답변1
이 특정 구현을 일시적으로 다른 라이브러리로 바꿀 수 있습니다. Linux에서 환경 변수 LD_LIBRARY_PATH는 표준 디렉터리 집합보다 먼저 라이브러리를 검색해야 하는 콜론으로 구분된 디렉터리 집합입니다. 이는 새 라이브러리를 디버깅하거나 특수 목적으로 비표준 라이브러리를 사용할 때 유용합니다. 환경 변수 LD_PRELOAD는 /etc/ld.so.preload와 같이 표준 세트를 다루는 기능이 있는 공유 라이브러리를 나열합니다. -공유 라이브러리
로더를 직접 호출할 수도 있습니다.
/lib/ld-linux.so.2 --라이브러리 경로
path
executable
답변2
환경 변수를 설정하는 래퍼 스크립트를 작성합니다 LD_LIBRARY_PATH
. PATH
공유 라이브러리 위젯 입니다 . 시스템 검색 경로는 항상 에 나열된 디렉토리를 검색합니다 $LD_LIBRARY_PATH
. 보다동적 링커 매뉴얼참고용.
#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"
또는 명령줄에서 한 번에 직접:
LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out
또는 바이너리를 수정하려면 다음을 시도하십시오.chrpath, 실행 파일 내에서 기본 제공 라이브러리 검색 경로를 편집할 수 있습니다.