- ผู้ใช้ LWN ได้รวบรวม สารบัญชุดบทความลิงเกอร์ 20 ตอน ของ Ian Lance Taylor ที่เดิมกระจัดกระจายไว้ เพื่อให้ติดตามอ่านได้ในครั้งเดียว
- ต้นฉบับเป็นบทความของ Ian Lance Taylor ผู้เขียนลิงเกอร์
goldและได้นำบทความที่เรียงตามหมายเลขมาจัดกลุ่มใหม่ตามชื่อหัวข้อ เพื่อให้ค้นหาย้อนกลับได้ง่ายขึ้น - ช่วงต้นครอบคลุมแนวคิดของลิงเกอร์, ประวัติส่วนตัว, dynamic linking, รูปแบบไฟล์อ็อบเจ็กต์, shared library, ELF symbol, relocation และการปรับแต่ง TLS
- ช่วงหลังต่อเนื่องไปถึงการตีความ symbol, การเปรียบเทียบ static/dynamic linking, link time optimization, COMDAT, การ instantiate เทมเพลต C++, exception frame และ incremental linking
- สารบัญและคอมเมนต์เผยแพร่เป็น public domain จึงไม่มีข้อจำกัดในการคัดลอก ใช้งาน หรือสร้างงานดัดแปลง
สารบัญที่รวบรวมชุดบทความลิงเกอร์ 20 ตอนให้อ่านง่ายขึ้น
- จัดทำ สารบัญที่อ่านต่อเนื่องได้ง่าย สำหรับบทความลิงเกอร์ 20 ตอนของ Ian Lance Taylor
- เนื่องจากหาเนื้อหาสารบัญที่เชื่อมโยงกันดีทั้งบนบล็อกของ Ian หรือบน LWN ได้ยาก จึงทำสารบัญแยกขึ้นมา
- URL ของบทความใช้หมายเลขต่อเนื่อง แต่การมีสารบัญที่บอกหัวข้อของแต่ละตอนช่วยให้มองภาพรวมได้ง่าย
- แต่ละบทความถูกอ้างถึงด้วยหมายเลขเป็นหลัก จึงตั้งชื่อจาก ชื่อ section ของ Ian เป็นส่วนใหญ่
รายการบทความที่รวมไว้
- Introduction, personal history, first half of what's-a-linker: บทนำ, ประวัติส่วนตัว และครึ่งแรกของคำอธิบายว่าลิงเกอร์คืออะไร
- What's-a-linker: Dynamic linking, linker data types, linker operation: dynamic linking, ชนิดข้อมูลของลิงเกอร์ และการทำงานของลิงเกอร์
- Address spaces, Object file formats: address space และรูปแบบไฟล์อ็อบเจ็กต์
- Shared Libraries: shared library
- More Shared Libraries -- specifically, linker implementation; ELF Symbols: เนื้อหาเพิ่มเติมเกี่ยวกับ shared library, การติดตั้งใช้งานของลิงเกอร์ และ ELF symbol
- Relocations, Position Dependent Shared Libraries: relocation และ shared library แบบขึ้นกับตำแหน่ง
- Thread Local Storage (TLS) optimization: การปรับแต่ง TLS
- ELF Segments and Sections: ELF segment และ section
- Symbol Versions, Relaxation optimization,: เวอร์ชันของ symbol และการปรับแต่ง relaxation
- Parallel linking: การลิงก์แบบขนาน
- Archive format: รูปแบบ archive
- Symbol resolution: การตีความ symbol
- Symbol resolution from the user's point of view; Static Linking vs. Dynamic Linking: การตีความ symbol จากมุมมองผู้ใช้ และการเปรียบเทียบ static linking กับ dynamic linking
- Link time optimization, aka Whole Program optimization; Initialization Code: link time optimization หรือการปรับแต่งทั้งโปรแกรม และ initialization code
- COMDAT sections: COMDAT section
- C++ Template Instantiation, Exception Frames: การ instantiate เทมเพลต C++ และ exception frame
- Warning Symbols,: warning symbol
- Incremental Linking: incremental linking
- __start and __stop Symbols, Byte Swapping: symbol
__start,__stopและการสลับลำดับไบต์ - Last post; Update on gold's status: บทความสุดท้ายและอัปเดตสถานะของ
gold
เงื่อนไขการเผยแพร่
- สารบัญและคอมเมนต์นี้เผยแพร่เป็น public domain
- ไม่มีข้อจำกัดในการใช้งาน คัดลอก แสดงต่อสาธารณะ หรือสร้างงานดัดแปลง และไม่ต้องขออนุญาตเพิ่มเติม
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
มีคนลิงก์เวอร์ชันที่รวมทั้งหมดเป็นอีบุ๊กเล่มเดียวด้วย Calibre recipe ไว้ เลยเอาผลลัพธ์มาแปะไว้ให้คนที่ต้องการ
https://www.mediafire.com/folder/b8fdqx7eqcpdl/linker
หรือ
https://0x0.st/Xycy.azw3
https://0x0.st/Xyct.epub
https://0x0.st/Xycv.mobi
https://0x0.st/Xycw.pdf
นักพัฒนาที่ทำงานกับลิงเกอร์ lld และ mold ผลักดันประสิทธิภาพไปจนสุดทาง
LLD (ส่วนหนึ่งของ LLVM):
https://llvm.org/devmtg/2017-10/slides/Ueyama-lld.pdf
ลิงเกอร์ MOLD:
https://github.com/rui314/mold/blob/main/docs/design.md
Apple ก็เปิดตัวลิงเกอร์ตัวใหม่ที่อยู่ในระดับใกล้เคียงกับ mold ด้วย การถกเถียงก่อนหน้านี้อยู่ที่นี่: https://news.ycombinator.com/item?id=36218330
LLD ถูกออกแบบมาให้เร็ว และก่อนหน้านั้น Gold ก็เช่นกัน แต่ Mold แซงทั้งสองไปไกลมาก
แม้จะเป็นบทความปี [2008] แต่บทความชุดนี้เป็น ข้อมูลล้ำค่าเหมือนทอง จริง ๆ จึงดีใจเสมอที่ได้เห็นกลับขึ้นหน้าแรกของ HN อีกครั้ง
เป็น คำอธิบายที่ยอดเยี่ยม จริง ๆ
บทความชุดนี้เป็นหนึ่งในบทความที่ชอบที่สุด และมีหลายส่วนที่เปิดโลกสำหรับผมเป็นการส่วนตัว
คิดว่าไม่มีแหล่งข้อมูลไหน ไม่ว่าจะบนอินเทอร์เน็ตหรือที่อื่น ที่ รวบรวมข้อมูลทั้งหมดนี้ไว้ในที่เดียว ได้แบบนี้ ถ้า Ian ทำออกมาเป็นหนังสือคงดีมาก
แต่ก็ยังอยากให้ Ian มีเวอร์ชันที่ดูทุกบทได้ในหน้าเดียว
https://www.airs.com/blog/archives/51
เป็นเรื่องเกี่ยวกับการทำ pattern matching ในโค้ดแอสเซมบลี แล้วจัดลำดับซีเควนซ์ใหม่หรือนำกลับมาใช้ซ้ำ
รวมคอมเมนต์ก่อนหน้า: https://news.ycombinator.com/item?id=27445981
เข้าใจว่าทำไม ลิงเกอร์ ถึงเกิดขึ้นในยุคที่หน่วยความจำมีจำกัด
แต่ก็สงสัยว่าในสภาพแวดล้อมอย่างระบบสมัยใหม่ที่มีหน่วยความจำเหลือเฟือ เรายังจำเป็นต้องมีลิงเกอร์อยู่ไหม อีกอย่าง shared library ก็ดูเหมือนจะเป็น เส้นทางโจมตีซัพพลายเชน แบบเดียวกับการโจมตี xz ที่เพิ่งถูกสกัดเมื่อต้นปีนี้หรือเปล่า
ยังต้องคำนึงถึงสภาพแวดล้อมอย่าง Raspberry Pi ด้วย มองว่า shared library ไม่น่าจะเป็นเส้นทางโจมตีที่อันตรายไปกว่าตัวแอปเอง ต่อให้ดาวน์โหลดไบนารีแบบ static มาก็ไม่รู้ว่าข้างในมีอะไรอยู่ และก็ไม่รู้เหมือนกันว่าทำไมทุกคนถึงเชื่อใจ Docker image ครึ่งหนึ่งที่ดาวน์โหลดมาใช้ แต่สุดท้ายก็ใช้กันอยู่ดี
ตราบใดที่ไม่ได้ประมวลผลไฟล์ซอร์สทั้งหมดพร้อมกันด้วย build option ที่เหมือนกันทุกประการ ก็ต้องรวมผลลัพธ์เข้าด้วยกัน แม้จะมี LTO สมัยใหม่ คอมไพเลอร์ก็มักไม่ได้เห็นไฟล์ทั้งหมดของโปรแกรมในระดับซอร์สโค้ด และ C library กับ C++ library ก็มักแยกจากกันอยู่ดี ตราบใดที่หลายภาษาไม่ได้สร้างทั้งโปรแกรมด้วยขั้นตอนคอมไพล์และแอสเซมบลีเดียว ก็ต้องมีอะไรบางอย่างมารวมผลลัพธ์เข้าด้วยกัน และสิ่งนั้นก็คือลิงเกอร์ ต่อให้ build ทุกอย่างแบบ static ก็ยังไม่ทำให้ความจำเป็นของ runtime linker หมดไป เว้นแต่จะ hardcode ที่อยู่แน่นอนที่โปรแกรมจะถูกเรียกใช้งาน ซึ่งวิธีนั้นขัดกับเทคนิคความปลอดภัยอย่าง ASLR
แนวคิดที่ว่าหน่วยความจำและ CPU มีเหลือเฟือนั้น ผมมองว่าเป็นหนึ่งในเหตุผลที่แม้ฮาร์ดแวร์จะเร็วขึ้นหลายลำดับขั้น แต่ประสบการณ์ผู้ใช้กลับไม่ได้ดีขึ้นอย่างเห็นได้ชัด