Mold Linker نسخه 3.0.0 انتشار – بازنویسی شده در Rust
آدرس مقاله: https://github.com/rui314/mold/releases/tag/v3.0.0 آدرس نظرات: https://news.ycombinator.com/item?id=49963385 امتیاز: 196 # نظرات: 102
هنگام بارگیری خطایی روی داد. لطفا این صفحه را دوباره بارگیری کنید.
mold 3.0.0 نسخه اصلی جدید پیوند دهنده پرسرعت است. همانطور که در یادداشت های انتشار 2.42.1 اعلام کردیم، قالب را از C++ به Rust بازنویسی کرده ایم و این اولین نسخه از نسخه Rust است. 2.42.1 آخرین نسخه از C++ است. هدف mold 3.x بستن شکافهای سازگاری باقیمانده با GNU ld، بهویژه در پشتیبانی از اسکریپت لینکر، و هموار کردن راه برای استفاده از قالب به عنوان پیوند دهنده پیشفرض در توزیعهای لینوکس است.
قالب 3.0 قرار است جایگزینی برای 2.42.1 باشد. گزینههای خط فرمان یکسان را میپذیرد، معماریهای هدف یکسانی را پشتیبانی میکند و خروجی یکسانی را به جز رفع اشکالهای فهرست شده در زیر تولید میکند. عملکرد پیوند با 2.42.1 برابر است. ما سازگاری را با اجرای مجموعه آزمایشی بر روی هر هدف پشتیبانی شده، مقایسه خروجی لینکر در طیف وسیعی از بارهای کاری در دنیای واقعی و ترکیب گزینهها و ساختن همه بستههای Gentoo تأیید کردیم. ما هیچ پسرفتی پیدا نکردیم.
انتقال به Rust همچنین قالب را با فایل های ورودی خراب ایمن تر می کند. نسخه C++ می تواند حافظه را خارج از محدوده در چنین ورودی بخواند و با یک خطای تقسیم بندی خراب شود. در قالب 3.0، این قرائتها با کران بررسی میشوند، بنابراین قالب با وحشت در دسترسی معیوب متوقف میشود.
اگر خودتان قالب می سازید، توجه داشته باشید که سیستم ساخت تغییر کرده است. "تغییرات ایجاد کنید" را در زیر ببینید.
اکنون قالب به جای CMake با Cargo ساخته می شود. به Rust 1.95 یا بالاتر و یک کامپایلر C نیاز دارد. اجرای محموله -release برای ساخت قالب و ./install-mold.sh برای نصب آن. اسکریپت نصب PREFIX و DESTDIR را می پذیرد. گزینه های CMake حذف شده اند.
اگر کتابخانه های قالب را در دایرکتوری دیگری غیر از $PREFIX/lib مانند /usr/lib64 نصب می کنید، متغیر محیطی MOLD_LIBDIR را هم هنگام ساخت و هم هنگام نصب قالب روی آن دایرکتوری تنظیم کنید تا mold -run بتواند mold-wrapper.so را پیدا کند.
قالب دیگر به oneTBB بستگی ندارد. به صورت ایستا mimalloc 3.5.3 را مانند قبل پیوند می دهد. ساخت با --features system-allocator برای استفاده از malloc سیستم به جای آن. قالب در صورت وجود، zlib سیستم را پیوند می دهد و شامل zstd و BLAKE3 می شود. ZSTD_SYS_USE_PKG_CONFIG=1 را برای پیوند دادن zstd سیستم تنظیم کنید. (56ee0f8)
متغیر MOLD_TARGETS CMake با ویژگی های Cargo جایگزین شده است. مانند قبل، توزیع ها باید برای همه اهداف قالب بسازند.
مجموعه آزمایشی اکنون با تست محموله به جای ctest اجرا می شود. install-build-deps.sh با install-test-deps.sh جایگزین شده است که فقط برای اجرای تست ها به آن نیاز دارید.
رفع خرابی هنگام ایجاد یک فایل اجرایی با پیوند ایستا با اسکریپت نسخه یا --default-symver . (f10b0c4)
رفع خرابی یا خرابی خروجی هنگامی که فایل خروجی نیز یک فایل ورودی است، مانند قالب -r -o foo.o foo.o bar.o. (d2b88ab)
--gc-sections دیگر توابع داده شده توسط --init و --fini را حذف نمی کند. (c9e4cc4)
نمادهای معمولی به همین نام با اندازه های مختلف اکنون بزرگترین اندازه و دقیق ترین تراز را دارند، مانند GNU ld و lld. ( d5781d5 )
--icf=safe دیگر توابع صادر شده از یک کتابخانه مشترک را تا می کند و --icf=all دیگر با --emit-relocs خراب نمی شود. (ceab12c، 3dcd1df)
یک مرجع نسخهسازی شده مانند foo@VER در یک کتابخانه مشترک دیگر عضو بایگانی را که یک foo بدون نسخه تعریف میکند نمیکشد. (#1657) (44bfa2a)
چندین مورد خروجی غیر قطعی، در --dependency-file، --repro، -r با بسیاری از گروه های COMDAT به همین نام، و برخی جابجایی های پویا رفع شد. ( 5164561 , 6d33903 , 51e23d4 , 696ed71 )
رفع چندین اشکال -r: استثناهای C++ در کد فایل های ورودی دوم و بعدی شکسته شدند. -x، -X و -s نمادهایی را حذف کردند که جابجایی ها به آنها اشاره کردند. --gc-sections داده هایی را حذف کردند که جابجایی ها به آنها اشاره کردند. sh_link بخشهای SHF_LINK_ORDER مانند .ARM.exidx تنظیم نشد. و قالب با واحدهای --strip-debug و DWARF خراب شد. ( 0e41bb9 , 3717460 , b2c3d1d , 9aacb62 , a247ca2 , e41ed90 )
جابجایی های مربوط به GOT مانند R_X86_64_GOTOFF64، و R_ARM_REL32، در برابر نمادهای تعریف شده در کتابخانه های مشترک، در سکوت آدرس های اشتباهی دریافت کردند. آنها اکنون به درستی مدیریت می شوند یا به عنوان خطا گزارش می شوند. (#1668) (659780e، 7fe68bf)
خطاهای مربوط به جابجایی های مربوط به رایانه شخصی که نمی توانند در خروجی مستقل از موقعیت استفاده شوند، اکنون علت و نحوه رفع آن را توضیح می دهند. ( 39e6a01 , 17b7b85 )
موارد زیر اکنون به جای خروجی شکسته یا خرابی باعث خطا می شوند: --defsym با نام مستعار یک نماد تعریف شده در یک کتابخانه مشترک، یک نماد پنهان غیرضعیف تعریف نشده در یک کتابخانه مشترک یا با --unresolved-symbols=ignore-all , یک مقدار --defsym که در قسمت 64 بیتی متناسب نیست، و همچنین یک allocstried بخش است که با 64 بیت همخوانی ندارد. --emit-relocs . ( 56b862b , b3566fa , e3a89f2 , a980054 , 8233a75 )
--noinhibit-exec دیگر در ارجاع به نمادها در گروه های COMDAT حذف شده خراب نمی شود. ( 8f17166 , 80baa5d )
گزینه هایی که با یک خط تیره شروع می شوند اکنون همانطور که GNU ld آنها را می خواند خوانده می شوند. به عنوان مثال، -entry=main به صورت -e ntry=main خوانده شد. (#1671، #1670) (830a860)
--dynamic-list-data، --lto-pseudo-probe-for-profiling و --thinlto-index-only دیگر آرگومان بعدی را مصرف نمی کنند، و --no-color-diagnostics اکنون پذیرفته شده است. ( 2ca893e , 04b493e )
اگر یک اسکریپت نسخه یک نماد را در بیش از یک گره نسخه فهرست کند، اولین مورد اکنون اولویت دارد، مانند GNU ld و lld. (b7048f5)
مسیرهای نسبی را با -C، --chroot و --repro ثابت کرد. ( e3bc349 , 04e7dd8 , a368d22 )
mold دیگر 8 گیگابایت فضای آدرس مجازی در هنگام راه اندازی ذخیره نمی کند، بنابراین تحت ulimit -v کار می کند. (cc69390, b18be91)
اگر XDG_RUNTIME_DIR یک رشته خالی باشد، MOLD_JOBS اکنون کار می کند. (8a360ff)
فایلهای ایجاد شده توسط --separate-debug-file دیگر شامل بخش gnu_debuglink. نمیشوند. (#1656) (b56649e)
قالب دیگر نمادهای بی معنی __start_EHDR، __stop_EHDR، __start_PHDR و __stop_PHDR را ایجاد نمی کند. (0ee71d3)
[AArch64][PPC32][ARM32] تماسها را با توابع ثابت در بخشهای دیگر از طریق اعلانهای پسوند محدوده، که در برنامههای بزرگی مانند ساخت اشکالزدایی ARM64 Chromium به آدرسهای اشتباهی میرفتند، ثابت کرد. ( 4165d0e , 9b91621 )
[AAarch64] برای انواع جابجایی بیشتر، مانند R_AARCH64_TSTBR14 و R_AARCH64_GOT_LD_PREL19، پشتیبانی اضافه شد. ( 96d0282 , a4b64d8 )
[ARM32] پشتیبانی از انواع جابجایی بیشتر، مانند R_ARM_ALU_PC_G0 و R_ARM_THM_PC12، و خروجی -r ثابت برای ARM بزرگ endian اضافه شد. (c0f9cd6، 4c9aad3، 4c26f16)
[ARM32][i386] -r دیگر دستورالعملهای ارجاعشده توسط برخی شعب و جابجاییهای TLS را خراب نمیکند. ( 1b17bdf )
[RISC-V][LoongArch] تماسهای توابعی را که با --icf=all تا میشوند هنگامی که آرامش آنها را کوچک میکند، و R_RISCV_64 و R_LARCH_64 در اشیاء 32 بیتی جابهجا میشوند، ثابت کرد. ( 52febe9 , 5b22233 )
[RISC-V] TLSDESC را با فایلهای شی ایجاد شده توسط Clang 18، --emit-relocs با آرامش TLSDESC، پرچم EF_RISCV_TSO، خروجی R_RISCV_ALIGN در -r، و بررسیهای سرریز برای جابجاییهای 32 بیتی مربوط به رایانه شخصی ثابت کرد. ( fdf8422 , 7c8b805 , 6b60f75 , 4ba7792 , 85d55f3 )
[LoongArch] پشتیبانی از TLSDESC را در مدل کد شدید اضافه کرد و مقادیر اشتباه جابجایی *64_PC_HI12 و خطاهای سرریز کاذب را برای جابجاییهای TLS برطرف کرد. (a36a161 , 8133938 , 13e6cc0 )
[PPC32][m68k] برای انحرافات 16 بیتی که کد -fpic استفاده میکند، اکنون بهجای کوتاه شدن بیصدا، بهعنوان یک خطا گزارش میشود. (acc8854, 614e2a0)
[PPC64] تماسهای IFUNC در فایلهای اجرایی با پیوند استاتیک و ارجاعات @got در مونتاژ دستنویس، ثابت شد، و قالب اکنون خانواده توابع _savegpr0_* را برای PPC64V1 نیز ترکیب میکند. ( d3b2a74 , b34a308 , efda2fc )
[SH4] هنگام فراخوانی تابعی که ساختاری را از طریق PLT و استثناهای C++ در برنامههای پیوند داده شده از خروجی -r برمیگرداند، خرابی را برطرف کرد. ( d9cf1f0 , 92161dd )
[SPARC64] دستورالعملهای شاخه را با استفاده از R_SPARC_WDISP16 و خروجی R_SPARC_OLO10 در -r ثابت کرد. ( 6df3fd2 , 269fbb9 )
متن اصلی (انگلیسی)
Mold Linker Version 3.0.0 Release – Rewritten in Rust
Article URL: https://github.com/rui314/mold/releases/tag/v3.0.0 Comments URL: https://news.ycombinator.com/item?id=49963385 Points: 196 # Comments: 102