เท่
ใน Linux ar
เป็นตัวเก็บถาวรวัตถุประสงค์ทั่วไปของ GNU (มีตัวแปรที่ไม่ใช่ GNU ar
ใน OSE Unix ที่มีลักษณะคล้ายกัน) ด้วยตัวเลือกc
ar c... archive-name file...
file...
มันจะสร้างที่เก็บที่มีสำเนาของ archive-name
อัตภาพ แต่ไม่จำเป็นต้องมีส่วนขยาย.a
(สำหรับเก็บ ) แต่ละไฟล์file...
อาจเป็นไฟล์ประเภทใดก็ได้ไม่จำเป็นต้องเป็นไฟล์อ็อบเจ็กต์
เมื่อไฟล์ที่เก็บถาวรเป็นไฟล์ออบเจ็กต์ทั้งหมดโดยปกติแล้วจะมีความตั้งใจที่จะใช้ไฟล์เก็บถาวรเพื่อส่งมอบการเลือกของไฟล์ออบเจกต์ลงในลิงก์ของโปรแกรมหรือ DSO (Dynamic Shared Objects) ในกรณีนี้archive-name
จะยังอัตภาพได้รับคำนำหน้าlib
เช่น
เพื่อที่จะสามารถค้นพบเป็นแฟ้มใส่ผู้สมัครผ่านทางตัวเลือกลิงเกอร์ลิงเกอร์libfoo.a
-lfoo
ใช้เป็นแฟ้มใส่ลิงเกอร์, libfoo.a
เป็นปกติเรียกว่าห้องสมุดคงที่ การใช้งานนี้เป็นแหล่งที่ทำให้เกิดความสับสนอย่างต่อเนื่องกับโปรแกรมเมอร์ที่ไม่มีประสบการณ์เพราะมันทำให้พวกเขาคิดว่าการเก็บถาวรlibfoo.a
นั้นเป็นสิ่งที่เหมือนกับ DSO libfoo.so
ซึ่งโดยทั่วไปเรียกว่าไลบรารี่แบบไดนามิก / แชร์และเพื่อสร้างความคาดหวังที่ผิด ๆ บนพื้นฐานนี้ ในความเป็นจริง "ห้องสมุดคงที่" และ "ห้องสมุดไดนามิก" ไม่ได้อยู่ในสิ่งที่คล้ายกันทั้งหมดและใช้ในการเชื่อมโยงในรูปแบบที่แตกต่างกันอย่างเต็มที่
ความแตกต่างที่เห็นได้ชัดเจนคือการที่ห้องสมุดคงไม่ได้ผลิตโดยลิงเกอร์ar
แต่ ดังนั้นจึงไม่มีการเชื่อมโยงเกิดขึ้นไม่มีการแก้ไขสัญลักษณ์ ไฟล์วัตถุที่เก็บถาวรจะไม่เปลี่ยนแปลง: พวกเขาเพียงแค่ใส่ในกระเป๋า
เมื่อมีการเก็บคือการป้อนข้อมูลในการเชื่อมโยงของสิ่งที่ถูกผลิตโดยลิงเกอร์ - เช่นโปรแกรมหรือเอสโอ - ลิงเกอร์รูปลักษณ์ในถุงเพื่อดูว่ามีไฟล์วัตถุใด ๆ ในนั้นที่ให้คำจำกัดความอ้างอิงสัญลักษณ์ยังไม่ได้แก้ไขที่ได้ค้างรับ ก่อนหน้านี้ในการเชื่อมโยง หากพบการใด ๆ ก็จะคัดแยกไฟล์วัตถุเหล่านั้นออกจากถุงและเชื่อมโยงพวกเขาเข้าไปในไฟล์ที่ส่งออกตรงราวกับว่าพวกเขามีชื่อบุคคลใน commandline ลิงเกอร์และที่เก็บไม่ได้กล่าวถึงที่ทั้งหมด ดังนั้นบทบาททั้งหมดของไฟล์เก็บถาวรในการเชื่อมโยงจึงเท่ากับว่าเป็นไฟล์ของวัตถุซึ่งตัวเชื่อมโยงสามารถเลือกบทบาทที่ต้องการดำเนินการเชื่อมโยงได้
ตามค่าเริ่มต้น GNU ar
จะจัดทำคลังเก็บข้อมูลเอาท์พุทให้พร้อมใช้งานเป็นอินพุตลิงเกอร์ จะเพิ่ม "ไฟล์" ปลอมลงในไฟล์เก็บถาวรพร้อมด้วยชื่อไฟล์มายากลปลอมและในไฟล์ปลอมนี้จะเขียนเนื้อหาที่ตัวเชื่อมโยงสามารถอ่านเป็นตารางค้นหาจากสัญลักษณ์ทั่วโลกที่กำหนดโดยวัตถุไฟล์ใด ๆ ในไฟล์เก็บถาวร ถึงชื่อและตำแหน่งของไฟล์อ็อบเจ็กต์เหล่านั้นในไฟล์เก็บถาวร ตารางการค้นหานี้เป็นสิ่งที่ทำให้ linker ดูในไฟล์เก็บถาวรและระบุไฟล์อ็อบเจ็กต์ใด ๆ ที่กำหนดการอ้างอิงสัญลักษณ์ที่ไม่ได้แก้ไขใด ๆ ที่มีอยู่ในมือ
คุณสามารถระงับการสร้างหรืออัปเดตของตารางการค้นหานี้ด้วยตัวเลือกq
(=
ด่วน ) ซึ่งอันที่จริงแล้วคุณใช้ในar
ตัวอย่างของคุณเองและตัวเลือก (ทุน) S
(= ไม่มีตารางสัญลักษณ์ ) และถ้าคุณเรียกใช้ar
เพื่อสร้างหรืออัปเดตไฟล์เก็บถาวรที่ไม่มีตารางสัญลักษณ์ (uptodate) สัญลักษณ์ไม่ว่าด้วยเหตุผลใดก็ตามคุณสามารถให้มันมีs
ตัวเลือก
ranlib
ranlib
ไม่ได้สร้างห้องสมุดเลย ใน Linux ranlib
เป็นโปรแกรมดั้งเดิมที่เพิ่มตารางสัญลักษณ์ (uptodate) ลงในar
ไฟล์เก็บถาวรหากไม่มีอยู่ ผลของมันเป็นสิ่งเดียวกับar s
ที่มี ar
GNU ในอดีตก่อนที่จะar
ถูกสร้างขึ้นมาเพื่อสร้างตารางสัญลักษณ์ตัวเองranlib
เป็นกระบองที่ฉีดไฟล์มายากลปลอมลงในไฟล์เก็บถาวรเพื่อให้ linker สามารถเลือกไฟล์วัตถุจากมันได้ ใน OSE ที่ไม่เหมือน GNU ที่ไม่เหมือน GNU ranlib
อาจยังจำเป็นสำหรับจุดประสงค์นี้ ตัวอย่างของคุณ:
ar qc libgraphics.a *.o
ranlib libgraphics.a
พูดว่า:
- สร้าง
libgraphics.a
โดยผนวกไฟล์เก็บถาวรทั้งหมด*.o
ในไดเรกทอรีปัจจุบันโดยไม่มีตารางสัญลักษณ์
- จากนั้นเพิ่มตารางสัญลักษณ์ลงใน
libgraphics.a
ใน linux สิ่งนี้มีผลกระทบสุทธิเช่นเดียวกับ:
ar cr libgraphics.a *.o
ด้วยตัวเองar qc libgraphics.a *.o
สร้างไฟล์เก็บถาวรที่ตัวเชื่อมโยงไม่สามารถใช้ได้เนื่องจากไม่มีตารางสัญลักษณ์
LD
ตัวอย่างของคุณ:
ld -r -o libgraphics.a *.o
เป็นจริงนอกรีตค่อนข้าง นี้แสดงให้เห็นถึงการใช้งานที่ค่อนข้างหายากของลิงเกอร์ ,
ld
เพื่อผลิตที่ผสานไฟล์วัตถุโดยการเชื่อมโยงแฟ้มใส่หลายเป็นไฟล์วัตถุเอาท์พุทเดียวซึ่งในความละเอียดสัญลักษณ์ได้รับการทำเท่าที่เป็นไปได้ให้ใส่ไฟล์ -r
(= relocatable )ตัวเลือกนำตัวเชื่อมโยงในการผลิตเป้าหมายไฟล์วัตถุ (มากกว่าโปรแกรมหรือเอสโอ) โดยการเชื่อมโยงปัจจัยการผลิตเท่าที่เป็นไปได้และไม่ได้ที่จะล้มเหลว linkaqe ถ้าอ้างอิงไม่ได้กำหนดสัญลักษณ์ยังคงอยู่ในไฟล์ที่ส่งออก การใช้งานนี้เรียกว่าการเชื่อมโยงบางส่วน
ไฟล์เอาต์พุตของld -r ...
คือไฟล์อ็อบเจ็กต์ไม่ใช่ ar
ไฟล์เก็บถาวรและการระบุชื่อไฟล์เอาต์พุตที่ดูเหมือนว่าar
ไฟล์เก็บถาวรไม่ได้เป็นไฟล์เดียว ตัวอย่างของคุณแสดงให้เห็นถึงการหลอกลวง นี้:
ld -r -o graphics.o *.o
จะเป็นจริง มันไม่ชัดเจนสำหรับฉันว่าจุดประสงค์ของการหลอกลวงแบบนี้อาจเป็นเพราะถึงแม้ว่าไฟล์วัตถุของเอลฟ์จะถูกเรียกใช้libgraphics.a
และมีการเชื่อมโยงไปยังการเชื่อมโยงด้วยชื่อนั้นหรือโดย-lgraphics
ผู้เชื่อมโยงจะระบุอย่างถูกต้องว่าเป็นวัตถุไฟล์ ไม่ใช่ar
ไฟล์เก็บถาวรและจะใช้วิธีที่มันใช้งานอ็อบเจ็กต์ไฟล์ใด ๆ ใน commandline: ลิงก์ไปยังไฟล์เอาต์พุตโดยไม่มีเงื่อนไขในขณะที่จุดอินพุตของไฟล์เก็บถาวรของแท้คือการลิงก์สมาชิกไฟล์เก็บถาวรเฉพาะเมื่อมีการอ้างอิงเท่านั้น บางทีคุณอาจมีตัวอย่างของการลิงก์ที่ไม่เหมาะสมที่นี่
ห่อ...
เราได้จริงเห็นเพียงหนึ่งวิธีในการผลิตบางสิ่งบางอย่างที่เรียกว่าอัตภาพห้องสมุดและนั่นคือการผลิตของสิ่งที่เรียกว่าห้องสมุดคงที่โดยการเก็บไฟล์วัตถุบางอย่างและการวางตารางสัญลักษณ์ในการเก็บ
และเราไม่เคยเห็นวิธีการสร้างสิ่งอื่นและสิ่งที่สำคัญที่สุดที่เรียกว่าห้องสมุดโดยทั่วไปคือไลบรารีที่ใช้ร่วมกันแบบไดนามิก / ไลบรารีที่ใช้ร่วมกัน / ไลบรารีแบบไดนามิก
เช่นเดียวกับโปรแกรมเป็นเอสโอผลิตโดยลิงเกอร์ โปรแกรมและ DSO เป็นตัวแปรของ ELF ไบนารีที่ตัวโหลด OS เข้าใจและสามารถใช้เพื่อประกอบกระบวนการที่กำลังทำงานอยู่ เรามักจะเรียกใช้ตัวเชื่อมโยงผ่านทางหนึ่งหนึ่ง frontends จีซี ( gcc
, g++
, gfortran
ฯลฯ ):
การเชื่อมโยงโปรแกรม:
gcc -o prog file.o ... -Ldir ... -lfoo ...
การเชื่อมโยง DSO:
gcc -shared -o libbar.so file.o ... -Ldir ... -lfoo ...
ทั้งไลบรารีที่แบ่งใช้และไลบรารีแบบสแตติกสามารถเสนอให้แก่ linker โดย-lfoo
โปรโตคอลชุดเดียวกันเมื่อคุณทำการเชื่อมโยงโปรแกรมอื่นหรือ DSO ตัวเลือกที่นำลิงเกอร์ในการสแกนที่ระบุหรือเริ่มต้น directrories การค้นหาเพื่อค้นหาอย่างใดอย่างหนึ่ง
หรือlibfoo.so
โดยค่าเริ่มต้นเมื่อมันพบว่าหนึ่งในพวกเขาทั้งสองก็จะป้อนข้อมูลว่าไฟล์ที่จะเชื่อมโยงและหากพบทั้งในไดเรกทอรีค้นหาเดียวกันก็จะชอบlibfoo.a
libfoo.so
ถ้าlibfoo.so
เลือกแล้วตัวเชื่อมโยงจะเพิ่ม DSO นั้นในรายการการพึ่งพารันไทม์ของโปรแกรมหรือ DSO ที่คุณกำลังทำ หากlibfoo.a
ถูกเลือกตัวเชื่อมโยงจะใช้การเก็บถาวรเป็นตัวเลือกของวัตถุไฟล์สำหรับการเชื่อมโยงลงในไฟล์เอาต์พุตหากจำเป็นให้ทำตรงนั้น ไม่มีการพึ่งพารันไทม์
libfoo.a
ตัวเองเป็นไปได้; ไม่สามารถแมปเข้ากับกระบวนการได้ มันไม่มีความหมายอะไรกับตัวโหลดระบบปฏิบัติการ
คัดลอกจากhttps://stackoverflow.com/a/47924864/195787