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에서 읽습니다. 그런 다음 링커는 기본 sse2
CPU 검색 경로에서 추가 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
'Programming' 카테고리의 다른 글
nosetests가 내 인쇄 명세서의 출력을 캡처하고 있습니다. (0) | 2020.06.20 |
---|---|
Parallel.ForEach () 대 foreach (IEnumerable) (0) | 2020.06.20 |
C에서 실행 파일의 위치를 어떻게 찾습니까? (0) | 2020.06.20 |
Golang에서 문자열을 분할하여 변수에 할당하는 방법은 무엇입니까? (0) | 2020.06.20 |
Mockito에서 Varargs를 올바르게 일치시키는 방법 (0) | 2020.06.20 |