Tôi không hiểu -Wl, -rpath -Wl,


244

Để thuận tiện, tôi đã thêm các trang có liên quan dưới đây.

Hiểu (trước) của tôi trước tiên: Nếu tôi cần tách các tùy chọn với ,, điều đó có nghĩa -Wllà tùy chọn thứ hai không phải là một tùy chọn khác bởi vì nó xuất hiện trước ,đó có nghĩa là nó là một đối số cho -rpathtùy chọn.

Tôi không hiểu làm thế nào -rpathcó thể có một -Wl,.cuộc tranh cãi!

Điều có ý nghĩa trong tâm trí tôi sẽ là thế này:

-Wl,-rpath .

Điều này sẽ gọi tùy chọn liên kết -rpath với đối số thư mục hiện tại.


người đàn ông gcc:

-Wl, tùy chọn

Vượt qua tùy chọn như một tùy chọn để liên kết. Nếu tùy chọn chứa dấu phẩy, nó được chia thành nhiều tùy chọn tại dấu phẩy. Bạn có thể sử dụng cú pháp này để truyền một đối số cho tùy chọn. Ví dụ, -Wl,-Map,output.mapchuyển -Map output.mapđến trình liên kết. Khi sử dụng trình liên kết GNU, bạn cũng có thể có được hiệu ứng tương tự với `-Wl, -Map = output.map '.

người đàn ông ld:

-rpath = dir

Thêm một thư mục vào đường dẫn tìm kiếm thư viện thời gian chạy. Điều này được sử dụng khi liên kết thực thi ELF với các đối tượng được chia sẻ. Tất cả các đối số -rpath được nối và chuyển đến trình liên kết thời gian chạy, sử dụng chúng để định vị các đối tượng chia sẻ khi chạy. Tùy chọn -rpath cũng được sử dụng khi định vị các đối tượng chia sẻ cần thiết cho các đối tượng chia sẻ được bao gồm rõ ràng trong liên kết;


2
Không phải là tiêu đề thiếu ký tự dấu chấm ở cuối?
Celdor

Câu trả lời:


277

Các -Wl,xxxlựa chọn cho gcc qua một danh sách bằng dấu phẩy của thẻ như một danh sách không gian tách các đối số cho các mối liên kết . Vì thế

gcc -Wl,aaa,bbb,ccc

cuối cùng trở thành một cuộc gọi liên kết

ld aaa bbb ccc

Trong trường hợp của bạn, bạn muốn nói " ld -rpath .", vì vậy bạn chuyển cái này cho gcc dưới dạng -Wl,-rpath,.khác, bạn có thể chỉ định các trường hợp lặp lại của -Wl:

gcc -Wl,aaa -Wl,bbb -Wl,ccc

Lưu ý rằng không có dấu phẩy giữa aaavà thứ hai -Wl.

Hoặc, trong trường hợp của bạn , -Wl,-rpath -Wl,..


5
Ồ tôi hiểu rồi, không có sự phân biệt giữa tùy chọn hoặc đối số trong khi truyền nội dung cho trình liên kết, đó chỉ là một chuỗi. Vì vậy, -Wl thứ hai là dư thừa! Cảm ơn :)
Blub

29
@Blub: Nó không dư thừa! Đó là một hình thức thay thế, bạn có thể nói -Wl,-rpath,. hoặc bạn nói -Wl,-rpath -Wl,.. Chính xác là một trong hai, bạn không thể bỏ sót bất cứ điều gì.
Kerrek SB

Có ai đã thành công trong việc thiết lập đường dẫn trên OS X, tức là với clang & ld64 chưa?
ben-albrecht

Cú pháp sẽ trông như thế nào nếu bạn muốn chỉ định nhiều đường dẫn? -Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib?
Gợi ý

1
@Hintron: Có, hoặc -Wl,-rpath,dir1,-rpath,dir2, hoặc -Wl,-rpath=dir1,-rpath=dir2.
Kerrek SB

63

Bạn cũng có thể viết

-Wl,-rpath=.

Để thoát khỏi không gian phiền phức đó. Có thể dễ đọc hơn là thêm dấu phẩy (chính xác là những gì được chuyển đến ld).


3
Từ gcc.gnu.org/onlinesocs/gcc/Link-Options.html#Link-Options trong -Wl,option: " Khi sử dụng trình liên kết GNU , bạn cũng có thể có được hiệu ứng tương tự với -Wl, -Map = output.map." Đối với tôi, điều đó dường như chỉ ra rằng nếu bạn sử dụng một trình liên kết khác ngoài trình liên kết GNU, =cú pháp có thể không được hỗ trợ.
Gợi ý

39

Một thứ khác. Bạn có thể cần phải xác định tùy chọn -L cũng - ví dụ

-Wl,-rpath,/path/to/foo -L/path/to/foo -lbaz

hoặc bạn có thể kết thúc với một lỗi như

ld: cannot find -lbaz

10

Trang người đàn ông làm cho nó khá rõ ràng. Nếu bạn muốn truyền hai đối số ( -rpath.) cho trình liên kết, bạn có thể viết

-Wl,-rpath,.

Hay cách khác

-Wl,-rpath -Wl,.

Những lý lẽ -Wl,-rpath .bạn đề nghị KHÔNG có ý nghĩa với tâm trí của tôi. Làm thế nào gcc phải biết rằng đối số thứ hai của bạn ( .) được cho là được chuyển đến trình liên kết thay vì được diễn giải bình thường? Cách duy nhất nó có thể biết đó là nếu nó có kiến ​​thức nội bộ về tất cả các đối số liên kết có thể để nó biết rằng -rpathcần phải có một đối số sau nó.


Không phải là không thể tưởng tượng rằng gcc phân tích các đối số và nếu một cái gì đó không có ý nghĩa, nó sẽ tự động nhóm.
Blub
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.