- Một người dùng LWN đã sắp xếp loạt 20 bài tiểu luận về linker rải rác của Ian Lance Taylor thành mục lục để có thể theo dõi liền mạch
- Bản gốc là các bài viết của Ian Lance Taylor, tác giả linker
gold; các bài vốn được đánh số là chính được gom lại theo tiêu đề mục để dễ tìm hơn - Phần đầu đề cập đến khái niệm linker, tiểu sử cá nhân, dynamic linking, định dạng object file, shared library, symbol ELF, relocation và tối ưu hóa TLS
- Phần sau tiếp tục với phân giải symbol, so sánh static/dynamic linking, link time optimization, COMDAT, khởi tạo template C++, exception frame và incremental linking
- Mục lục và bình luận được phát hành dưới dạng public domain, không có hạn chế về sao chép, sử dụng hay tạo tác phẩm phái sinh
Mục lục gom lại để dễ tìm loạt 20 bài tiểu luận về linker
- Sắp xếp loạt 20 bài viết về linker của Ian Lance Taylor thành mục lục dễ đọc liên tục
- Vì khó tìm được một mục lục được liên kết tốt trên blog của Ian hoặc LWN, mục lục riêng này đã được tạo ra
- URL các bài viết được đánh số liên tiếp, nhưng một mục lục giúp nhìn nhanh chủ đề của từng bài là rất hữu ích
- Mỗi bài chỉ được nhắc đến bằng số, nên tiêu đề chủ yếu được xây dựng từ tiêu đề các mục của Ian
Danh sách bài viết được bao gồm
- Introduction, personal history, first half of what's-a-linker: Giới thiệu, tiểu sử cá nhân, nửa đầu về linker là gì
- What's-a-linker: Dynamic linking, linker data types, linker operation: Dynamic linking, kiểu dữ liệu của linker, hoạt động của linker
- Address spaces, Object file formats: Không gian địa chỉ và định dạng object file
- Shared Libraries: Shared library
- More Shared Libraries -- specifically, linker implementation; ELF Symbols: Nội dung bổ sung về shared library, triển khai linker, symbol ELF
- Relocations, Position Dependent Shared Libraries: Relocation và shared library phụ thuộc vị trí
- Thread Local Storage (TLS) optimization: Tối ưu hóa TLS
- ELF Segments and Sections: Segment và section ELF
- Symbol Versions, Relaxation optimization,: Phiên bản symbol và tối ưu hóa relaxation
- Parallel linking: Linking song song
- Archive format: Định dạng archive
- Symbol resolution: Phân giải symbol
- Symbol resolution from the user's point of view; Static Linking vs. Dynamic Linking: Phân giải symbol từ góc nhìn người dùng; so sánh static linking và dynamic linking
- Link time optimization, aka Whole Program optimization; Initialization Code: Link time optimization, tối ưu hóa toàn bộ chương trình, mã khởi tạo
- COMDAT sections: Section COMDAT
- C++ Template Instantiation, Exception Frames: Khởi tạo template C++ và exception frame
- Warning Symbols,: Symbol cảnh báo
- Incremental Linking: Incremental linking
- __start and __stop Symbols, Byte Swapping: Symbol
__start,__stopvà byte swapping - Last post; Update on gold's status: Bài cuối và cập nhật trạng thái của
gold
Điều kiện công khai
- Mục lục và bình luận này được phát hành dưới dạng public domain
- Không có hạn chế về sử dụng, sao chép, trình diễn, tạo tác phẩm phái sinh và cũng không cần xin phép thêm
1 bình luận
Ý kiến trên Hacker News
Có người đã chia toàn bộ nội dung thành một ebook bằng Calibre recipe và đăng link; mình để lại bản kết quả ở đây cho ai cần
https://www.mediafire.com/folder/b8fdqx7eqcpdl/linker
hoặc
https://0x0.st/Xycy.azw3
https://0x0.st/Xyct.epub
https://0x0.st/Xycv.mobi
https://0x0.st/Xycw.pdf
Nhà phát triển từng làm lld và mold linker đã đẩy hiệu năng tới mức cực hạn
LLD (một phần của LLVM):
https://llvm.org/devmtg/2017-10/slides/Ueyama-lld.pdf
MOLD linker:
https://github.com/rui314/mold/blob/main/docs/design.md
Apple cũng đã công bố một linker mới ở mức tương tự mold; thảo luận trước đó ở đây: https://news.ycombinator.com/item?id=36218330
LLD được thiết kế để nhanh, Gold trước đó cũng vậy, nhưng Mold đã vượt xa cả hai
Dù là bài từ [2008], loạt bài này thật sự là tài liệu quý như vàng, nên lúc nào thấy nó quay lại trang nhất HN cũng đều rất đáng mừng
Đây thật sự là một phần giải thích xuất sắc
Đây là một trong những loạt bài mình thích nhất, và cá nhân mình đã được mở mang rất nhiều từ nó
Mình không nghĩ có tài liệu nào trên Internet hay nơi khác gom toàn bộ thông tin này vào một chỗ như vậy. Ước gì Ian xuất bản nó thành sách
Dù vậy, vẫn mong Ian có thể cung cấp một phiên bản cho phép xem tất cả các chương trên một trang
https://www.airs.com/blog/archives/51
Nội dung nói về pattern matching trong mã assembly, rồi sắp xếp lại hoặc tái sử dụng các chuỗi lệnh
Tổng hợp bình luận trước đây: https://news.ycombinator.com/item?id=27445981
Mình hiểu vì sao linker xuất hiện trong thời kỳ bộ nhớ còn hạn chế
Nhưng mình vẫn thắc mắc liệu trong môi trường hiện đại, nơi bộ nhớ dồi dào hơn nhiều, linker có còn thật sự cần thiết không. Thêm nữa, shared library chẳng phải cũng có thể trở thành một đường tấn công chuỗi cung ứng như vụ tấn công xz bị chặn hồi đầu năm nay sao?
Các môi trường như Raspberry Pi cũng vẫn cần được tính đến. Shared library không hẳn là một đường tấn công nguy hiểm hơn bản thân ứng dụng. Ngay cả khi tải một binary tĩnh, bạn cũng đâu biết trong đó có gì, và mình cũng không hiểu vì sao mọi người lại tin tưởng một nửa số Docker image họ tải về dùng, nhưng rồi ai cũng vẫn dùng như thế
Trừ khi mọi source file đều được xử lý đồng thời với đúng cùng một tùy chọn build, nếu không thì vẫn phải kết hợp các kết quả đầu ra. Ngay cả với LTO hiện đại, compiler thường cũng không thể nhìn thấy tất cả file của chương trình ở mức source code, và thư viện C với thư viện C++ thường là tách riêng. Trừ khi nhiều ngôn ngữ đều biến toàn bộ chương trình thành một bước biên dịch/lắp ráp duy nhất, nếu không vẫn sẽ cần một thứ để hợp nhất các kết quả, và đó chính là linker. Kể cả khi build tĩnh hoàn toàn, nhu cầu về runtime linker cũng không biến mất trừ khi bạn hardcode chính xác địa chỉ mà chương trình sẽ chạy, mà cách đó lại xung đột với các kỹ thuật bảo mật như ASLR
Mình cho rằng kiểu suy nghĩ “bộ nhớ và CPU bây giờ dư dả rồi” là một trong những lý do khiến trải nghiệm người dùng không cải thiện rõ rệt dù phần cứng đã nhanh hơn nhiều bậc độ lớn