คำถามติดแท็ก ld

4
ฉันไม่เข้าใจ -Wl, -rpath -Wl
เพื่อความสะดวกฉันได้เพิ่ม 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 ยังใช้เมื่อค้นหาออบเจ็กต์ที่แชร์ซึ่งต้องการโดยออบเจกต์ร่วมที่รวมอยู่ในลิงก์อย่างชัดเจน
245 gcc  ld  rpath 

1
ความแตกต่างระหว่างไฟล์ไลบรารี. so, .la และ. a คืออะไร
ฉันรู้ว่า.soไฟล์เป็นไลบรารีแบบไดนามิก (หลายเธรดสามารถแชร์ไลบรารีดังกล่าวได้ดังนั้นจึงไม่จำเป็นต้องมีมากกว่าหนึ่งสำเนาในหน่วยความจำ) แต่อะไรคือความแตกต่างระหว่าง.aและ.la? ไลบรารีสแตติกเหล่านี้ทั้งหมดหรือไม่ หาก libs แบบไดนามิกมีข้อได้เปรียบใหญ่กว่าแบบคงที่ทำไมทำไมยังคงมีห้องสมุดแบบคงที่มากมาย? ฉันต้องการทราบกลไกพื้นฐานในการโหลดไลบรารี่ (ทั้งสองชนิด) และวิธีการเรียกใช้โค้ดใน lib เมื่อมันถูกนำไปใช้ที่ไหนสักแห่ง ฉันควรศึกษาส่วนใดของเคอร์เนล และฉันควรรู้คำสั่ง / ยูทิลิตี้ที่เกี่ยวข้องกับ Linux เพื่อที่จะรู้ว่ากระบวนการทำงานอย่างไร? (ตอนนี้ฉันรู้เพียงldคำสั่งเท่านั้น) เมื่อฉันควรพยายามที่จะสร้างรหัสลง.soหรือ.a? อันไหนดีกว่า? [mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l total 96 -rw-r--r-- 1 mirror mirror 22892 Sep 2 23:25 openvpn-plugin-auth-pam.a -rwxr-xr-x 1 mirror mirror 931 Sep 2 23:25 openvpn-plugin-auth-pam.la -rwxr-xr-x 1 mirror mirror …

3
LD_LIBRARY_PATH เทียบกับ LIBRARY_PATH
ฉันกำลังสร้างโปรแกรม C ++ แบบง่ายและฉันต้องการแทนที่ระบบที่ให้ไลบรารี่ที่ใช้ร่วมกันกับเวอร์ชันที่ใหม่กว่าชั่วคราวสำหรับการพัฒนาและการทดสอบ ฉันพยายามตั้งค่าตัวแปร LD_LIBRARY_PATH แต่ตัวเชื่อมโยง (ld) ล้มเหลวด้วย: / usr / bin / ld: ไม่สามารถหา -lyaml-cpp ฉันคาดว่าจะทำงานได้เพราะตามหน้า man ld: ตัวลิงก์ใช้พา ธ การค้นหาต่อไปนี้เพื่อค้นหาไลบรารีแบบแบ่งใช้ที่จำเป็น: ... สำหรับตัวเชื่อมโยงแบบดั้งเดิมเนื้อหาของตัวแปรสภาพแวดล้อม "LD_LIBRARY_PATH" ... ฉันลองตั้ง LIBRARY_PATH แล้วก็ใช้งานได้ ตามคู่มือ GCC: ค่าของ LIBRARY_PATH เป็นรายการไดเร็กทอรีที่คั่นด้วยโคลอนเหมือนกับ PATH เมื่อกำหนดค่าเป็นคอมไพเลอร์เนทีฟ GCC จะพยายามไดเรกทอรีที่ระบุไว้เมื่อค้นหาไฟล์ลิงเกอร์พิเศษหากไม่สามารถค้นหาได้โดยใช้ GCC_EXEC_PREFIX การลิงก์โดยใช้ GCC ยังใช้ไดเรกทอรีเหล่านี้เมื่อค้นหาไลบรารีสามัญสำหรับตัวเลือก -l (แต่ไดเรกทอรีที่ระบุด้วย -L ​​จะมาก่อน) ตามที่แนะนำ (GCC) แนะนำ …
159 gcc  g++  ld 


17
ปัญหาการคอมไพล์: ไม่พบ crt1.o
ฉันมีระบบ Debian เสมือนจริงที่ฉันใช้ในการพัฒนา วันนี้อยากลอง llvm / clang หลังจากติดตั้งเสียงดังฉันไม่สามารถรวบรวม c-project เก่าของฉัน (ด้วย gcc) นี่คือข้อผิดพลาด: ... /usr/bin/ld: cannot find crt1.o: No such file or directory /usr/bin/ld: cannot find crti.o: No such file or directory collect2: ld returned 1 exit status ... ฉันถอนการติดตั้งเสียงดังลั่น แต่ก็ยังใช้งานไม่ได้ ใครมีความคิดว่าฉันจะแก้ไขปัญหานี้ได้อย่างไร
115 gcc  clang  ld 

11
จะลบสัญลักษณ์ C / C ++ ที่ไม่ได้ใช้ด้วย GCC และ ld ได้อย่างไร?
ฉันต้องการปรับขนาดของไฟล์ปฏิบัติการของฉันให้เหมาะสมอย่างรุนแรง ( ARMการพัฒนา) และฉันสังเกตเห็นว่าในรูปแบบการสร้างปัจจุบัน ( gcc+ ld) สัญลักษณ์ที่ไม่ได้ใช้ของฉันจะไม่ถูกตัดออก การใช้งานของarm-strip --strip-unneededสำหรับที่เกิด executables / ห้องสมุดไม่เปลี่ยนขนาดการส่งออกของปฏิบัติการที่(ผมมีความคิดว่าทำไมไม่มีบางทีมันก็ไม่ได้) จะเป็นอย่างไร(ถ้ามี)ในการแก้ไขไปป์ไลน์อาคารของฉันเพื่อให้สัญลักษณ์ที่ไม่ได้ใช้ถูกดึงออกจากไฟล์ผลลัพธ์ ฉันจะไม่นึกถึงสิ่งนี้ด้วยซ้ำ แต่สภาพแวดล้อมที่ฝังอยู่ในปัจจุบันของฉันไม่ได้ "ทรงพลัง" มากนักและประหยัดได้แม้จะ500Kไม่ได้2Mผลลัพธ์ในการเพิ่มประสิทธิภาพการโหลดที่ดีมาก อัปเดต: น่าเสียดายที่gccเวอร์ชันปัจจุบันที่ฉันใช้ไม่มี-dead-stripตัวเลือกและ-ffunction-sections... + --gc-sectionsสำหรับldไม่ได้ให้ความแตกต่างอย่างมีนัยสำคัญสำหรับผลลัพธ์ที่ได้ ฉันตกใจมากที่เรื่องนี้กลายเป็นปัญหาเพราะฉันแน่ใจว่าgcc + ldควรดึงสัญลักษณ์ที่ไม่ได้ใช้ออกโดยอัตโนมัติ (ทำไมพวกเขาถึงต้องเก็บไว้?)
111 c++  c  gcc  ld  strip 

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