링커가 테스트용 .so 라이브러리를 찾는 데 사용하는 경로 중 일부를 제거하고 싶습니다.
라이브러리 경로를 추가하는 방법을 찾았습니다.
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library"
예를 들어 링커에 없지만 링커에서 선택한 경로 나 LD_LIBRARY_PATH
라이브러리 경로를 제거하는 데 사용할 수 있는 유사한 변수가 있습니까 ? 즉, /etc/ld.so.conf.d/에 지정된 경로를 무시하는 방법은 무엇입니까?/usr/local/lib
/usr/lib
LD_LIBRARY_PATH
그 이유는 주어진 실행 파일에 대해 라이브러리 종속성을 재귀적으로 찾는 프로그램을 만드는 데 바쁘기 때문입니다. 모든 종속성을 찾고, 해당 종속성을 로컬 디렉터리에 복사하고, 로컬에서 실행되어 LD_LIBRARY_PATH를 설정한 다음 실행 파일을 실행하는 bash 스크립트를 만들어 프로그램의 이식성을 높일 수 있는지 확인하고 싶었습니다. 이전에 중요한 라이브러리 검색 경로를 제거한 후 로컬로 실행되는 이 실행 파일이 작동하는지 테스트하고 싶습니다.
답변1
당신은 관심이있을 수 있습니다제거하다라이브러리 경로(제공된 경우)공유됨라이브러리는 다음을 통해 경로를 포함합니다.길특징. 링커가 라이브러리를 만들 때 추가됩니다.
다음을 사용하여 이러한 경로를 제거(또는 변경)할 수 있습니다.chrpath
,예를 들어,
chrpath -d mylibraryfile.so
변수에서 경로 이름을 제거하는 것도 LD_LIBRARY_PATH
관심을 가질 수 있는 영역입니다. 문자열 대체를 수행하고 변수를 다시 내보내면 됩니다. 그러나 이 질문은 이것과 관련이 없는 것 같습니다. 오프셋할 변수가 없습니다 LD_LIBRARY_PATH
.
~을 위한보다언급된 라이브러리 종속성은 /etc/ld.so.conf.d/
플랫폼이 Linux로 제한되는 것처럼 들립니다. 를 사용하여 종속성을 나열 할 수 있습니다 ldd
. OSX 외에도 모든 BSD도 지원됩니다 ldd
. 이 목적으로 사용하는 스크립트 중 하나는 다음과 같습니다.
#!/bin/sh
# $Id: ldd-path,v 1.1 2007/07/09 19:30:28 tom Exp $
# Edit the output of ldd for the given parameters, yielding only the
# absolute pathnames.
ldd $* | sed \
-e 's/([^)]*)//g' \
-e 's/^.*=>//' \
-e 's/[ ][ ]*//g' \
-e '/^$/d'
그러나 (주석에 대한 응답으로) 로더에게 알리는 이식 가능한 메커니즘은 없습니다.소홀히 하다기존 경로. GNU ld 문서는 찾고 있는 내용에 대한 요약과 설명 순서를 제공합니다.-rpath
옵션. 목록의 마지막 항목은 다음과 같습니다.
- 기본 디렉토리는 일반적으로
/lib
및/usr/lib
.- ELF 시스템의 네이티브 링커의 경우 파일이
/etc/ld.so.conf
존재하는 경우 파일에서 찾은 디렉터리 목록입니다.
추가 읽기