[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에서 읽습니다. 그런 다음 링커는 기본 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/
[...]
위 의 -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/