คำสั่ง Linux / Unix: Id

ชื่อ

ld - ใช้ LD linker ของ GNU

สรุป

ld [ ตัวเลือก ] objfile ...

รายละเอียด

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

ld ยอมรับไฟล์ภาษา คำสั่งของ Linker ที่เขียนขึ้นในชุดคำสั่งภาษาคำสั่ง Link Editor ของ AT & T เพื่อให้การควบคุมกระบวนการเชื่อมโยงอย่างชัดเจนและเป็นลายลักษณ์อักษร

หน้าคนนี้ไม่ได้อธิบายภาษาคำสั่ง; ดูรายการ ld ใน "info" หรือคู่มือ ld: linker GNU เพื่อดูรายละเอียดทั้งหมดเกี่ยวกับภาษาคำสั่งและด้านอื่น ๆ ของ linker ของ GNU

ld รุ่นนี้ใช้ไลบรารี BFD วัตถุประสงค์ทั่วไปเพื่อดำเนินการกับไฟล์อ็อบเจ็กต์ ซึ่งจะช่วยให้ ld อ่าน, รวมและเขียนไฟล์อ็อบเจ็กต์ในรูปแบบต่างๆได้เช่น COFF หรือ "a.out" รูปแบบที่ต่างกันอาจเชื่อมโยงกันเพื่อสร้างไฟล์อ็อบเจ็กต์ที่มีอยู่

นอกเหนือจากความยืดหยุ่นของตัวเชื่อมโยง GNU จะเป็นประโยชน์มากกว่า linkers อื่น ๆ ในการให้ข้อมูลการวินิจฉัย หลาย linkers ละทิ้งการดำเนินการทันทีเมื่อพบข้อผิดพลาด; เมื่อใดก็ตามที่เป็นไปได้ ld จะ ดำเนินการต่อไปซึ่งจะช่วยให้คุณระบุข้อผิดพลาดอื่น ๆ (หรือในบางกรณีเพื่อให้ได้ไฟล์ที่ส่งออกแม้ว่าจะมีข้อผิดพลาดก็ตาม)

GNU linker ld มีขึ้นเพื่อครอบคลุมสถานการณ์ที่หลากหลายและเพื่อให้สามารถใช้งานร่วมกับผู้เชื่อมโยงรายอื่น ๆ ได้มากที่สุด เป็นผลให้คุณมีทางเลือกมากมายในการควบคุมพฤติกรรมของตน

ตัวเลือก

linker สนับสนุนมากมายเหลือเฟือของ ตัวเลือกบรรทัดคำสั่ง แต่ในทางปฏิบัติจริงไม่กี่ของพวกเขาจะใช้ในบริบทเฉพาะใด ๆ ตัวอย่างเช่นการใช้ ld บ่อยๆคือการเชื่อมโยงไฟล์มาตรฐาน Unix มาตรฐานบน ระบบ Unix ที่ ได้รับการสนับสนุน ในระบบดังกล่าวให้เชื่อมโยงไฟล์ "hello.o":

ld -o /lib/crt0.o hello.o -lc

นี้จะบอกให้ ld ผลิตไฟล์ที่เรียกว่า output ซึ่งเป็นผลมาจากการเชื่อมโยงไฟล์ "/lib/crt0.o" กับ "hello.o" และไลบรารี "libc.a" ซึ่งจะมาจากไดเร็กทอรีการค้นหามาตรฐาน (ดูรายละเอียดเกี่ยวกับตัวเลือก -l ด้านล่าง)

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

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

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

หากลิงเกอร์ไม่รู้จักรูปแบบไฟล์อ็อบเจ็กต์จะถือว่าเป็นสคริปต์ linker สคริปต์ที่ระบุในลักษณะนี้จะเพิ่มสคริปต์ตัวเชื่อมหลักที่ใช้สำหรับการเชื่อมโยง (เช่นสคริปต์ linker เริ่มต้นหรือสคริปต์ที่ระบุโดยใช้ -T ) คุณลักษณะนี้อนุญาตให้ linker เชื่อมโยงกับไฟล์ที่ดูเหมือนจะเป็นวัตถุหรือที่เก็บถาวร แต่ในความเป็นจริงเพียงกำหนดค่าสัญลักษณ์บางส่วนหรือใช้ "INPUT" หรือ "GROUP" เพื่อโหลดออบเจ็กต์อื่น โปรดทราบว่าการระบุสคริปต์ด้วยวิธีนี้จะช่วยเพิ่มสคริปต์ตัวเชื่อมหลักเท่านั้น ใช้ตัวเลือก -T เพื่อแทนที่สคริปต์ linker เริ่มต้นทั้งหมด

สำหรับตัวเลือกที่มีชื่อเป็นอักษรเดียวอาร์กิวเมนต์ตัวเลือกต้องเป็นไปตามตัวเลือกโดยไม่แทรกแซงช่องว่างหรือให้เป็นอาร์กิวเมนต์แยกต่างหากทันทีหลังจากตัวเลือกที่ต้องการ

สำหรับตัวเลือกที่มีชื่อหลายตัวอักษรหนึ่งขีดหรือสองคนสามารถนำหน้าชื่อตัวเลือก; ตัวอย่างเช่น สัญลักษณ์ -trace และ --trace-symbol มีค่าเท่ากัน หมายเหตุ - มีข้อยกเว้นสำหรับกฎนี้ ตัวอักษรหลายตัวที่ขึ้นต้นด้วยตัวพิมพ์เล็ก 'o' สามารถทำได้ก่อนหน้าด้วยเครื่องหมายขีดกลางสองขีดเท่านั้น เพื่อลดความสับสนกับตัวเลือก -o ดังนั้นตัวอย่างเช่น -omagic ตั้งชื่อไฟล์ออกเป็น เวทมนตร์ ในขณะที่ --omagic ตั้งค่าสถานะ NMAGIC ที่เอาต์พุต

อาร์กิวเมนต์ให้กับตัวเลือกหลายตัวอักษรจะต้องถูกแยกออกจากชื่อตัวเลือกโดยใช้เครื่องหมายเท่ากับหรือให้เป็นอาร์กิวเมนต์ที่แยกกันโดยทันทีตามตัวเลือกที่ต้องการ ยกตัวอย่างเช่น --trace-symbol foo และ --trace-symbol = foo มีค่าเท่ากัน ยอมรับตัวย่อที่ไม่ซ้ำของชื่อตัวเลือกหลายตัวอักษร

หมายเหตุ - หากตัวเชื่อมโยงถูกเรียกโดยทางอ้อมผ่านทางโปรแกรมควบคุมคอมไพเลอร์ (เช่น gcc ) ตัวเลือกบรรทัดคำสั่ง linker ทั้งหมดจะถูกนำมาใช้โดย -Wl (หรือสิ่งที่เหมาะสมสำหรับโปรแกรมควบคุมคอมไพเลอร์) เช่นนี้

gcc -Wl, - startgroup foo.o bar.o -Wl, - endgroup

นี่เป็นสิ่งสำคัญเพราะมิฉะนั้นโปรแกรมควบคุมคอมไพเลอร์อาจปิดตัวเลือก linker โดยอัตโนมัติส่งผลให้เกิดลิงก์ที่ไม่ถูกต้อง

นี่คือตารางของสวิทช์บรรทัดคำสั่งทั่วไปที่ได้รับการยอมรับโดย linker GNU:

- คำหลัก

ตัวเลือกนี้รองรับการทำงานร่วมกับ HP / UX อาร์กิวเมนต์ คำหลัก ต้องเป็น สตริงที่ เก็บถาวร แชร์ หรือ ดีฟอลต์ -oarchive เป็นฟังก์ชันเทียบเท่ากับ -Bstatic และอีกสองคำมีฟังก์ชันเทียบเท่ากับ -Bynamic ตัวเลือกนี้สามารถใช้ได้หลายครั้ง

- สถาปัตยกรรม

--architecture = architecture

ในรุ่นล่าสุดของ ld ตัวเลือกนี้มีประโยชน์สำหรับสถาปัตยกรรมตระกูล Intel 960 เท่านั้น ในการกำหนดค่า ld อาร์กิวเมนต์ สถาปัตยกรรม ระบุสถาปัตยกรรมเฉพาะในตระกูล 960 ทำให้สามารถป้องกันและแก้ไขเส้นทางการค้นหาไลบรารีไลบรารีได้

การเผยแพร่ในอนาคตของ ld อาจสนับสนุนฟังก์ชันการทำงานที่คล้ายกันสำหรับครอบครัวสถาปัตยกรรมอื่น ๆ

รูปแบบการป้อนข้อมูล -b

- format = input-format

ld อาจได้รับการกำหนดค่าให้รองรับไฟล์อ็อบเจ็กต์มากกว่าหนึ่งชนิด ถ้า ld ของคุณถูกกำหนดค่าด้วยวิธีนี้คุณสามารถใช้ตัวเลือก -b เพื่อระบุรูปแบบไบนารีสำหรับใส่อ็อบเจ็กต์ไฟล์ที่ทำตามตัวเลือกนี้ในบรรทัดคำสั่ง แม้ว่า ld จะได้รับการกำหนดค่าให้สนับสนุนรูปแบบอ็อบเจ็กต์ทางเลือก แต่โดยปกติแล้วคุณไม่จำเป็นต้องระบุค่านี้เนื่องจาก ld ควรได้รับการกำหนดค่าให้คาดหวังว่าจะเป็นรูปแบบการป้อนข้อมูลเริ่มต้นรูปแบบปกติที่สุดในแต่ละเครื่อง รูปแบบอินพุต เป็นสตริงข้อความชื่อของรูปแบบเฉพาะที่ไลบรารี BFD สนับสนุน (คุณสามารถระบุรูปแบบไบนารีที่มีอยู่ด้วย objdump -i )

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

รูปแบบเริ่มต้นมาจากตัวแปรสภาพแวดล้อม "GNUTARGET"

นอกจากนี้คุณยังสามารถกำหนดรูปแบบการป้อนข้อมูลจากสคริปต์โดยใช้คำสั่ง "TARGET";

-c MRI-commandfile

--mri-script = MRI-commandfile

สำหรับความเข้ากันได้กับลินุกเตอร์ที่ผลิตโดย MRI ld ยอมรับไฟล์สคริปต์ที่เขียนขึ้นในภาษาคำสั่งสำรองและแบบ จำกัด ที่อธิบายไว้ในส่วนไฟล์สคริปต์ที่ใช้ร่วมกันได้ของ MRI ในเอกสาร GNU ld แนะนำไฟล์สคริปต์ MRI ด้วยตัวเลือก -c ; ใช้ตัวเลือก -T เพื่อเรียกใช้สคริปต์ linker ที่เขียนขึ้นในภาษาสคริปต์ ld ทั่วไป ถ้า MRI-cmdfile ไม่มีอยู่จริง ld จะค้นหาไฟล์ดังกล่าวในไดเร็กทอรีที่ระบุโดยตัวเลือก -L

-d

-กระแสตรง

-dp

ทั้งสามตัวเลือกมีค่าเท่ากัน หลายรูปแบบได้รับการสนับสนุนสำหรับความเข้ากันได้กับ linkers อื่น ๆ พวกเขากำหนดพื้นที่ให้กับสัญลักษณ์ทั่วไปถึงแม้ว่าจะมีการระบุไฟล์เอาต์พุตที่ย้ายข้อมูลใหม่ (ด้วย -r ) คำสั่งสคริปต์ "FORCE_COMMON_ALLOCATION" มีผลเช่นเดียวกัน

-e เข้า

--entry = รายการ

ใช้ รายการ เป็นสัญลักษณ์อย่างชัดเจนสำหรับการเริ่มต้นใช้งานโปรแกรมแทนที่จะเป็นจุดเข้าใช้งานเริ่มต้น หากไม่มีสัญลักษณ์ชื่อ รายการ ตัวเชื่อมจะพยายามแยกวิเคราะห์ รายการ เป็นตัวเลขและใช้เป็นที่อยู่ในรายการ (หมายเลขจะถูกตีความในฐาน 10 คุณอาจใช้ 0x ชั้นนำสำหรับฐาน 16 หรือนำ 0 สำหรับฐาน 8)

-E

--export ไดนามิก

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

ถ้าคุณไม่ได้ใช้ตัวเลือกนี้ตารางสัญลักษณ์แบบไดนามิกจะมีเฉพาะสัญลักษณ์ที่อ้างอิงโดยวัตถุพลวัตบางอย่างที่กล่าวถึงในลิงก์

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

นอกจากนี้คุณยังสามารถใช้สคริปต์รุ่นเพื่อควบคุมสิ่งที่ควรเพิ่มสัญลักษณ์ลงในตารางสัญลักษณ์ไดนามิกหากรูปแบบเอาต์พุตสนับสนุน ดูคำอธิบายของ --version-script ใน @ ref {VERSION}

-EB

เชื่อมโยงวัตถุ big-endian ซึ่งจะส่งผลต่อรูปแบบการแสดงผลเริ่มต้น

-EL

เชื่อมโยงออบเจกต์ little-endian ซึ่งจะส่งผลต่อรูปแบบการแสดงผลเริ่มต้น

-f

- ชื่อย่อ

เมื่อสร้างออบเจกต์ที่ใช้ร่วมกันของ ELF ให้ตั้งค่าฟิลด์ DT_AUXILIARY ภายในเป็นชื่อที่ระบุ นี้บอก linker แบบไดนามิกที่ตารางสัญลักษณ์ของวัตถุที่ใช้ร่วมกันควรใช้เป็นตัวเสริมในตารางสัญลักษณ์ของ ชื่อ วัตถุที่ใช้ร่วมกัน

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

ตัวเลือกนี้อาจถูกระบุมากกว่าหนึ่งครั้ง รายการ DT_AUXILIARY จะถูกสร้างขึ้นตามลำดับที่ปรากฏในบรรทัดคำสั่ง

-F ชื่อ

--filter name

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

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

ตัวเชื่อมโยงที่เก่ากว่าบางตัวใช้ตัวเลือก -F ตลอดทั้งชุดเครื่องมือการคอมไพล์สำหรับระบุรูปแบบไฟล์อ็อบเจ็กต์สำหรับไฟล์อ็อบเจกต์อินพุตและเอาต์พุต ตัวเชื่อมโยง GNU ใช้กลไกอื่น ๆ เพื่อวัตถุประสงค์นี้ ได้แก่ ตัวเลือก -b , --form , -oformat , คำสั่ง "TARGET" ในสคริปต์ linker และตัวแปรสภาพแวดล้อม "GNUTARGET" ลิงเกอร์ GNU จะไม่สนใจตัวเลือก -F เมื่อไม่ได้สร้างอ็อบเจ็กต์ ELF ที่ใช้ร่วมกัน

-fini ชื่อ

เมื่อสร้างเอลฟ์หรือวัตถุที่ใช้ร่วมกันให้เรียก NAME เมื่อปฏิบัติการหรือวัตถุที่ใช้ร่วมกันถูกยกเลิกการโหลดโดยการตั้งค่า DT_FINI ไปยังที่อยู่ของฟังก์ชัน โดยค่าเริ่มต้น linker จะใช้ "_fini" เป็นฟังก์ชันในการโทร

-G

ละเว้น มีไว้เพื่อให้เข้ากันได้กับเครื่องมืออื่น ๆ

-G ค่า

--gpsize = ค่า

กำหนดขนาดสูงสุดของวัตถุที่จะปรับให้เหมาะสมโดยใช้ GP register to size นี่เป็นเพียงความหมายสำหรับรูปแบบไฟล์อ็อบเจ็กต์เช่น MIPS ECOFF ซึ่งรองรับการวางวัตถุขนาดใหญ่และเล็กลงในส่วนต่างๆ นี้จะถูกละเว้นสำหรับรูปแบบไฟล์วัตถุอื่น ๆ

-h ชื่อ

-soname = ชื่อ

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

-ผม

ทำลิงก์ที่เพิ่มขึ้น (เช่นเดียวกับตัวเลือก -r )

- พิมพ์ ชื่อ

เมื่อสร้างเอลฟ์หรือวัตถุที่ใช้ร่วมกันให้เรียก NAME เมื่อปฏิบัติการหรือวัตถุที่ใช้ร่วมกันถูกโหลดโดยการตั้งค่า DT_INIT เป็นที่อยู่ของฟังก์ชัน โดยค่าเริ่มต้น linker จะใช้ "_init" เป็นฟังก์ชันในการโทร

ที่ เก็บถาวร

--library = ที่ เก็บถาวร

เพิ่มที่ เก็บไฟล์ ถาวร ลงในรายการไฟล์ที่จะเชื่อมโยง ตัวเลือกนี้สามารถใช้ได้หลายครั้ง ld จะค้นหารายการเส้นทางสำหรับ "libarchive.a" สำหรับทุกๆที่ เก็บถาวร

ในระบบที่สนับสนุนไลบรารีที่ใช้ร่วมกัน ld อาจค้นหาไลบรารีที่มีส่วนขยายอื่นที่ไม่ใช่ ".a" โดยเฉพาะอย่างยิ่งในระบบ ELF และ SunOS ld จะค้นหาไดเรกทอรีสำหรับไลบรารีที่มีนามสกุล ".so" ก่อนค้นหาไฟล์ที่มีนามสกุลเป็น ".a" ตามข้อตกลงส่วนขยาย ".so" จะระบุไลบรารีที่ใช้ร่วมกัน

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

ดูตัวเลือก - ( ตัวเลือกสำหรับวิธีบังคับให้ลิงเกอร์จัดเก็บข้อมูลหลายครั้ง

คุณสามารถแสดงที่เก็บเดียวกันหลายครั้งในบรรทัดคำสั่ง

การค้นหาแบบถาวรนี้เป็นมาตรฐานสำหรับลิงเกอร์ของ Unix อย่างไรก็ตามหากคุณใช้ ld onAIX โปรดทราบว่าแตกต่างจากลักษณะการทำงานของ linker AIX

- L searchdir

--library-path = searchdir

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

ถ้า searchdir เริ่มต้นด้วย "=" แล้ว "=" จะถูกแทนที่ด้วย คำนำหน้า sysroot ซึ่งเป็นเส้นทางที่ระบุเมื่อมีการกำหนดค่า linker ไว้

ชุดค่าเริ่มต้นของเส้นทางที่ค้นหา (โดยไม่ต้องระบุด้วย -L ) ขึ้นอยู่กับโหมดการเลียนแบบ ld ที่ ใช้อยู่และในบางกรณีก็มีการกำหนดค่าด้วยเช่นกัน

เส้นทางสามารถระบุได้ในสคริปต์ลิงก์ด้วยคำสั่ง "SEARCH_DIR" ไดเรกทอรีที่ระบุด้วยวิธีนี้จะค้นหาที่จุดที่สคริปต์ตัวเชื่อมโยงปรากฏในบรรทัดคำสั่ง

การ เลียนแบบ - m

เลียนแบบตัวเลียนแบบการ เลียนแบบ คุณสามารถแสดงรายการ emulations ที่มีอยู่โดยใช้ตัวเลือก - verbose หรือ -V

ถ้าไม่ได้ใช้ตัวเลือก -m การจำลองจะถูกนำมาจากตัวแปรสภาพแวดล้อม "LDEMULATION" หากมีการกำหนดไว้

มิฉะนั้นการจำลองเริ่มต้นจะขึ้นอยู่กับการกำหนดค่าตัวเชื่อมโยง

-M

--print แผนที่

พิมพ์แผนที่เชื่อมโยงไปยังเอาต์พุตมาตรฐาน แผนที่การเชื่อมโยงแสดงข้อมูลเกี่ยวกับการเชื่อมโยงรวมถึงสิ่งต่อไปนี้:

* * * *

ตำแหน่งไฟล์และสัญลักษณ์ของวัตถุจะถูกแม็พเข้าในหน่วยความจำ

* * * *

สัญลักษณ์ที่ใช้กันทั่วไปได้รับการจัดสรรอย่างไร

* * * *

สมาชิกเก็บถาวรทั้งหมดที่รวมอยู่ในลิงก์โดยกล่าวถึงสัญลักษณ์ที่ทำให้สมาชิกถาวรถูกนำเข้ามา

-n

--nmagic

ปิดการจัดตำแหน่งส่วนของหน้าและทำเครื่องหมายเอาต์พุตเป็น "NMAGIC" ถ้าเป็นไปได้

-N

--omagic

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

--no-omagic

ตัวเลือกนี้จะลบล้างผลกระทบส่วนใหญ่ของตัวเลือก -N กำหนดส่วนข้อความให้เป็นแบบอ่านอย่างเดียวและบังคับให้ส่วนข้อมูลเป็นแนวหน้า หมายเหตุ - ตัวเลือกนี้ไม่ได้เปิดใช้งานการเชื่อมโยงกับไลบรารีที่ใช้ร่วมกัน ใช้ - Dynamic สำหรับนี้

- ออก

- ออก = ส่งออก

ใช้ เอาท์พุท เป็นชื่อของโปรแกรมที่ผลิตโดย ld ; ถ้าไม่มีการระบุตัวเลือกนี้ชื่อ a.out จะถูกใช้เป็นค่าเริ่มต้น คำสั่งสคริปต์ "OUTPUT" ยังสามารถระบุชื่อไฟล์ที่ส่งออก

-O ระดับ

ถ้า ระดับ เป็น ค่าตัวเลขที่ มากกว่าศูนย์ ld จะ เพิ่มประสิทธิภาพเอาท์พุท การดำเนินการนี้อาจใช้เวลานานกว่าปกติและอาจใช้เฉพาะไบนารีสุดท้ายเท่านั้น

-q

--emit-relocs

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

ขณะนี้ตัวเลือกนี้ใช้ได้กับแพลตฟอร์ม ELF เท่านั้น

-r

--relocateable

สร้างเอาท์พุทที่ relocatable - คือสร้างไฟล์ที่ส่งออกซึ่งจะสามารถใช้เป็นอินพุตไปยัง ld ซึ่งมักเรียกว่า การเชื่อมโยงบางส่วน ในฐานะที่เป็นผลข้างเคียงในสภาพแวดล้อมที่สนับสนุนตัวเลขมายากล Unix มาตรฐานตัวเลือกนี้จะกำหนดจำนวนมายากลของไฟล์ที่ส่งออกเป็น "OMAGIC" หากไม่มีการระบุตัวเลือกนี้จะมีการสร้างไฟล์แบบสัมบูรณ์ เมื่อเชื่อมโยงโปรแกรม C ++ ตัวเลือกนี้ จะไม่ แก้การอ้างอิงถึง constructors ในการทำเช่นนั้นให้ใช้ -Ur .

เมื่อไฟล์อินพุตไม่มีรูปแบบเช่นเดียวกับไฟล์ที่ส่งออกการเชื่อมโยงบางส่วนจะได้รับการสนับสนุนหากไฟล์อินพุตนั้นไม่มีการโยกย้าย รูปแบบการแสดงผลที่แตกต่างกันสามารถมีข้อ จำกัด เพิ่มเติม ตัวอย่างเช่นบางรูปแบบ "a.out" ไม่สนับสนุนการเชื่อมโยงบางส่วนกับไฟล์อินพุตในรูปแบบอื่น ๆ เลย

ตัวเลือกนี้จะเหมือนกับ -i

-R ชื่อไฟล์

--just-symbols = ชื่อไฟล์

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

สำหรับความเข้ากันได้กับตัวเชื่อมโยง ELF อื่น ๆ ถ้ามีการใช้ตัวเลือก -R ตามด้วยชื่อไดเร็กทอรีมากกว่าชื่อไฟล์จะถือว่าเป็นตัวเลือก -rpath

-s

--strip ทั้งหมด

ละเว้นข้อมูลสัญลักษณ์ทั้งหมดจากไฟล์ที่ส่งออก

-S

--strip-การแก้ปัญหา

ละเว้นข้อมูลสัญลักษณ์ดีบักเกอร์ (แต่ไม่ใช่สัญลักษณ์ทั้งหมด) จากไฟล์ที่ส่งออก

t-

--ติดตาม

พิมพ์ชื่อของไฟล์อินพุตตาม ld ประมวลผล

- แฟ้มสคริปต์

--script = scriptfile

ใช้ scriptfile เป็นสคริปต์ linker สคริปต์นี้จะแทนที่สคริปต์ linker เริ่มต้นของ ld (แทนที่จะเพิ่มลงไป) ดังนั้น commandfile ต้องระบุทุกอย่างที่จำเป็นเพื่ออธิบายไฟล์ที่ส่งออก หากไม่มีไฟล์ สคริปต์ อยู่ในไดเรกทอรีปัจจุบัน "ld" จะค้นหาไฟล์ดังกล่าวในไดเร็กทอรีที่ระบุโดยตัวเลือก L ก่อนหน้าใด ๆ หลายตัวเลือก T สะสม

-u สัญลักษณ์

- undefined = สัญลักษณ์

บังคับ สัญลักษณ์ ที่จะป้อนในไฟล์ที่ส่งออกเป็นสัญลักษณ์ที่ไม่ได้กำหนดไว้ การทำเช่นนี้อาจทำให้เกิดการเชื่อมโยงโมดูลเพิ่มเติมจากไลบรารีมาตรฐาน -u อาจถูกทำซ้ำด้วยอาร์กิวเมนต์ตัวเลือกอื่นเพื่อใส่สัญลักษณ์ที่ไม่ได้ระบุเพิ่มเติม ตัวเลือกนี้เทียบเท่ากับคำสั่งสคริปต์ linker "EXTERN"

-Ur

สำหรับโปรแกรมอื่นนอกเหนือจากโปรแกรม C ++ ตัวเลือกนี้จะเทียบเท่ากับ -r : จะสร้างเอาท์พุทที่ relocatable --- คือไฟล์ที่ส่งออกซึ่งจะสามารถใช้เป็นอินพุตไปยัง ld ได้ เมื่อเชื่อมโยงโปรแกรม C ++ -Ur จะ แก้ไขการอ้างอิงไปยัง constructor ซึ่งแตกต่างจาก -r . ไม่ทำงานเพื่อใช้ - ไม่ เกี่ยวกับไฟล์ที่มีการเชื่อมโยงกับ -Ur ; เมื่อสร้างตารางตัวสร้างแล้วจะไม่สามารถเพิ่มได้ ใช้ - ใช้เฉพาะกับลิงค์บางส่วนเท่านั้นและ -r สำหรับส่วนอื่น ๆ

--unique [= ส่วน ]

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

-v

--version

-V

แสดงหมายเลขเวอร์ชันสำหรับ ld ตัวเลือก -V ยังแสดงรายการจำลองที่ได้รับการสนับสนุน

-x

--discard ทั้งหมด

ลบสัญลักษณ์ในเครื่องทั้งหมด

-X

--discard-ชาวบ้าน

ลบสัญลักษณ์ท้องถิ่นชั่วคราวทั้งหมด สำหรับเป้าหมายส่วนใหญ่นี่คือสัญลักษณ์ท้องถิ่นทั้งหมดที่มีชื่อขึ้นต้นด้วย L

- สัญลักษณ์

--trace-symbol = สัญลักษณ์

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

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

- เส้นทาง Y

เพิ่ม เส้นทาง ไปยัง พา ธ การค้นหาไลบรารีดีฟอลต์ ตัวเลือกนี้มีอยู่สำหรับความเข้ากันได้ของ Solaris

-z คำหลัก

คำหลักที่รู้จักคือ "initfirst", "interpose", "loadfltr", "nodefaultlib", "nodelete", "nodlopen", "nodump", "now", "origin", "combreloc", "nocombreloc" และ "nocopyreloc " คำหลักอื่นจะถูกละเว้นสำหรับความเข้ากันได้ของ Solaris "initfirst" ทำเครื่องหมายวัตถุที่จะถูกเตรียมใช้งานก่อนเมื่อรันไทม์ก่อนวัตถุอื่น ๆ interpose เครื่องหมายวัตถุที่ตารางสัญลักษณ์ของ interposes ก่อนสัญลักษณ์ทั้งหมด แต่ปฏิบัติการหลัก loadfltr เครื่องหมายวัตถุที่ filtees ของการประมวลผลได้ทันทีที่รันไทม์ nodefaultlib เครื่องหมายวัตถุที่ค้นหา dependencies ของวัตถุนี้จะไม่สนใจ เส้นทางการค้นหาไลบรารีเริ่มต้น "nodelete" ทำเครื่องหมายว่าไม่ควรยกเลิกการโหลดวัตถุเมื่อรันไทม์ "nodlopen" หมายถึงวัตถุที่ไม่สามารถใช้ได้กับ "dlopen" "nodump" ทำเครื่องหมายว่าวัตถุไม่สามารถถูกทิ้งโดย "dldump" ได้ "ตอนนี้" เครื่องหมายวัตถุที่มีการเชื่อมโยงรันไทม์ที่ไม่เป็นอันตราย "ต้นทาง" ทำเครื่องหมายว่าวัตถุนี้อาจมี ORIGIN "defs" ไม่อนุญาตให้ใช้สัญลักษณ์ที่ไม่ได้ระบุไว้ "muldefs" ใช้คำจำกัดความหลายคำ "combreloc" รวมหลายส่วน reloc และเรียงลำดับเพื่อทำให้การค้นหาแคชแบบไดนามิกแคชเป็นไปได้

"nocombreloc" ปิดใช้งานส่วน reloc หลายส่วนที่รวมกัน "nocopyreloc" ปิดใช้งานการผลิตสำเนา relocs

- (ที่ เก็บถาวร -)

- เก็บ กลุ่ม เริ่มต้น - สิ้นสุดกลุ่ม

ที่ เก็บถาวร ควรเป็นรายการ ไฟล์เก็บถาวร พวกเขาอาจเป็นชื่อแฟ้มที่ชัดเจนหรือ -l ตัวเลือก

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

การใช้ตัวเลือกนี้มีค่าประสิทธิภาพที่สำคัญ ที่ดีที่สุดคือใช้เฉพาะเมื่อมีการอ้างอิงแบบวงกลมที่หลีกเลี่ยงไม่ได้ระหว่างที่เก็บถาวรตั้งแต่สองไฟล์ขึ้นไป

--accept ไม่รู้จักอินพุตโค้ง

--no-ยอมรับไม่รู้จักอินพุตโค้ง

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

- เน้น คำสำคัญ

ตัวเลือกนี้ถูกละเว้นสำหรับ ความเข้ากันได้ของ SunOS

-Bdynamic

-dy

-call_shared

ลิงก์กับไลบรารีแบบไดนามิก นี่มีความหมายเฉพาะบนแพลตฟอร์มที่ได้รับการสนับสนุน ห้องสมุดสาธารณะ ตัวเลือกนี้เป็นค่าเริ่มต้นบนแพลตฟอร์มดังกล่าว ตัวแปรต่างๆของตัวเลือกนี้มีไว้สำหรับเข้ากันได้กับระบบต่างๆ คุณอาจใช้ตัวเลือกนี้หลายครั้งในบรรทัดคำสั่ง: มันมีผลต่อการค้นหาไลบรารีสำหรับ -l ตัวเลือกที่ทำตามมัน

-Bgroup

ตั้งค่าสถานะ "DF_1_GROUP" ในรายการ "DT_FLAGS_1" ในส่วนแบบไดนามิก ซึ่งทำให้รันไทม์รันไทม์เชื่อมโยงกับ lookups ในอ็อบเจ็กต์นี้และการอ้างอิงที่จะดำเนินการภายในกลุ่มเท่านั้น ไม่ได้ระบุ เป็นนัย ตัวเลือกนี้มีความหมายเฉพาะบนแพลตฟอร์ม ELF ที่สนับสนุน ห้องสมุดสาธารณะ

-Bstatic

-dn

-non_shared

-คงที่

อย่าเชื่อมโยงกับ shared library นี่มีความหมายเฉพาะบนแพลตฟอร์มที่ได้รับการสนับสนุนห้องสมุดสาธารณะ ตัวแปรต่างๆของตัวเลือกนี้มีไว้สำหรับเข้ากันได้กับระบบต่างๆ คุณอาจใช้ตัวเลือกนี้หลายครั้งในบรรทัดคำสั่ง: มันมีผลต่อการค้นหาไลบรารีสำหรับ -l ตัวเลือกที่ทำตามมัน

-Bsymbolic

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

--check ส่วน

ส่วน --no-ตรวจสอบ

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

--cref

ส่งออกตารางอ้างอิงแบบไขว้ หากมีการสร้างไฟล์แผนที่เกอร์เกอร์ตารางอ้างอิงจะถูกพิมพ์ลงในไฟล์แผนที่ มิฉะนั้นจะพิมพ์บนเอาต์พุตมาตรฐาน

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

--no-กำหนดร่วมกัน

ตัวเลือกนี้ยับยั้งการกำหนดที่อยู่ให้เป็นสัญลักษณ์ทั่วไป คำสั่งสคริปต์ "INHIBIT_COMMON_ALLOCATION" มีผลเช่นเดียวกัน

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

--defsym symbol = expression

สร้างสัญลักษณ์ระดับโลกในไฟล์ที่ส่งออกซึ่งประกอบด้วยที่อยู่ที่แน่นอนที่กำหนดโดย นิพจน์ คุณสามารถใช้ตัวเลือกนี้ได้หลายครั้งเท่าที่จำเป็นเพื่อกำหนดหลายสัญลักษณ์ในบรรทัดคำสั่ง มีการสนับสนุนรูปแบบเลขคณิต จำกัด สำหรับ นิพจน์ ในบริบทนี้: คุณอาจให้ค่าคงที่เป็นเลขฐานสิบหกหรือชื่อของสัญลักษณ์ที่มีอยู่หรือใช้ "+" และ "-" เพื่อเพิ่มหรือลบค่าคงที่หรือสัญลักษณ์ที่เป็นตัวเลขฐานสิบหก หากคุณต้องการนิพจน์ที่ซับซ้อนมากขึ้นให้พิจารณาใช้ภาษาคำสั่ง linker จากสคริปต์ หมายเหตุ: ควรไม่มีช่องว่างระหว่าง เครื่องหมาย เท่ากับเครื่องหมาย (`` = '') และ นิพจน์

--demangle [= สไตล์ ]

--no-demangle

ตัวเลือกเหล่านี้จะควบคุมว่าควรเปลี่ยนชื่อสัญลักษณ์ในข้อความแสดงข้อผิดพลาดและเอาต์พุตอื่น ๆ หรือไม่ เมื่อลิงเกอร์ชี้ไปที่ demangle จะพยายามนำเสนอชื่อสัญลักษณ์ในรูปแบบที่สามารถอ่านได้: แถบนี้จะขีดเส้นใต้ชั้นล่างหากใช้รูปแบบไฟล์อ็อบเจ็กต์และแปลงชื่อสัญลักษณ์ที่เป็นสัญลักษณ์ของ C ++ เป็นชื่อที่อ่านได้ของผู้ใช้ คอมไพเลอร์ที่แตกต่างกันมีสไตล์ที่แตกต่างกัน สามารถใช้อาร์กิวเมนต์สไตล์ demangling ได้เพื่อเลือกรูปแบบการทำให้หย่อนชี้ที่เหมาะสมสำหรับคอมไพเลอร์ของคุณ linker จะ demangle โดยดีฟอลต์เว้นแต่ว่าได้ตั้งค่าตัวแปร environment COLLECT_NO_DEMANGLE แล้ว ตัวเลือกเหล่านี้อาจถูกใช้เพื่อแทนที่ค่าดีฟอลต์

- ไฟล์ linker แบบไดนามิก

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

--embedded-relocs

ตัวเลือกนี้มีความหมายเฉพาะเมื่อเชื่อมโยงรหัส MIPS embedded PIC ซึ่งสร้างโดยตัวเลือก -membedded-pic ไปยังคอมไพเลอร์ GNL และ assembler ทำให้เกอร์เกอร์สร้างตารางซึ่งอาจใช้เมื่อรันไทม์เพื่อย้ายข้อมูลใด ๆ ที่ได้รับการตั้งค่าเริ่มต้นให้เป็นตัวชี้ค่า ดูรหัสใน testsuite / ld-empic สำหรับรายละเอียด

--fatal-คำเตือน

ปฏิบัติตามคำเตือนทั้งหมดเป็น ข้อผิดพลาด

--force-exe-ต่อท้าย

ตรวจสอบให้แน่ใจว่าไฟล์ที่ส่งออกมีคำต่อท้าย. exe

ถ้าแฟ้มที่ส่งออกที่มีการเชื่อมโยงอย่างเต็มที่ที่สร้างขึ้นอย่างสมบูรณ์ไม่มีตัวเชื่อมต่อ " .exe " หรือ " .dll " ตัวเลือกนี้จะบังคับให้ตัวเชื่อมโยงคัดลอกไฟล์ที่ส่งออกไปยังชื่อเดียวกันที่มีส่วนต่อท้าย ".exe" ตัวเลือกนี้มีประโยชน์เมื่อใช้ makefiles ของ Unix ที่ ไม่ได้รับการแก้ไขในโฮสต์ Microsoft Windows เนื่องจาก Windows บางรุ่นจะไม่เรียกใช้ภาพเว้นแต่ว่าจะลงท้ายด้วย ".exe" suffix

--no-GC-ส่วน

--gc ส่วน

เปิดใช้งานการเก็บรวบรวมขยะของส่วนอินพุตที่ไม่ได้ใช้งาน ไม่สนใจเป้าหมายที่ไม่สนับสนุนตัวเลือกนี้ ตัวเลือกนี้ไม่สามารถใช้ได้กับ -r และไม่ควรใช้กับการเชื่อมโยงแบบไดนามิก ลักษณะการทำงานที่เป็นค่าเริ่มต้น (ไม่ใช่การประมวลผล คอลเล็กชันขยะ ) สามารถเรียกคืนได้โดยระบุ --no-gc-sections บนบรรทัดคำสั่ง

--ช่วยด้วย

พิมพ์สรุปตัวเลือกบรรทัดคำสั่งบนเอาต์พุตมาตรฐานและออก

--target ช่วยเหลือ

พิมพ์สรุปตัวเลือกเฉพาะเป้าหมายทั้งหมดที่เอาต์พุตมาตรฐานและออก

- แผนที่แผนที่แบบแผนที่

พิมพ์แผนที่เชื่อมโยงไปยังไฟล์แผนที่ ดูรายละเอียดของตัวเลือก -M ด้านบน

--no-เก็บหน่วยความจำ

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

--no-ที่ไม่ได้กำหนด

-z defs

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

--allow-หลายความหมาย

-z muldefs

โดยปกติเมื่อมีการกำหนดสัญลักษณ์ไว้หลายครั้ง linker จะรายงานข้อผิดพลาดร้ายแรง ตัวเลือกเหล่านี้ให้คำจำกัดความหลายคำและใช้คำจำกัดความแรก

--allow-shlib-ที่ไม่ได้กำหนด

อนุญาตสัญลักษณ์ที่ไม่ได้ระบุในออบเจกต์ที่ใช้ร่วมกันแม้จะมีการตั้งค่า --no-undefined ผลสุทธิจะเป็นสัญลักษณ์ที่ไม่ได้กำหนดไว้ในวัตถุปกติจะยังทำให้เกิดข้อผิดพลาด แต่สัญลักษณ์ที่ไม่ได้ระบุในออบเจ็กต์ที่ใช้ร่วมกันจะถูกละเว้น การดำเนินการ no_undefined ทำให้สันนิษฐานว่าตัวเชื่อมต่อรันไทม์จะทำให้สัญลักษณ์ไม่ได้รับการนิ่ง อย่างไรก็ตามมีอย่างน้อยหนึ่งระบบ (BeOS) ซึ่งสัญลักษณ์ที่ไม่ได้ระบุไว้ในไลบรารีที่ใช้ร่วมกันเป็นเรื่องปกติเนื่องจากเคอร์เนลจะแพทช์ในเวลาโหลดเพื่อเลือกฟังก์ชันที่เหมาะสมที่สุดสำหรับสถาปัตยกรรมปัจจุบัน IE เลือกฟังก์ชัน memset ที่เหมาะสม เห็นได้ชัดว่าเป็นเรื่องปกติสำหรับไลบรารีที่ใช้ร่วมกันของ HPPA จะมีสัญลักษณ์ที่ไม่ได้ระบุไว้

--no-undefined รุ่น

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

--no-เตือนไม่ตรงกัน

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

--no-ทั้งเก็บ

ปิดใช้งาน อ็อพชัน --whole-archive สำหรับไฟล์เก็บข้อมูลที่ตามมา

--noinhibit-exec

เก็บไฟล์เอาท์พุทปฏิบัติการเอาไว้เมื่อใดก็ตามที่ยังใช้งานได้อยู่ โดยปกติลิงเกอร์จะไม่สามารถผลิตไฟล์ที่ส่งออกได้หากพบข้อผิดพลาดระหว่างกระบวนการเชื่อมโยง มันออกมาโดยไม่ต้องเขียนไฟล์ที่ส่งออกเมื่อมีปัญหาใด ๆ ข้อผิดพลาดใด ๆ

-nostdlib

เฉพาะไดเร็กทอรีไลบรารีการค้นหาที่ระบุไว้อย่างชัดเจนในบรรทัดคำสั่ง ไดเรกทอรีไลบรารีที่ระบุในสคริปต์ linker (รวมถึงสคริปต์ linker ที่ระบุในบรรทัดคำสั่ง) จะถูกละเว้น

- รูปแบบเอาต์พุตรูปแบบ

ld อาจได้รับการกำหนดค่าให้รองรับไฟล์อ็อบเจ็กต์มากกว่าหนึ่งชนิด ถ้า ld ของคุณถูกกำหนดค่าด้วยวิธีนี้คุณสามารถใช้ตัวเลือก --oformat เพื่อระบุรูปแบบไบนารีสำหรับไฟล์อ็อบเจ็กต์เอาต์พุต แม้ว่า ld จะได้รับการกำหนดค่าให้สนับสนุนรูปแบบอ็อบเจ็กต์ทางเลือก แต่โดยปกติแล้วคุณไม่จำเป็นต้องระบุค่านี้เนื่องจาก ld ควรได้รับการกำหนดค่าให้เป็นรูปแบบเอาต์พุตเริ่มต้นเป็นรูปแบบปกติที่สุดในแต่ละเครื่อง รูปแบบเอาต์พุต เป็นสตริงข้อความชื่อของรูปแบบเฉพาะที่ไลบรารี BFD สนับสนุน (คุณสามารถระบุรูปแบบไบนารีที่มีอยู่ด้วย objdump -i ) คำสั่งสคริปต์ "OUTPUT_FORMAT" ยังสามารถระบุรูปแบบการแสดงผลได้ แต่ตัวเลือกนี้จะลบล้าง

-qmagic

ตัวเลือกนี้ถูกละเว้นสำหรับความเข้ากันได้ของ Linux

-Qy

ตัวเลือกนี้ถูกละเว้นสำหรับความเข้ากันได้ของ SVR4

--ผ่อนคลาย

ตัวเลือกที่มีผลต่อเครื่อง ตัวเลือกนี้ได้รับการสนับสนุนเฉพาะบางเป้าหมายเท่านั้น

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

ในบางแพลตฟอร์มการเพิ่มประสิทธิภาพทั่วโลกของ link link เหล่านี้อาจทำให้การ ดีบัก สัญลักษณ์ของไฟล์ที่เป็นไปไม่ได้เกิดขึ้น นี่เป็นที่ทราบกันดีว่าเป็นตระกูล Matsushita MN10200 และ MN10300

บนแพลตฟอร์มที่ไม่ได้รับการสนับสนุน - ถูกยอมรับ แต่ละเลย

- กู้ไฟล์สัญลักษณ์ - ไฟล์

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

- กู้ไฟล์สัญลักษณ์ ไม่ ได้ ลบสัญลักษณ์ที่ไม่ได้ระบุหรือสัญลักษณ์ที่จำเป็นสำหรับการย้ายใหม่

คุณสามารถระบุ - กู้ไฟล์สัญลักษณ์ได้ เพียงครั้งเดียวในบรรทัดคำสั่ง จะแทนที่ - s และ -S

- เส้นทางการเดินรถ

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

ตัวเลือก -rpath อาจใช้ใน SunOS ตามค่าเริ่มต้นใน SunOS linker จะสร้างแพทช์ค้นหารันไทม์จาก L- ตัวเลือกทั้งหมดที่ได้รับ ถ้ามีการใช้ตัวเลือก -rpath เส้นทางการค้นหารันไทม์จะสร้างขึ้นโดยใช้ตัวเลือก -rpath โดยไม่คำนึงถึงตัวเลือก -L นี้จะมีประโยชน์เมื่อใช้ gcc ซึ่งจะเพิ่มตัวเลือก -L จำนวนมากซึ่งอาจเป็น onNFS ที่ติดตั้งระบบไฟล์

สำหรับความเข้ากันได้กับตัวเชื่อมโยง ELF อื่น ๆ ถ้ามีการใช้ตัวเลือก -R ตามด้วยชื่อไดเร็กทอรีมากกว่าชื่อไฟล์จะถือว่าเป็นตัวเลือก -rpath

- ลิงก์ DIR ลิงก์

เมื่อใช้ ELF หรือ SunOS ไลบรารีที่ใช้ร่วมกันหนึ่งอาจต้องใช้ไลบรารีอื่น เหตุการณ์นี้เกิดขึ้นเมื่อลิงก์ "ld -shared" รวมถึงไลบรารีที่ใช้ร่วมกันเป็นหนึ่งในไฟล์อินพุต

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

ควรใช้ตัวเลือกนี้ด้วยความระมัดระวังเนื่องจากจะแทนที่เส้นทางการค้นหาที่อาจได้รับการรวบรวมอย่างหนักลงในไลบรารีที่ใช้ร่วมกัน ในกรณีเช่นนี้คุณสามารถใช้เส้นทางการค้นหาที่แตกต่างจากลิงเกอร์รันไทม์ได้โดยไม่ได้ตั้งใจ

ตัวเชื่อมโยงใช้เส้นทางการค้นหาต่อไปนี้เพื่อค้นหาไลบรารีที่ใช้ร่วมกันที่ต้องการ

1

ไดเร็กทอรีที่ระบุโดย -rpath-link options

2

ไดเร็กทอรีที่ระบุโดย -rpath options ความแตกต่างระหว่าง -rpath และ -rpath-link คือไดเร็กทอรีที่ระบุโดย -rpath options จะรวมอยู่ใน executable และใช้ที่รันไทม์ในขณะที่ตัวเลือก -rpath-link มีผลเฉพาะในเวลา link เท่านั้น สำหรับตัวเชื่อมต่อเนทีฟเท่านั้น

3

ในระบบ ELF ถ้าไม่ใช้ตัวเลือก "rpath" และ "rpath-link" ให้ค้นหาเนื้อหาของตัวแปรสภาพแวดล้อม "LD_RUN_PATH" สำหรับตัวเชื่อมต่อเนทีฟเท่านั้น

4

ใน SunOS ถ้าไม่ได้ใช้ตัวเลือก -rpath ให้ค้นหาไดเรกทอรีที่ระบุโดยใช้ตัวเลือก -L

5

สำหรับเนทีฟเกอร์เกอร์เนื้อหาของตัวแปรสภาพแวดล้อม "LD_LIBRARY_PATH"

6

สำหรับลิงเกอร์ ELF แบบพื้นเมืองไดเรกทอรีใน "DT_RUNPATH" หรือ "DT_RPATH" ของไลบรารีที่ใช้ร่วมกันจะค้นหาไลบรารีที่ใช้ร่วมกันซึ่งจำเป็นต้องใช้ รายการ "DT_RPATH" จะถูกละเว้นถ้ามีรายการ "DT_RUNPATH" อยู่

7

ไดเร็กทอรีดีฟอลต์ปกติ / lib และ / usr / lib

8

สำหรับลิงเกอร์ท้องถิ่นในระบบ ELF ถ้าไฟล์ /etc/ld.so.conf มีอยู่แล้วรายการไดเร็กทอรีที่พบในไฟล์นั้น

หากไม่พบไลบรารีที่ใช้ร่วมกันที่ต้องการ linker จะแจ้งเตือนและดำเนินการต่อด้วยลิงก์

-shared

-Bshareable

สร้างไลบรารีที่ใช้ร่วมกัน ขณะนี้สนับสนุนเฉพาะในแพลตฟอร์ม ELF, XCOFF และ SunOS เท่านั้น ใน SunOS linker จะสร้างไลบรารีที่ใช้ร่วมกันโดยอัตโนมัติหากไม่มีการใช้ตัวเลือก -e และมีสัญลักษณ์ที่ไม่ได้ระบุไว้ในลิงก์

--sort ทั่วไป

ตัวเลือกนี้จะบอกให้ ld จัดเรียงสัญลักษณ์ทั่วไปตามขนาดเมื่อวางไว้ในส่วนเอาท์พุทที่เหมาะสม แรกมาทุกสัญลักษณ์ไบต์แล้วทั้งสองไบต์แล้วทั้งหมดสี่ไบต์แล้วทุกอย่างอื่น เพื่อป้องกันช่องว่างระหว่างสัญลักษณ์เนื่องจากข้อ จำกัด ในการปรับตำแหน่ง

--split-by-file [ ขนาด ]

คล้ายกับ --split-by-reloc แต่สร้างส่วนเอาท์พุทใหม่สำหรับไฟล์อินพุตแต่ละไฟล์เมื่อ มีขนาด ถึง ขนาด เริ่มต้นขนาด 1 ถ้าไม่ได้กำหนด

--split-by-reloc [ นับ ]

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

--stats

คำนวณและแสดงสถิติเกี่ยวกับการทำงานของลิงเกอร์เช่นเวลาในการดำเนินการและการใช้หน่วยความจำ

--traditional รูปแบบ

สำหรับเป้าหมายบางส่วนผลลัพธ์ของ ld จะแตกต่างกันไปในบางกรณีจากผลลัพธ์ของลิงเกอร์ที่มีอยู่ สวิตช์นี้ขอให้ ld ใช้รูปแบบดั้งเดิมแทน

ตัวอย่างเช่นใน SunOS ld จะ รวมรายการที่ซ้ำกันในตารางสตริงสัญลักษณ์ ซึ่งสามารถลดขนาดของไฟล์ที่ส่งออกด้วยข้อมูลดีบั๊กได้มากกว่า 30 เปอร์เซ็นต์ โปรแกรม "dbx" ของ SunOS ไม่สามารถอ่านโปรแกรมที่เป็นผลลัพธ์ ("gdb" ไม่มีปัญหา) สวิตช์ รูปแบบดั้งเดิม บอกให้ ld ไม่รวมรายการที่ซ้ำกัน

- section-start sectionname = org

ค้นหาส่วนใน ไฟล์ ที่ ส่งออก ตามที่อยู่ที่ระบุโดย org คุณสามารถใช้ตัวเลือกนี้ได้หลายครั้งเท่าที่จำเป็นเพื่อค้นหาหลายส่วนในบรรทัดคำสั่ง org ต้องเป็นจำนวนเต็มฐานสิบหกอันเดียว สำหรับความเข้ากันได้กับตัวเชื่อมโยงอื่น ๆ คุณอาจข้าม 0x ชั้นนำซึ่งมักจะเกี่ยวข้องกับค่าฐานสิบหก หมายเหตุ: ควรไม่มีช่องว่างระหว่าง sectionname , เครื่องหมายเท่ากับ (`` = '') และ org

-Tbss org

-Tdata org

- ข้อความเท็กซ์

ใช้ org เป็นที่อยู่เริ่มต้นสำหรับ --- ตามลำดับ --- "bss", "data" หรือส่วน "text" ของไฟล์ที่ส่งออก org ต้องเป็นจำนวนเต็มฐานสิบหกอันเดียว สำหรับความเข้ากันได้กับตัวเชื่อมโยงอื่น ๆ คุณอาจข้าม 0x ชั้นนำซึ่งมักจะเกี่ยวข้องกับค่าฐานสิบหก

--dll-ละเอียด

--verbose

แสดงหมายเลขเวอร์ชันสำหรับ ld และแสดงรายการ emulation เกอร์ที่สนับสนุน แสดงว่าไฟล์อินพุตสามารถและไม่สามารถเปิดได้ แสดงสคริปต์ linker ที่ใช้โดย linker

--version-script = version-scriptfile

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

--warn ทั่วไป

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

สัญลักษณ์สามมิติของโลกมีอยู่สามประเภทดังที่แสดงไว้ในตัวอย่าง C:

int i = 1;

คำจำกัดความซึ่งจะไปในส่วนข้อมูลที่เตรียมใช้งานของไฟล์ที่ส่งออก

extern int;

การอ้างอิงที่ไม่ได้กำหนดซึ่งไม่ได้จัดสรรพื้นที่ ต้องมีนิยามหรือสัญลักษณ์ทั่วไปสำหรับตัวแปรบางแห่ง

int i;

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

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

1

เปลี่ยนสัญลักษณ์ทั่วไปเป็นข้อมูลอ้างอิงเนื่องจากมีคำจำกัดความของสัญลักษณ์อยู่แล้ว

(
): warning: common ของ ` 'ถูกแทนที่ด้วยคำนิยาม (
): warning: defined here

2

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

(
): คำเตือน: นิยามของ `<สัญลักษณ์> 'แทนที่แฟ้ม ทั่วไป (
): คำเตือน: ทั่วไปอยู่ที่นี่

3

ผสานสัญลักษณ์ทั่วไปที่มีสัญลักษณ์ทั่วไปเดิมก่อนหน้านี้

(
): warning: common common ของ ` ' (
): คำเตือน: ก่อนหน้านี้เป็นที่นิยมทั่วไป

4

ผสานสัญลักษณ์สามัญที่มีสัญลักษณ์ทั่วไปขนาดใหญ่ก่อนหน้านี้

(
): คำเตือน: ทั่วไปของ ` 'ถูกแทนที่โดยใหญ่ (
): คำเตือน: ใหญ่ขึ้นทั่วไปอยู่ที่นี่

5

ผสานสัญลักษณ์สามัญที่มีสัญลักษณ์ร่วมก่อนหน้าเล็กกว่าก่อนหน้านี้ นี่เป็นเช่นเดียวกับกรณีก่อนหน้ายกเว้นว่าสัญลักษณ์จะพบในลำดับที่แตกต่างกัน

(
): คำเตือน: ทั่วไปของ `<สัญลักษณ์> 'แทนที่ไฟล์ ที่เล็กกว่า (
): คำเตือน: มีขนาดเล็กอยู่ที่นี่

--warn-ก่อสร้าง

เตือนถ้ามีการใช้ตัวสร้างแบบโกลบอล นี้มีประโยชน์สำหรับรูปแบบแฟ้มบางวัตถุ สำหรับรูปแบบเช่น COFF หรือ ELF linker จะไม่สามารถตรวจจับการใช้ constructors ส่วนกลางได้

--warn-หลาย-GP

เตือนว่าต้องใช้ค่าตัวชี้โกลบอลหลายตัวใน ไฟล์ที่ส่งออก นี่เป็นเพียงความหมายสำหรับโปรเซสเซอร์บางตัวเท่านั้นเช่น Alpha โดยเฉพาะโปรเซสเซอร์บางตัวจะใส่ค่าคงที่ที่มีขนาดใหญ่ไว้ในส่วนพิเศษ รีจิสเตอร์พิเศษ (ตัวชี้ส่วนกลาง) จะชี้ไปที่ส่วนตรงกลางของส่วนนี้เพื่อให้ค่าคงที่สามารถโหลดได้อย่างมีประสิทธิภาพผ่านทางโหมดการระบุที่อยู่แบบ relative-register เนื่องจาก offset ในโหมด relative-register relative ได้รับการแก้ไขและค่อนข้างเล็ก (เช่น 16 bits) ซึ่งจะ จำกัด ขนาดสูงสุดของ pool คงที่ ดังนั้นในโปรแกรมขนาดใหญ่จึงมักจำเป็นต้องใช้ค่าตัวชี้โกลบอลหลายตัวเพื่อให้สามารถกำหนดค่าที่เป็นไปได้ทั้งหมด ตัวเลือกนี้ทำให้เกิดคำเตือนที่จะออกเมื่อใดก็ตามที่เกิดกรณีนี้

--warn ครั้งเดียว

เตือนเพียงครั้งเดียวสำหรับแต่ละสัญลักษณ์ที่ไม่ได้กำหนดมากกว่าหนึ่งครั้งต่อโมดูลซึ่งหมายถึง

--warn ส่วนชิด

เตือนถ้าที่อยู่ของส่วนเอาท์พุทมีการเปลี่ยนแปลงเนื่องจากการจัดแนว โดยปกติการจัดตำแหน่งจะถูกตั้งค่าโดยส่วนป้อนข้อมูล ที่อยู่จะถูกเปลี่ยนหากไม่ได้ระบุไว้อย่างชัดแจ้ง นั่นคือถ้าคำสั่ง "SECTIONS" ไม่ได้ระบุที่อยู่เริ่มต้นของส่วน

--whole การเก็บถาวร

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

บันทึกย่อสองรายการเมื่อใช้ตัวเลือกนี้จาก gcc: ก่อน gcc ไม่ทราบเกี่ยวกับตัวเลือกนี้ดังนั้นคุณต้องใช้ -Wl, -whole-archive ประการที่สองอย่าลืมใช้ -Wl, -no-entire-archive หลังจากรายการที่เก็บถาวรเนื่องจาก gcc จะเพิ่มรายการที่เก็บถาวรลงในลิงก์ของคุณและคุณอาจไม่ต้องการให้แฟล็กนี้มีผลต่อข้อมูลเหล่านี้เช่นกัน

- สัญลักษณ์แบบยาว

ใช้ฟังก์ชัน wrapper สำหรับ สัญลักษณ์ การอ้างอิงใด ๆ ที่ไม่ได้ระบุถึง สัญลักษณ์ จะได้รับการแก้ไขเป็น "__ wrap_symbol" การอ้างอิงที่ไม่ได้ระบุถึง "__real_symbol" จะได้รับการแก้ไขเป็น สัญลักษณ์

นี้สามารถใช้เพื่อให้ wrapper สำหรับฟังก์ชันระบบ ฟังก์ชัน wrapper ควรถูกเรียกว่า "__wrap_symbol" ถ้าต้องการเรียกใช้ฟังก์ชันระบบควรเรียก "__ real_symbol"

นี่เป็นตัวอย่างเล็กน้อย:

void * __wrap_malloc (int c) {printf ("malloc เรียกว่ามี% ld \ n", c); กลับ __real_malloc (c); }

ถ้าคุณเชื่อมโยงโค้ดอื่นกับไฟล์นี้โดยใช้ --wrap malloc การ โทรทั้งหมดไปที่ "malloc" จะเรียกใช้ฟังก์ชัน "__wrap_malloc" แทน สายเรียกเข้า "__real_malloc" ใน "__wrap_malloc" จะเรียกฟังก์ชัน "malloc" ที่แท้จริง

คุณอาจต้องการให้ฟังก์ชัน "__real_malloc" ด้วยเพื่อให้ลิงก์ที่ไม่มีตัวเลือก --wrap จะประสบความสำเร็จ ถ้าคุณทำเช่นนี้คุณไม่ควรใส่คำนิยามของ "__ real_malloc" ในไฟล์เดียวกับ "__wrap_malloc"; ถ้าคุณทำเช่นนั้นแอสเซมเบลอร์อาจแก้ไขการเรียกก่อนที่ตัวเชื่อมโยงมีโอกาสที่จะห่อหุ้มให้เป็น "malloc"

--enable-new-dtags

--disable-new-dtags

ลิงเกอร์นี้สามารถสร้างแท็กแบบไดนามิกใหม่ใน ELF ได้ แต่ระบบ ELF เก่าอาจไม่เข้าใจพวกเขา หากคุณระบุ --dable-new-dtags แท็กแบบไดนามิกจะสร้างขึ้นตามต้องการ หากคุณระบุ --disable-new-dtags จะ ไม่มีการสร้างแท็กแบบไดนามิกใหม่ แท็กแบบไดนามิกใหม่จะไม่สร้างขึ้น โปรดทราบว่าตัวเลือกเหล่านี้มีให้ใช้กับระบบงานแบบครบวงจรเท่านั้น

ตัวเชื่อมต่อ PE i386 สนับสนุนตัวเลือก " แชร์ " ซึ่งทำให้เอาต์พุตเป็นไลบรารีที่เชื่อมโยงแบบไดนามิก (DLL) แทนที่จะเป็นไฟล์ปฏิบัติการปกติ คุณควรตั้งชื่อเอาท์พุท "* .dll" เมื่อคุณใช้ตัวเลือกนี้ นอกจากนี้ตัวเชื่อมโยงยังสามารถรองรับไฟล์ "* .def" มาตรฐานซึ่งอาจระบุในบรรทัดคำสั่ง linker เช่นไฟล์อ็อบเจ็กต์ (ในความเป็นจริงควรนำข้อมูลที่เก็บมาจากคลังก่อนหน้านี้เพื่อให้มั่นใจว่าได้รับลิงก์ใน, เช่นเดียวกับไฟล์อ็อบเจ็กต์ปกติ)

นอกเหนือจากตัวเลือกทั่วไปสำหรับเป้าหมายทั้งหมดตัวเชื่อมโยง PE i386 ยังสนับสนุนตัวเลือกบรรทัดคำสั่งเพิ่มเติมที่เฉพาะเจาะจงสำหรับเป้าหมาย PE i386 ตัวเลือกที่ใช้ค่าอาจถูกแยกออกจากค่าด้วยช่องว่างหรือเครื่องหมายเท่ากับ

--add-stdcall นามแฝง

หากได้รับสัญลักษณ์ที่มีคำต่อท้าย stdcall (@ nn ) จะถูกเอ็กซ์พอร์ตตามที่เป็นและยังมีส่วนต่อท้ายถูกถอดออก

- ไฟล์ฐาน ข้อมูล

ใช้ ไฟล์ เป็นชื่อของไฟล์ที่จะบันทึกที่อยู่พื้นฐานของ relocations ทั้งหมดที่จำเป็นสำหรับการสร้าง DLLs กับ dlltool

--dll

สร้าง DLL แทนที่จะเป็นปฏิบัติการปกติ คุณอาจใช้ - แชร์ หรือระบุ "LIBRARY" ในไฟล์ ".def" ที่ระบุ

--enable-stdcall-fixup

--disable-stdcall-fixup

หากลิงก์พบสัญลักษณ์ที่ไม่สามารถแก้ไขได้จะพยายามทำ `` fuzzy linking '' โดยค้นหาสัญลักษณ์อื่นที่กำหนดซึ่งแตกต่างจากรูปแบบของชื่อสัญลักษณ์ (cdecl vs stdcall) และจะแก้ไขสัญลักษณ์ดังกล่าวโดยการเชื่อมโยง ไปที่การแข่งขัน ตัวอย่างเช่นสัญลักษณ์ที่ไม่ได้ระบุ "_foo" อาจเชื่อมโยงกับฟังก์ชัน "_foo @ 12" หรือสัญลักษณ์ "_bar @ 16" ที่ไม่ได้ระบุไว้อาจเชื่อมโยงกับฟังก์ชัน "_block" เมื่อลิงเกอร์ทำเช่นนี้จะพิมพ์คำเตือนเนื่องจากปกติไม่ควรเชื่อมโยง แต่บางครั้งอิมพอร์ตไลบรารีที่สร้างขึ้นจากไฟล์ที่เป็นบุคคลที่สามอาจจำเป็นต้องใช้คุณลักษณะนี้เพื่อใช้งานได้ หากคุณระบุ --enable-stdcall-fixup คุณลักษณะนี้จะได้รับการเปิดใช้งานโดยสมบูรณ์และไม่มีการพิมพ์คำเตือน ถ้าคุณระบุ --disable-stdcall-fixup คุณลักษณะนี้ถูกปิดใช้งานและการจับคู่ไม่ตรงกันดังกล่าวถือเป็นข้อผิดพลาด

--export สัญลักษณ์ทั้งหมด

ถ้าได้รับสัญลักษณ์สากลทั้งหมดในวัตถุที่ใช้ในการสร้าง DLL จะถูกเอ็กซ์พอร์ตโดย DLL โปรดสังเกตว่านี่คือค่าเริ่มต้นถ้ามีมิฉะนั้นจะไม่เป็นสัญลักษณ์ใด ๆ ที่ส่งออก เมื่อสัญลักษณ์ถูกส่งออกอย่างชัดแจ้งผ่านทางไฟล์ DEF หรือส่งออกโดยปริยายผ่านทางแอตทริบิวต์ฟังก์ชันค่าดีฟอลต์คือไม่ได้ส่งออกข้อมูลอื่นจนกว่าจะมีการระบุตัวเลือกนี้ โปรดทราบว่าสัญลักษณ์ "DllMain @ 12", "DllEntryPoint @ 0", "DllMainCRTStartup @ 12" และ "impure_ptr" จะไม่ถูกส่งออกโดยอัตโนมัติ นอกจากนี้สัญลักษณ์ที่นำเข้าจาก Dll อื่น ๆ จะไม่ถูกนำออกใหม่หรือจะเป็นสัญลักษณ์ที่ระบุรูปแบบภายในของ DLL เช่นข้อความที่ขึ้นต้นด้วย "_head_" หรือลงท้ายด้วย "_iname" นอกจากนี้จะไม่มีการส่งออกสัญลักษณ์จาก "libgcc", "libstd ++", "libmingw32" หรือ "crtX.o" สัญลักษณ์ที่มีชื่อขึ้นต้นด้วย "__rtti_" หรือ "__builtin_" จะไม่ถูกส่งออกเพื่อช่วยในการ C ++ DLLs สุดท้ายมีรายการสัญลักษณ์ cygwin-private ที่ไม่สามารถส่งออกได้ (เห็นได้ชัดว่านี่ใช้เมื่อสร้าง DLL สำหรับเป้าหมาย cygwin)

cygwin_premain0 "," cygwin_premain2 "," cygwin_premain2 "," cygwin_premain3 "," cygwin_premain2 "," cygwin_premain2 "," cygwin_define " "และ" สิ่งแวดล้อม "

- ไม่รวมสัญลักษณ์ สัญลักษณ์ สัญลักษณ์ ...

ระบุรายการสัญลักษณ์ที่ไม่ควรส่งออกโดยอัตโนมัติ ชื่อสัญลักษณ์อาจถูกคั่นด้วยเครื่องหมายจุลภาคหรือเครื่องหมายทวิภาค

- ไม่รวม libs lib , lib , ...

ระบุรายการไลบรารีที่เก็บถาวรซึ่งไม่ควรส่งออกสัญลักษณ์โดยอัตโนมัติ ชื่อไลบรารีอาจถูกคั่นด้วยเครื่องหมายจุลภาคหรือเครื่องหมายทวิภาค การระบุ "--exclude-libs ALL" จะยกเว้นสัญลักษณ์ในไลบรารีที่จัดเก็บทั้งหมดจากการส่งออกโดยอัตโนมัติ สัญลักษณ์ที่ระบุไว้อย่างชัดแจ้งในไฟล์. def จะถูกส่งออกโดยไม่คำนึงถึงตัวเลือกนี้

--file จัดตำแหน่ง

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

- สำรองสำรอง

- ประหยัด เงินสำรอง

ระบุจำนวนหน่วยความจำที่จะสงวน (และเลือกกระทำ) ที่จะใช้เป็นกองสำหรับโปรแกรมนี้ ค่าเริ่มต้นคือ 1Mb ที่สงวนไว้ซึ่งมีความมุ่งมั่นถึง 4K

- ภาพ - ฐาน ค่า

ใช้ ค่า เป็นที่อยู่พื้นฐานของโปรแกรมหรือ dll ของคุณ นี่คือตำแหน่งหน่วยความจำต่ำสุดที่จะใช้เมื่อโหลดโปรแกรมหรือ dll ของคุณ เพื่อลดความจำเป็นในการย้ายและปรับปรุงประสิทธิภาพของที่กำลังของคุณแต่ละควรมีที่อยู่ฐานที่ไม่ซ้ำกันและไม่ทับซ้อนกับที่อื่น ๆ dlls ค่าดีฟอลต์คือ 0x400000 สำหรับไฟล์ปฏิบัติการและ 0x10000000 สำหรับ dlls

--kill ที่

หากได้รับต่อท้าย stdcall (@ nn ) จะถูกตัดออกจากสัญลักษณ์ก่อนส่งออก

--major-image-version value

กำหนดจำนวนที่ใหญ่ที่สุดของ `` image version '' ค่าเริ่มต้นเป็น 1

--major-os-version value

ตั้งค่าหมายเลขที่สำคัญของ `` os version '' ค่าเริ่มต้นเป็น 4

--major-subsystem-version value

ตั้งค่าจำนวนหลักของ `` subsystem version '' ค่าเริ่มต้นเป็น 4

- ค่า รุ่นของภาพ

ตั้งค่าจำนวนเล็กน้อยของ "เวอร์ชันรูปภาพ" " ค่าเริ่มต้นเป็น 0

--minor-os-version value

ตั้งค่าจำนวนเล็กน้อยของ `` os version '' ค่าเริ่มต้นเป็น 0

--minor-subsystem-version value

ตั้งค่าจำนวนรองของ `` subsystem version '' ค่าเริ่มต้นเป็น 0

- แฟ้มข้อมูลขาออก

linker จะสร้าง ไฟล์ ที่จะมีไฟล์ DEF ที่สอดคล้องกับ DLL ที่ตัวเชื่อมกำลังสร้างอยู่ ไฟล์ DEF นี้ (ซึ่งควรจะเรียกว่า "* .def") อาจถูกใช้เพื่อสร้างไลบรารีการนำเข้าโดยใช้ "dlltool" หรืออาจใช้เป็นข้อมูลอ้างอิงกับสัญลักษณ์ที่ส่งออกโดยอัตโนมัติหรือโดยนัย

- ไฟล์ implib

linker จะสร้างแฟ้ม ไฟล์ ซึ่งจะมีการนำเข้า lib ตรงกับ DLL ที่ตัวเชื่อมกำลังสร้างอยู่ lib นำเข้า (ซึ่งควรจะเรียกว่า "* .dll.a" หรือ "* .a") เพื่อเชื่อมโยงไคลเอ็นต์กับ DLL ที่สร้างขึ้นทำให้ลักษณะการทำงานนี้เป็นไปได้ที่จะข้ามขั้นตอนการสร้างไลบรารีการนำเข้า "dlltool" แยกต่างหาก

--enable อัตโนมัติภาพฐาน

เลือกฐานภาพสำหรับ DLL โดยอัตโนมัติยกเว้นกรณีที่ระบุไว้โดยใช้อาร์กิวเมนต์ "--image-base" โดยการใช้ hash ที่สร้างขึ้นจาก dllname เพื่อสร้างฐานข้อมูลภาพที่ไม่ซ้ำกันสำหรับแต่ละ DLL การชนกันของข้อมูลในหน่วยความจำและการโยกย้ายซึ่งสามารถทำให้การดำเนินงานของโปรแกรมล่าช้าได้

--disable อัตโนมัติภาพฐาน

อย่าสร้างฐานภาพที่เป็นเอกลักษณ์โดยอัตโนมัติ หากไม่มีฐานภาพที่ผู้ใช้ระบุ ("--image-base") จากนั้นใช้ค่าเริ่มต้นของแพลตฟอร์ม

--dll-search-คำนำหน้า สตริง

เมื่อเชื่อมโยงแบบไดนามิกกับ dll โดยไม่มีไลบรารีการนำเข้าให้ค้นหา " .dll" แทน "lib .dll" ลักษณะการทำงานนี้ช่วยให้สามารถแยกความแตกต่างระหว่าง Dll ที่สร้างขึ้นสำหรับ subplatform ต่างๆได้หลายแบบเช่น native, cygwin, uwin, pw เป็นต้นตัวอย่างเช่น DLL cygwin มักใช้ "--dll-search-prefix = cyg"

--enable อัตโนมัตินำเข้า

เชื่อมโยงสัญลักษณ์ "_symbol" กับ "__imp__symbol" สำหรับการนำเข้าข้อมูลจาก Dll และสร้างสัญลักษณ์ที่จำเป็นสำหรับการสร้างไลบรารีการนำเข้าด้วย DATAexports เหล่านี้ นี้โดยทั่วไปจะ 'ทำงาน' --- แต่บางครั้งคุณอาจเห็นข้อความนี้:

"ตัวแปร '' ไม่สามารถนำเข้าโดยอัตโนมัติโปรดอ่านเอกสารสำหรับ" --enable-auto-import "ของ ld เพื่อดูรายละเอียด"

ข้อความนี้เกิดขึ้นเมื่อนิพจน์บางส่วน (ย่อย) เข้าถึงที่อยู่ที่ได้รับโดยรวมของสองค่าคงที่ (ตารางการนำเข้าของ Win32 อนุญาตให้ใช้หนึ่งตัว) กรณีที่เกิดเหตุการณ์เช่นนี้อาจรวมถึงการเข้าถึงฟิลด์สมาชิกของตัวแปร struct ที่นำเข้าจาก DLL รวมถึงการใช้ดัชนีคงที่ในตัวแปรอาร์เรย์ที่นำเข้าจาก DLL ตัวแปรหลายตัว (อาร์เรย์โครงสร้าง ฯลฯ ) อาจทำให้เกิดเงื่อนไขข้อผิดพลาดนี้ อย่างไรก็ตามโดยไม่คำนึงถึงชนิดข้อมูลที่แน่นอนของตัวแปรที่ส่งออกที่กระทำผิดกฎหมาย ld จะตรวจพบคำเตือนและออกจากระบบเสมอ

มีหลายวิธีในการแก้ไขปัญหานี้โดยไม่คำนึงถึงชนิดข้อมูลของตัวแปรที่ส่งออก:

วิธีหนึ่งคือการใช้สวิตช์ --enable-runtime-pseudo-reloc นี่เป็นงานที่จะปรับการอ้างอิงในโค้ดไคลเอ็นต์ของคุณสำหรับสภาพแวดล้อมรันไทม์ดังนั้นวิธีนี้จะใช้ได้เฉพาะเมื่อสภาพแวดล้อมรันไทม์สนับสนุนคุณลักษณะนี้

ทางออกที่สองคือบังคับให้หนึ่งใน 'ค่าคงที่' เป็นตัวแปร --- นั่นคือไม่ทราบและไม่สามารถเพิ่มประสิทธิภาพได้ในเวลาที่คอมไพล์ สำหรับอาร์เรย์มีสองความเป็นไปได้คือก) สร้างดัชนี (ที่อยู่ของอาร์เรย์) เป็นตัวแปรหรือ b) สร้างดัชนี 'คงที่' เป็นตัวแปร ดังนั้น:

extern ชนิด extern_array []; extern_array [1] -> {ประเภทระเหย t = extern_array; t [1]}

หรือ

extern ชนิด extern_array []; extern_array [1] -> {int ระเหย t = 1; extern_array [t]}

สำหรับ structs (และชนิดข้อมูล multiword ส่วนใหญ่อื่น ๆ ) ตัวเลือกเดียวคือการสร้างตัวแปร struct เอง (หรือ long long หรือ ... ):

extern struct s extern_struct; extern_struct.field -> {struct ระเหย s * t = & extern_struct; t-> ฟิลด์}

หรือ

extern long long extern_ll; extern_ll -> {ยาวระเหยยาว * local_ll = & extern_ll; * local_ll}

วิธีที่สามในการจัดการกับปัญหานี้คือการละทิ้ง "การนำเข้าอัตโนมัติ" สำหรับสัญลักษณ์ที่กระทำผิดและทำเครื่องหมายด้วย "__declspec (dllimport)" อย่างไรก็ตามในทางปฏิบัติที่ต้องใช้คอมไพล์เวลา # กำหนดเพื่อระบุว่าคุณกำลังสร้าง DLL สร้างรหัสลูกค้าที่จะลิงก์ไปยัง DLL หรือเพียงแค่สร้าง / เชื่อมโยงไปยังไลบรารีแบบสแตติก ในการเลือกทางเลือกระหว่างวิธีการต่างๆในการแก้ไขปัญหา 'ที่อยู่ตรงกับปัญหาชดเชยคงที่' คุณควรพิจารณาการใช้งานจริงในโลกแห่งความเป็นจริงโดยทั่วไป:

เดิม:

--foo.h extern int arr []; - foo.c # include "foo.h" เป็นโมฆะหลัก (int argc, char ** argv) {printf ("% d \ n", arr [1]); }

โซลูชันที่ 1:

--foo.h extern int arr []; - foo.c # include "foo.h" เป็นโมฆะหลัก (int argc, char ** argv) {/ * วิธีแก้ปัญหานี้ใช้สำหรับ win32 และ cygwin; ไม่ "เพิ่มประสิทธิภาพ" * / int ผันผวน * parr = arr; printf ( "% d \ n", พาร์ [1]); }

โซลูชันที่ 2:

--foo.h / * หมายเหตุ: การส่งออกอัตโนมัติจะถือว่า (ไม่มี __declspec (dllexport)) * / #if (ถูกกำหนด (_WIN32) || กำหนด (__ CYGWIN__)) &&! (กำหนด (FOO_BUILD_DLL) || ถูกกำหนด (FOO_STATIC )) # define FOO_IMPORT __declspec (dllimport) #else #define FOO_IMPORT #endif extern FOO_IMPORT int arr []; - foo.c # include "foo.h" เป็นโมฆะหลัก (int argc, char ** argv) {printf ("% d \ n", arr [1]); }

วิธีที่สี่เพื่อหลีกเลี่ยงปัญหานี้คือการ re-code ห้องสมุดของคุณเพื่อใช้อินเตอร์เฟสการทำงานแทนที่จะเป็นอินเทอร์เฟซข้อมูลสำหรับตัวแปรที่กระทำผิด (เช่น set_foo () และ get_foo () accessor functions)

--disable อัตโนมัตินำเข้า

อย่าพยายามเชื่อมโยงสัญลักษณ์ "_symbol" กับ "__imp__symbol" สำหรับ DATAimports จาก Dlls

--enable-รันไทม์หลอก reloc

หากโค้ดของคุณมีนิพจน์ที่อธิบายไว้ในส่วน --enable-auto-import นั่นคือ DATAimports จาก DLL ที่มีค่าชดเชยที่ไม่ใช่ศูนย์สวิตช์นี้จะสร้างเวกเตอร์ของ 'relocations เทียมแบบรันไทม์' ซึ่งสามารถใช้งานได้โดยสภาพแวดล้อมรันไทม์เพื่อปรับการอ้างอิง ไปยังข้อมูลดังกล่าวในรหัสลูกค้าของคุณ

--disable-รันไทม์หลอก reloc

อย่าสร้าง relocations หลอกสำหรับการนำเข้าข้อมูลชดเชยที่ไม่ใช่ศูนย์จาก Dll นี่เป็นค่าเริ่มต้น

--enable-พิเศษ PE-การแก้ปัญหา

แสดงข้อมูลการแก้ปัญหาเพิ่มเติมที่เกี่ยวข้องกับ auto-import thunking สัญลักษณ์

--section จัดตำแหน่ง

ตั้งค่าการจัดแนวส่วน ส่วนในหน่วยความจำจะเริ่มต้นที่ที่อยู่ซึ่งมีหลายหมายเลข ค่าเริ่มต้นเป็น 0x1000

- กอง สำรอง

สำรองสำรอง

ระบุจำนวนหน่วยความจำที่ต้องการสำรอง (และเลือกกระทำ) เพื่อใช้เป็นสแตกสำหรับโปรแกรมนี้ ค่าเริ่มต้นคือ 2Mb ที่สงวนไว้ 4K มุ่งมั่น

- ระบบย่อย ซึ่ง

- ระบบย่อย ที่ สำคัญ :

- ระบบย่อย ที่ สำคัญ : ผู้เยาว์

ระบุระบบย่อยภายใต้ที่โปรแกรมของคุณจะทำงาน ค่าที่ถูกต้องตามกฎหมายคือ "native", "windows", "console" และ "posix" นอกจากนี้คุณยังสามารถตั้งค่าเวอร์ชันระบบย่อยด้วย

สำคัญ: ใช้คำสั่ง man ( % man ) เพื่อดูว่าคำสั่งถูกใช้อย่างไรในคอมพิวเตอร์เครื่องใดเครื่องหนึ่งของคุณ