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

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



답변

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

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 (즉마다 프로그램이 연결되어 있습니다).


답변

리눅스에서, 당신은 사용할 수있는 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캐시가 대신 검색 됩니다.


답변

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

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

ld직접 호출하는 경우 :

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

를 통해 연결하는 경우 gcc:

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

답변

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


답변

문제는 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

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


답변

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

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


답변