ฉันไม่เข้าใจ -Wl, -rpath -Wl


245

เพื่อความสะดวกฉันได้เพิ่ม manpages ที่เกี่ยวข้องด้านล่าง

ความเข้าใจผิดของฉันก่อน: หากฉันต้องการแยกตัวเลือกด้วย,นั่นหมายความว่าตัวเลือกที่สอง-Wlไม่ใช่ตัวเลือกอื่นเพราะมันมาก่อน,ซึ่งหมายความว่ามันเป็นอาร์กิวเมนต์ของ-rpathตัวเลือก

ฉันไม่เข้าใจว่า-rpathจะมี-Wl,.ข้อโต้แย้งได้อย่างไร!

สิ่งที่จะทำให้รู้สึกในใจของฉันจะเป็นเช่นนี้:

-Wl,-rpath .

สิ่งนี้ควรเรียกใช้ตัวเลือก -rpath linker ด้วยอาร์กิวเมนต์ไดเรกทอรีปัจจุบัน


ผู้ชาย gcc:

-Wl ตัวเลือก

ส่งตัวเลือกเป็นตัวเลือกไปยังลิงเกอร์ หากตัวเลือกมีเครื่องหมายจุลภาคมันจะแบ่งออกเป็นหลายตัวเลือกที่เครื่องหมายจุลภาค คุณสามารถใช้ไวยากรณ์นี้เพื่อส่งผ่านข้อโต้แย้งไปยังตัวเลือก ตัวอย่างเช่น-Wl,-Map,output.mapส่งผ่าน -Map output.mapไปยังลิงเกอร์ เมื่อใช้ตัวเชื่อมโยง GNU คุณสามารถได้รับผลกระทบเดียวกันกับ `-Wl, -Map = output.map '

ผู้ชาย ld:

-rpath = dir

เพิ่มไดเร็กทอรีไปยังพา ธ การค้นหาไลบรารีรันไทม์ สิ่งนี้ใช้เมื่อเชื่อมโยงเอลฟ์ที่ปฏิบัติการได้กับวัตถุที่แชร์ อาร์กิวเมนต์ -rpath ทั้งหมดถูกต่อกันและส่งผ่านไปยังตัวลิงก์รันไทม์ซึ่งใช้เพื่อระบุตำแหน่งอ็อบเจ็กต์ที่แบ่งใช้ขณะรันไทม์ ตัวเลือก -rpath ยังใช้เมื่อค้นหาออบเจ็กต์ที่แชร์ซึ่งต้องการโดยออบเจกต์ร่วมที่รวมอยู่ในลิงก์อย่างชัดเจน


2
ตอนท้ายชื่อไม่หายไปหรือไม่
Celdor

คำตอบ:


278

-Wl,xxxตัวเลือกสำหรับการgccผ่านรายการคั่นด้วยเครื่องหมายจุลภาคของสัญญาณเป็นรายการพื้นที่ที่แยกออกจากกันของการขัดแย้งกับลิงเกอร์ ดังนั้น

gcc -Wl,aaa,bbb,ccc

ในที่สุดก็กลายเป็นโทรลิงเกอร์

ld aaa bbb ccc

ในกรณีของคุณคุณต้องการพูดว่า " ld -rpath ." ดังนั้นคุณจะผ่านสิ่งนี้ไปยัง gcc เป็น-Wl,-rpath,.อีกวิธีหนึ่งคุณสามารถระบุอินสแตนซ์ที่ซ้ำของ-Wl:

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

ทราบว่ามีเครื่องหมายจุลภาคระหว่างไม่มีและครั้งที่สองaaa-Wl

-Wl,-rpath -Wl,.หรือในกรณีของคุณ


5
โอ้ตอนนี้ฉันเข้าใจแล้วว่าไม่มีการแบ่งแยกระหว่างตัวเลือกหรืออาร์กิวเมนต์ในขณะที่ส่งสิ่งของไปยังลิงเกอร์มันเป็นเพียงแค่สตริง ดังนั้น -Wl ตัวที่สองจึงซ้ำซ้อน! ขอบคุณ :)
Blub

29
@Blub: มันไม่ซ้ำซ้อน! มันเป็นรูปแบบทางเลือกที่คุณทั้งสองพูด-Wl,-rpath,. หรือ-Wl,-rpath -Wl,.ที่คุณพูด หนึ่งในสองอย่างแม่นยำคุณไม่สามารถละเว้นอะไรได้
Kerrek SB

มีใครประสบความสำเร็จในการตั้งค่าทางลาดบน OS X, เช่น clang & ld64?
ben-albrecht

ไวยากรณ์จะมีลักษณะอย่างไรถ้าคุณต้องการระบุหลาย rpaths -Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib?
Hintron

1
@Hintron: ใช่หรือหรือ-Wl,-rpath,dir1,-rpath,dir2 -Wl,-rpath=dir1,-rpath=dir2
Kerrek SB

63

คุณสามารถเขียนได้

-Wl,-rpath=.

เพื่อกำจัดพื้นที่ที่น่ารำคาญ สามารถอ่านได้ง่ายกว่าการเพิ่มเครื่องหมายจุลภาคพิเศษ (เป็นสิ่งที่ผ่านไปยัง ld)


3
จากgcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Optionsภายใต้-Wl,option: " เมื่อใช้ GNU linkerคุณยังสามารถรับผลกระทบเดียวกันกับ -Wl, -Map = output.map" สำหรับฉันดูเหมือนว่าจะบ่งบอกว่าถ้าคุณใช้ตัวเชื่อมโยงอื่นนอกเหนือจากตัวเชื่อมโยง GNU =อาจไม่รองรับไวยากรณ์
Hintron

39

อีกสิ่งหนึ่ง คุณอาจต้องระบุตัวเลือก -L เช่นกัน -

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

หรือคุณอาจท้ายด้วยข้อผิดพลาดเช่น

ld: cannot find -lbaz

10

หน้าคนทำให้ชัดเจนสวย หากคุณต้องการส่งอาร์กิวเมนต์สองตัว ( -rpathและ.) ไปยังลิงเกอร์คุณสามารถเขียนได้

-Wl,-rpath,.

หรืออีกวิธีหนึ่ง

-Wl,-rpath -Wl,.

ข้อโต้แย้งที่-Wl,-rpath .คุณแนะนำไม่สมเหตุสมผลกับความคิดของฉัน gcc จะทราบได้อย่างไรว่าอาร์กิวเมนต์ที่สองของคุณ ( .) ควรถูกส่งผ่านไปยังลิงเกอร์แทนที่จะตีความตามปกติ? วิธีเดียวที่จะสามารถรู้ได้ว่าถ้ามันมีความรู้วงในของข้อโต้แย้งลิงเกอร์ทั้งหมดที่เป็นไปได้ดังนั้นมันจึงรู้ว่า-rpathต้องมีการโต้แย้งหลังจากมัน


ไม่คิดว่า gcc จะวิเคราะห์ข้อโต้แย้งและหากบางสิ่งไม่สมเหตุสมผลก็จะจัดกลุ่มโดยอัตโนมัติ
Blub
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.