Programming

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

procodes 2020. 6. 20. 13:37
반응형

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/
[...]

The -Xlinker option of gcc above just passes -v to ld. However:

ld -v

doesn't print the search path.


Mac version: $ ld -v 2, don't know how to get detailed paths. output

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

참고URL : https://stackoverflow.com/questions/9922949/how-to-print-the-ldlinker-search-path

반응형