ranlib คืออะไร


13

ฉันใช้ระบบ MacOSX มาระยะหนึ่งแล้ว แต่เพิ่งจะเริ่มเข้าสู่ความกล้า ฉันพบคู่มือที่บอกให้ฉันเรียกใช้ 'sudo ranlib /usr/local/lib/libjpeg.a'( การติดตั้ง libjpeg) ฉันอ่านคู่มือ ranlib แล้วลองดูทางออนไลน์ ฉันไม่เข้าใจ ฉันต้องค้นหาแหล่งข้อมูลใดเพื่อเรียนรู้เพิ่มเติมหรือใครบางคนสามารถให้คำอธิบายสั้น ๆ เกี่ยวกับการใช้งานได้ ขอบคุณล่วงหน้า!

คำตอบ:


7

ranlibเพิ่มหรือปรับปรุงวัตถุไฟล์ในห้องสมุดคงที่ ตัวเชื่อมโยงสามารถใช้ไลบรารีแบบคงที่เมื่อทำการเชื่อมโยงเพื่อให้สัญลักษณ์ที่รหัสต้องการเพื่อดำเนินการ (ต่างจากตัวโหลดที่ค้นหาในไลบรารีแบบไดนามิกเมื่อเรียกใช้งาน)


สวัสดีอิกนาชิโอขอบคุณสำหรับคำตอบ นี่หมายความว่าถ้าฉันรัน ranlib บนไลบรารี่มันจะใช้ได้ทุกครั้งที่ linker พยายาม 'อ้างอิง' มัน? มันจะถูกลบอย่างไร?
Ying

ranlibใช้ในการสร้างและแก้ไขไลบรารี มันขึ้นอยู่กับ linker ที่จะใช้มันโดยปกติแล้วจะผ่านตำแหน่งไลบรารีและ / หรือชื่อบนบรรทัดคำสั่ง ดู-Lและ-lอาร์กิวเมนต์เพื่อ gcc สำหรับรายละเอียด
Ignacio Vazquez-Abrams

5
แต่ไม่ได้arทำเช่นนั้น? ความแตกต่างคืออะไร?
greatwolf

18

คำอธิบายนี้ดูค่อนข้างชัดเจน: http://sourceware.org/binutils/docs/binutils/ranlib.html

ดังนั้นหากคุณเก็บถาวรชุดของไฟล์วัตถุให้พูดว่า:

$ ar r fruits.a apple.o orange.o pineapple.o

จากนั้นวิ่ง

$ ranlib fruits.a

สร้างดัชนีของเนื้อหาของ fruit.a และเก็บดัชนีใน fruit.a สิ่งนี้มีประโยชน์สำหรับการเชื่อมโยงและในกรณีที่วัตถุเรียกซึ่งกันและกัน


"ranlib สร้างดัชนีไปยังเนื้อหาของไฟล์เก็บถาวรและเก็บไว้ในแฟ้มเก็บถาวร". ฟังดูคล้ายกับบางสิ่งที่จะนำมารวมกับtarและฉันจะบอกว่าไม่ชัดเจน
Codebling

9

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

แหล่งที่มา: หน้าคน ranlib


2

เท่

ใน 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ที่มี arGNU ในอดีตก่อนที่จะ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

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