mold 2.0.0 - trình liên kết tốc độ cao
(github.com/rui314)- Giấy phép đã được chuyển từ AGPL sang MIT, trở thành thay đổi lớn nhất của mold 2.0.0
- Sửa lỗi khiến không thể tạo tệp đối tượng có quá 65520 section khi sử dụng
--relocatable -undefinedđược diễn giải là từ đồng nghĩa của--undefinedthay vì-u ndefined, giúp hành vi khớp với GNU linkers và LLVM lld-nopieđược xử lý như từ đồng nghĩa của--no-pie- Hỗ trợ các kiểu tái định vị
R_RISCV_SET_ULEB128vàR_RISCV_SUB_ULEB128trên RISC-V - Hỗ trợ kiểu tái định vị
R_PPC64_REL32trên PPC64
1 bình luận
Ý kiến trên Hacker News
mold thực sự là một công trình tuyệt vời trên các hệ thống hiện đại.
Gần đây khi cố làm cho việc build dự án nhanh hơn, tôi nhận ra bước link là một nút thắt cổ chai rất lớn. Dù dùng 24 lõi * 2 luồng, khoảng 30% hiệu năng tổng thể vẫn bị bỏ không vì linker.
Trước đây tôi từng thử build bằng mold nhưng lúc đó không ổn lắm, và tôi định sẽ thử lại.
Tôi không nhớ con số chính xác, nhưng đại khái là những gì mất vài giây với gold và lld đã giảm xuống dưới 1 giây với mold, một khác biệt khá lớn.
Đó là mã C++/Qt phức tạp.
mold -run ninjahoạt động rất tốt trong môi trường của tôi.Rất vui khi thấy tin thay đổi giấy phép. Tôi hy vọng dự án cũng kiếm được tiền, nhưng nếu chuyển sang giấy phép MIT thì khả năng tích hợp vào các dự án công việc sẽ lớn hơn nhiều.
Nếu thực sự dùng nó, tôi sẽ thử thuyết phục công ty tài trợ cho dự án này.
AGPL cũng chỉ hạn chế khi phân phối một linker đã chỉnh sửa riêng tư dưới dạng dịch vụ mạng, mà đó không phải là kịch bản thực tế với công cụ phát triển cơ bản.
Tôi thắc mắc về việc đổi giấy phép. Đây chẳng phải là một file thực thi sao? Gọi nó như một tiến trình riêng không khiến phần mềm gọi nó phải thành GPL, nên trong trường hợp thông thường việc chuyển sang MIT lẽ ra không có tác động.
Nếu các tác giả thực sự muốn một giấy phép thoáng hơn, thay vì tái cấp phép từ AGPL sang MIT, họ nên đổi sang AGPL kèm ngoại lệ liên kết. Một ví dụ về dự án GPL có ngoại lệ liên kết là libgit2 https://github.com/libgit2/libgit2#license
Kiểu giấy phép này vừa thoáng hơn, vừa vẫn cho phép bán giấy phép thương mại cho bên tạo các thay đổi mã nguồn đóng.
sold, phiên bản dành cho macOS, có vẻ là ngoại lệ.Linker này đã cải thiện rõ rệt mức độ hài lòng khi phát triển trong repo Rust thử nghiệm của tôi, vốn đang dần trở thành một web monolith lớn dùng SeaORM và axum/tokio.
Bạn sẽ không muốn biết kích thước thư mục
targetcủa tôi đâu, nhưng các build tăng dần đã nhẹ nhàng hơn nhiều.15:55 $ du -Hs --si target/11G target/Mold rất tuyệt, và tôi có vài cách dùng yêu thích.
[target.x86_64-unknown-linux-gnu]linker = "clang"rustflags = ["-C", "link-arg=-fuse-ld=mold","-C", "target-cpu=native"]"-fuse-ld=mold"vào CFLAGS cũng làmmakepkgnhanh hơn.Đây là một quyết định rất khôn ngoan. Đôi khi trong sản phẩm hoặc mã của mình, tôi cũng có những lúc khó khăn khi phải thừa nhận rằng một số thứ không phù hợp để kiếm tiền.
Thị trường sẽ nói cho bạn biết, và đáng tiếc là thay vì chống lại nó, điều quan trọng là tìm thứ khác mà thị trường sẵn sàng tưởng thưởng.
Có ai biết thay đổi giấy phép/chiến lược kinh doanh này có dự định áp dụng cho sold không? sold là mold dành cho macOS.
https://github.com/bluewhalesystems/sold
https://twitter.com/davidecci/status/1665835119331135488
“Kho lưu trữ này chứa phiên bản miễn phí của linker mold. Nếu bạn đang tìm phiên bản thương mại hỗ trợ macOS, hãy ghé kho lưu trữ linker sold.”
Chỉ cần trả hậu hĩnh cho công sức đó và làm thế giới tốt đẹp hơn là được mà.
Với Apple thì việc này quá dễ.
Giấy phép đã đổi từ AGPL sang MIT.
Nhưng một nghệ nhân xuất sắc như vậy nên được đền đáp như thế nào, và tại sao điều đó vẫn chưa diễn ra? Tôi nghĩ các công ty, bất kể quy mô, nên phân bổ một phần ngân sách nhất định cho các phụ thuộc hoặc công cụ cốt lõi và công khai điều đó trên website chính thức. Có vẻ chúng ta cần thêm một kiểu chuẩn mực văn hóa như vậy.
Tôi đã quên mất đây là một linker nhanh
“Mold 2.0.0 là bản phát hành major mới của linker tốc độ cao của chúng tôi. Trong bản phát hành này, để mở rộng cơ sở người dùng, chúng tôi đã chuyển giấy phép từ AGPL sang MIT. Như những ai theo dõi tiến độ đều biết, đây không phải là quyết định dễ dàng, vì chúng tôi đã thử kiếm tiền từ sản phẩm bằng mô hình giấy phép kép AGPL/thương mại. Đáng tiếc là cách tiếp cận này không đạt kỳ vọng. Việc đổi giấy phép là kết quả của việc chấp nhận thực tế đó. Chúng tôi không muốn tiếp tục bám vào một chiến lược không hoạt động tốt.”
Thật kinh khủng, và cũng là cách đối xử tệ hại với các lập trình viên dùng phần mềm cho chính OS của họ
Chúng ta đã quen từ rất lâu với việc không trả tiền cho các công cụ phát triển cấp thấp, mà thay vào đó trả chi phí hỗ trợ. Chỉ riêng việc họ thử một kiểu giấy phép như vậy đã khiến tôi ngạc nhiên
Trong thời gian dài tôi đã nhiều lần thấy các cuộc thảo luận về linker nhanh, cũng như những câu chuyện rằng chỉ cần thay một linker bằng linker nhanh hơn thì thời gian compile giảm đáng kể, nhưng thường thì tôi không thật sự biết vì sao linker lại chậm
Nếu có ai giải thích được thì tốt quá
Một phần lớn cải thiện hiệu năng đến từ việc xử lý công việc song song, và trên các CPU đa nhân mạnh hiện đại điều đó dẫn đến mức cải thiện lớn
Nếu muốn tìm hiểu thêm, Rui có một bài thuyết trình hay về Mold: https://www.youtube.com/watch?v=hAt3kCalE0Y
cat. Vì chỉ cần nối các binary lại với nhau là xong. Thời còn dùng ổ đĩa quay, I/O đĩa là vấn đề, nhưng bây giờ thì ít hơnPhần tốn thời gian là việc vừa làm vừa ghi lại nội dung. Duyệt bảng relocation và đưa địa chỉ vào code là rẻ, dead stripping theo từng section cũng khá rẻ, nhưng nếu muốn dead strip từng basic block riêng lẻ bên trong hàm thì cần phân tích nhiều hơn hẳn nên sẽ tốn thời gian
Loại bỏ trùng lặp chuỗi hằng là một ý tưởng hay, nhưng phải đẩy tất cả chúng vào một dạng hash table nào đó. Nếu muốn chia sẻ cả các suffix chung thì công việc còn tăng thêm
Deduplication, dead stripping và ghi lại thông tin debug cũng tốn thời gian. Trong debug build có thể có vài GB DWARF cần phải ghi lại
Điều thú vị là việc linker có thể script được và có thể truyền một chương trình để thông dịch dường như không phải chi phí lớn. Có lẽ vì các script đó khá ngắn và chức năng cũng bị giới hạn ở mức nào đó
Về mặt lịch sử, lý do lld rất nhanh là vì nó hầu như không xử lý thông tin debug hay thực hiện các deduplication khác. lld chạy nhanh, nhưng binary đầu ra thì lớn
Tôi đã rời khỏi mảng hiệu năng linking vài năm rồi nên không rõ tình trạng hiện tại. Đặc biệt là không biết mold hay lld hiện nằm ở đâu trong đánh đổi giữa chất lượng đầu ra và hiệu năng của chính chúng
https://www.airs.com/blog/archives/38
“Xin nhắc lại, mục tiêu là tốc độ. Trong trường hợp này là nhanh hơn linker thứ hai của tôi. Linker đó đã chậm đi đáng kể qua nhiều năm khi được bổ sung hỗ trợ ELF và thư viện chia sẻ. Hỗ trợ này không được thiết kế ngay từ đầu mà được gắn thêm vào. Kế hoạch tương lai cho linker mới cũng bao gồm hỗ trợ incremental linking, đây cũng là một cách khác để tăng tốc.”
Hãy nghĩ đến các ứng dụng thời Unix sơ khai. Chúng là những ứng dụng đơn giản, một mục đích, có lẽ chỉ cần link một file source, một object và libc, không có thứ như thư viện chia sẻ
Về sau, khi các tính năng “thiết yếu” được thêm vào, mã của linker đã phát triển một cách hữu cơ. Đặc biệt trong thời ổ đĩa quay còn là nút thắt cổ chai, độ đúng đắn của tính năng quan trọng hơn tốc độ