Cách in các đường dẫn tìm kiếm mà ld tìm kiếm theo thứ tự nó tìm kiếm là gì.
Cách in các đường dẫn tìm kiếm mà ld tìm kiếm theo thứ tự nó tìm kiếm là gì.
Câu trả lời:
Bạn có thể làm điều này bằng cách thực hiện lệnh sau:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
gcc chuyển một vài đường dẫn -L bổ sung cho trình liên kết mà bạn có thể liệt kê bằng lệnh sau:
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,; ,g' | tr \; \\012
Các câu trả lời gợi ý sử dụng ld.so.conf và ldconfig là không chính xác vì chúng đề cập đến các đường dẫn được tìm kiếm bởi trình liên kết động thời gian chạy (nghĩa là bất cứ khi nào một chương trình được thực thi), không giống với đường dẫn được tìm kiếm bởi ld (tức là bất cứ khi nào một chương trình được liên kết).
ld
đường dẫn tìm kiếm. Ví dụ, đôi khi tôi phải biên dịch mã nguồn từ makefile
hoặc tạo tệp tạo tệp từ configure
tập lệnh hoặc từ CMakeLists.txt
hoặc thậm chí phức tạp hơn như vala
hoặc srt
. Thật khó cho tôi để sửa đổi ld
đường dẫn tìm kiếm trong những trường hợp như vậy
Trên Linux, bạn có thể sử dụng ldconfig
, trong đó duy trì cấu hình ld.so và bộ nhớ cache, để in ra các thư mục tìm kiếm theo ld.so
với
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -v
in ra các tìm kiếm thư mục bởi trình liên kết (không có tab hàng đầu) và các thư viện chia sẻ được tìm thấy trong các thư mục đó (với một tab hàng đầu); các grep
thư mục được. Trên máy của tôi, dòng này in ra
/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)
Các đường dẫn đầu tiên, không có hwcap
trong dòng, được tích hợp hoặc đọc từ /etc/ld.so.conf. Trình liên kết sau đó có thể tìm kiếm các thư mục bổ sung theo đường dẫn tìm kiếm thư viện cơ bản, với các tên như sse2
tương ứng với các khả năng bổ sung của CPU. Các đường dẫn này, với hwcap
dòng, có thể chứa các thư viện bổ sung được tùy chỉnh cho các khả năng của CPU này.
Một lưu ý cuối cùng: sử dụng -p
thay vì -v
ở trên tìm kiếm ld.so
bộ đệm thay thế.
export LD_LIBRARY_PATH=/some/other/dir
, nó sẽ không ảnh hưởng đến đầu ra của lệnh này?! Có vẻ như nó không hoạt động 100%?
LD_LIBRARY_PATH
bằng cách bật gỡ lỗi. Ví dụ LD_DEBUG=libs /lib/ld-linux.so --list cat
(bạn có thể sử dụng bất kỳ thực thi nào, tôi đã chọn cat
là điều đầu tiên tôi có thể nghĩ đến). Có thể đáng để grepping cho " search path
". Lưu ý rằng nếu bạn có một /etc/ld.so.cache
phù hợp với tất cả các lib cần thiết, bạn sẽ không thấy đường dẫn tìm kiếm hệ thống tích hợp, bởi vì nó sẽ không đi xa đến thế.
gcc
đường dẫn tìm kiếm giống với những cái này?
Tôi không chắc chắn rằng có bất kỳ tùy chọn nào chỉ đơn giản là in đường dẫn tìm kiếm hiệu quả đầy đủ.
Nhưng: đường dẫn tìm kiếm bao gồm các thư mục được chỉ định bởi -L
các tùy chọn trên dòng lệnh, theo sau là các thư mục được thêm vào đường dẫn tìm kiếm bằng SEARCH_DIR("...")
các lệnh trong tập lệnh liên kết. Vì vậy, bạn có thể giải quyết nếu bạn có thể thấy cả hai thứ mà bạn có thể làm như sau:
Nếu bạn đang gọi ld
trực tiếp:
-L
tùy chọn là bất cứ điều gì bạn đã nói.--verbose
tùy chọn. Tìm kiếm các SEARCH_DIR("...")
chỉ thị, thường là gần đầu ra. (Lưu ý rằng những điều này không nhất thiết giống nhau cho mỗi lần gọi ld
- trình liên kết có một số tập lệnh liên kết mặc định tích hợp khác nhau và chọn giữa chúng dựa trên các tùy chọn liên kết khác nhau.)Nếu bạn đang liên kết qua gcc
:
-v
tùy chọn để gcc
nó chỉ cho bạn cách nó gọi trình liên kết. Trong thực tế, nó thường không gọi ld
trực tiếp, mà gián tiếp thông qua một công cụ được gọi là collect2
(sống trong một trong các thư mục nội bộ của nó), lần lượt gọi ra ld
. Điều đó sẽ cho bạn thấy những -L
tùy chọn đang được sử dụng.-Wl,--verbose
vào các gcc
tùy chọn để chuyển --verbose
qua trình liên kết, để xem tập lệnh liên kết như được mô tả ở trên.-T script
tập lệnh của mình đã thay thế hoàn toàn tập lệnh mặc định của ld và chỉ nhìn vào nơi tôi đã chỉ.
Lệnh tương thích nhất mà tôi đã tìm thấy cho gcc và clang trên Linux (nhờ armando.sano):
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
nếu bạn cho -m32
, nó sẽ xuất ra các thư mục thư viện chính xác.
Ví dụ trên máy của tôi:
cho 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
cho 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
Câu hỏi được gắn thẻ Linux, nhưng có lẽ điều này cũng hoạt động tốt với Linux?
gcc -Xlinker -v
Trong Mac OS X, bản in này:
@(#)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/
[...]
Các -Xlinker
tùy chọn gcc
ở trên chỉ cần chuyển -v
đến ld
. Tuy nhiên:
ld -v
không in đường dẫn tìm kiếm.
-Lpath
. Vì vậy, câu trả lời @ Raphaël Londeix là tốt hơn.
Phiên bản Mac: $ ld -v 2, không biết cách lấy đường dẫn chi tiết. đầu ra
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
ld -v 2
ld
. Những người Binutil đã vô hiệu hóa nó trong các tập lệnh xây dựng. Nó đã bị vô hiệu hóa trong nhiều năm.
/usr/local/..
đó gây ra lỗi thư viện bị thiếu và liên kết không thành công. Tôi phải đổi tên/usr/local
mọi lúc để loại trừ đường dẫn tìm kiếm đó. Có một cách đơn giản để loại trừ hoặc ghi đè/usr/local
đường dẫn?