ld (linker) 검색 경로를 인쇄하는 방법


153

검색 순서대로 ld 에서 찾은 검색 경로를 인쇄하는 방법은 무엇입니까?

답변:


96

다음 명령을 실행하여이를 수행 할 수 있습니다.

ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012

gcc 는 몇 가지 추가 -L 경로를 링커에 전달합니다. 링커는 다음 명령으로 나열 할 수 있습니다.

gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,;  ,g' | tr \; \\012

그들이 참조 때문에 경로는 경로가 검색과 동일하지 런타임 동적 링커 (즉, 프로그램이 실행될 때마다)로 검색에 사용 ld.so.conf 때문에 ldconfig을 제안하는 응답이 올바르지 LD (즉마다 프로그램이 연결되어 있습니다).


2
당신은 그 자리를 쳤다. 연결 과정에서 연결 문제가 발생합니다. 링커에서 수동으로 설치된 라이브러리를 찾아 라이브러리 /usr/local/..누락이 발생하여 연결이 실패합니다. /usr/local해당 검색 경로를 제외 하려면 매번 이름을 바꿔야 합니다. /usr/local경로 를 제외하거나 무시하는 간단한 방법이 있습니까?
kenn

1
GCC에 -L 옵션을 사용하여 라이브러리 경로를 수동으로 지정하려고 시도 할 수 있습니다. 시스템 라이브러리 경로를 무시할 것이라고 생각합니다. 컴파일하기 전에 LIBRARY_PATH env 변수를 설정해 볼 수도 있습니다 : $ LIBRARY_PATH = / somedir / gcc ...
faken

1
커맨드 라인에서 링크를 컴파일한다는 것을 알고 있습니다. ld검색 경로 를 재정의하는 글로벌 방법을 의미했습니다 . 예를 들어 때때로 나는에서 소스 코드를 컴파일해야 makefile또는 생성 메이크 파일을 configure스크립트 나에서 CMakeLists.txt나 같은 더 복잡한 것들 vala이나 srt. ld이런 경우 검색 경로 를 수정하기가 어렵습니다
kenn

CMake를 사용하는 경우 구성 단계에서 사용되는 정확한 라이브러리를 선택할 수 있습니다 (이러한 항목 중 일부는 고급 모드에서만 표시됨). Autotools의 스크립트 구성에 대해서는 stackoverflow.com/questions/7561509/…를 참조하십시오 . 이것은 귀하의 질문에 직접 대답하지는 않지만 원하는 것을하는 데 도움이 될 수 있습니다.
위조

82

리눅스에서, 당신은 사용할 수있는 ldconfig디렉토리에 의해 검색 인쇄하려면 ld.so 구성 및 캐시를 유지하는, ld.so

ldconfig -v 2>/dev/null | grep -v ^$'\t'

ldconfig -v링커 (리딩 탭 없음) 및 해당 디렉토리에있는 공유 라이브러리 (리딩 탭 있음)가 검색 ​​한 디렉토리를 인쇄합니다. 는 grep디렉토리를 가져옵니다. 내 컴퓨터 에서이 줄이 인쇄됩니다.

/usr/lib64/atlas:
/usr/lib/llvm:
/usr/lib64/llvm:
/usr/lib64/mysql:
/usr/lib64/nvidia:
/usr/lib64/tracker-0.12:
/usr/lib/wine:
/usr/lib64/wine:
/usr/lib64/xulrunner-2:
/lib:
/lib64:
/usr/lib:
/usr/lib64:
/usr/lib64/nvidia/tls: (hwcap: 0x8000000000000000)
/lib/i686: (hwcap: 0x0008000000000000)
/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib/sse2: (hwcap: 0x0000000004000000)
/usr/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib64/sse2: (hwcap: 0x0000000004000000)

hwcap줄에 없는 첫 번째 경로 는 내장되어 있거나 /etc/ld.so.conf에서 읽습니다. 그런 다음 링커는 기본 sse2CPU 검색 경로에서 추가 CPU 기능에 해당하는 이름으로 추가 디렉토리를 검색 할 수 있습니다 . 이 경로 hwcap에는 라인에있는 이러한 CPU 기능에 맞게 조정 된 추가 라이브러리가 포함될 수 있습니다.

마지막 참고 사항 : 위 -p대신 사용 -v하면 ld.so캐시가 대신 검색 됩니다.


51
그는 로더 (ld.so)가 아닌 링커 (ld)에 대해 묻습니다!
fons

3
내가 설정하면 export LD_LIBRARY_PATH=/some/other/dir이 명령의 출력에 영향을 미치지 않을 수 있습니까 ?! 100 % 작동하지 않는 것 같습니다.
TMS

3
@fons Funnything은 내가이 답변을 찾고 여기에 있다는 것입니다. :) 링크 타임 또는 런타임 경로? 그게 문제인 것 같아 LIBRAY_PATH (링크 시간) vs LD_LIBRARY_PATH
Daniel Santos

2
ldconfig가 실제로 런타임 링커와 동일한 디렉토리를 검색하지 않는 일부 플랫폼 (예 : Linaro 툴체인이있는 팔)에서 발견했습니다. 당신은 할 수 출력의 검색 경로를 얻고,에서 경로를 포함 LD_LIBRARY_PATH디버깅을 가능하게함으로써. 예를 들어 LD_DEBUG=libs /lib/ld-linux.so --list cat(모든 실행 파일을 사용할 수 있으며, 내가 cat생각할 수있는 첫 번째 항목으로 선택 했습니다). " search path"를 grepping 할 가치가 있습니다 . 참고이있는 경우에하는 것이 /etc/ld.so.cache필요한 모든 libs와 일치를, 당신이보고받지 않습니다 내장 된 시스템 검색 경로, 그것은 지금까지 그을받지 않습니다 때문이다.
John O'M.

gcc검색 경로는 다음과 같은?
nn0p

68

전체 유효 검색 경로를 단순히 인쇄하기위한 옵션이 있는지 확실하지 않습니다.

그러나 검색 경로는 -L명령 줄의 옵션으로 지정된 디렉토리 SEARCH_DIR("...")와 링커 스크립트의 지시문으로 검색 경로에 추가 된 디렉토리로 구성됩니다 . 따라서 두 가지를 모두 볼 수 있다면 다음과 같이 해결할 수 있습니다.

ld직접 호출하는 경우 :

  • -L옵션은 그들이 말한대로입니다.
  • 링커 스크립트를 보려면 --verbose옵션을 추가하십시오 . SEARCH_DIR("...")일반적으로 출력 상단 근처 에서 지시문을 찾으십시오 . (이것은 매번 호출 할 때마다 반드시 동일하지는 않습니다 ld. 링커에는 여러 가지 기본 제공 기본 링커 스크립트가 있으며 다양한 다른 링커 옵션을 기반으로 스크립트를 선택합니다.)

를 통해 연결하는 경우 gcc:

  • 링커를 호출하는 방법을 보여 주도록 -v옵션을 전달할 수 있습니다 gcc. 실제로 일반적으로 ld직접 호출하지는 않지만 collect2(내부 디렉토리 중 하나에있는) 이라는 도구를 통해 간접적으로 호출합니다 ld. -L사용중인 옵션이 표시 됩니다.
  • 링커로 전달되도록 옵션에 추가 -Wl,--verbose하여 위에서 설명한 링커 스크립트를 볼 수 있습니다.gcc--verbose

5
링커의 --verbose 옵션이 트릭을 수행했습니다. 매우 도움이되었습니다!
Ari

링커가 어디에서 찾고 있는지 알아 내려고 노력했지만 출력에서 ​​SEARCH_DIR을 찾지 못했습니다. -T script스크립트를 사용하면서 ld의 기본 스크립트를 완전히 대체하고 내가 지적한 부분 만 보았습니다.
thomasa88

30

Linux에서 gcc 및 clang에 대해 가장 호환 가능한 명령은 armando.sano 덕분입니다.

$ gcc -m64 -Xlinker --verbose  2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g'  | grep -vE '^$'

을 주면 -m32올바른 라이브러리 디렉토리가 출력됩니다.

내 컴퓨터의 예 :

에 대한 g++ -m64:

/usr/x86_64-linux-gnu/lib64
/usr/i686-linux-gnu/lib64
/usr/local/lib/x86_64-linux-gnu
/usr/local/lib64
/lib/x86_64-linux-gnu
/lib64
/usr/lib/x86_64-linux-gnu
/usr/lib64
/usr/local/lib
/lib
/usr/lib

에 대한 g++ -m32:

/usr/i686-linux-gnu/lib32
/usr/local/lib32
/lib32
/usr/lib32
/usr/local/lib/i386-linux-gnu
/usr/local/lib
/lib/i386-linux-gnu
/lib
/usr/lib/i386-linux-gnu
/usr/lib

감사합니다! 조그마한 향상이 - 그렙 두 없애 : SED -N 'S / SEARCH_DIR ( "? = \ ([^"] \ +) "); * / \ 1 \ n / GP'
브루스 K

2
왜 이렇게 모호한 방법이 필요합니까?
bmacnaughton

이것은 매력처럼 작동했습니다! 이리스트의 링커 검색 경로에 디렉토리를 어떻게 추가합니까?
pari

6

문제는 Linux로 태그되어 있지만 Linux에서도 잘 작동합니까?

gcc -Xlinker -v

Mac OS X에서는 다음이 인쇄됩니다.

@(#)PROGRAM:ld  PROJECT:ld64-224.1
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 armv6m armv7m armv7em
Library search paths:
    /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib
Framework search paths:
    /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/
[...]

위 의 -Xlinker옵션은로 gcc전달 -v됩니다 ld. 하나:

ld -v

검색 경로를 인쇄하지 않습니다.


Linux에서는 디렉토리도 인쇄하지만의 형식으로 인쇄합니다 -Lpath. 따라서 @ Raphaël Londeix 답변이 더 좋습니다.
pevik

2

맥 버전 : $ ld -v 2, 자세한 경로를 얻는 방법을 모른다. 산출

Library search paths:
    /usr/lib
    /usr/local/lib
Framework search paths:
    /Library/Frameworks/
    /System/Library/Frameworks/

3
"열 수 없습니다 2 : 해당 파일이나 디렉토리가 없습니다". 달리기ld -v 2
Jack

2
이 질문에는 OS X가 아닌 Linux 태그가 붙어 ld있습니다. OS X이 GNU를 사용한다고 생각하지 않습니다 . Binutil 사람들은 빌드 스크립트에서이를 비활성화했습니다. 몇 년 동안 비활성화되었습니다.
jww
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.