| MOLD(1) | General Commands Manual | MOLD(1) |
نام (NAME)
mold - یک پیونددهنده مدرن و سریع
خلاصه دستور (SYNOPSIS)
mold [option...] file...
توضیحات (DESCRIPTION)
دستور mold یک جایگزین سریعتر و بدون نیاز به تغییر برای پیونددهنده پیشفرض GNU ld(1) است.
روش استفاده
به https://github.com/rui314/mold#how-to-use مراجعه کنید.
سازگاری
پیونددهنده mold به گونهای طراحی شده است که جایگزینی مستقیم برای پیونددهندههای GNU در پیوند برنامههای فضای کاربر باشد. اگر برنامه فضای کاربر شما به دلیل نبود برخی گزینههای خط فرمان ساخته نمیشود، لطفاً یک گزارش اشکال در https://github.com/rui314/mold/issues ثبت کنید.
دستور mold از مجموعه بسیار محدودی از قابلیتهای اسکریپت پیونددهنده (linker script) پشتیبانی میکند، که صرفاً برای خواندن /usr/lib/x86_64-linux-gnu/libc.so در سیستمهای لینوکس کافی است (در لینوکس، این فایل بر خلاف نامش یک کتابخانه اشتراکی نیست بلکه یک اسکریپت پیونددهنده متنی ASCII است که فایل واقعی libc.so را بارگذاری میکند.)
فراتر از آن، برنامهای برای پشتیبانی از قابلیتهای اضافی اسکریپتهای پیونددهنده وجود ندارد. زبان اسکریپت پیونددهنده زبانی موردی، بیش از حد طراحیشده و پیچیده است که به باور ما باید با سازوکار سادهتری جایگزین شود. در عوض، قصد داریم جایگزینی برای اسکریپت پیونددهنده به mold اضافه کنیم.
تفکیک نمادهای آرشیو
به طور سنتی، پیونددهندههای یونیکس به ترتیبی که فایلهای ورودی در خط فرمان ظاهر میشوند حساس هستند. آنها فایلهای ورودی را یکییکی از اولین فایل (سمت چپترین) تا آخرین فایل (سمت راستترین) پردازش میکنند. هنگام خواندن فایلهای ورودی، آنها مجموعهای از نمادهای تعریفشده و تعریفنشده را نگهداری میکنند. هنگام رسیدن به یک فایل آرشیو (فایلهای .a)، آنها فایلهای شیء را برای تفکیک بیشترین تعداد ممکن از نمادهای تعریفنشده بیرون میکشند و به فایل ورودی بعدی میروند. فایلهای شیئی که بیرون کشیده نشدهاند، هرگز فرصتی برای بررسی دوباره نخواهند داشت.
به دلیل این رفتار، معمولاً باید فایلهای آرشیو را در انتهای خط فرمان اضافه کنید تا وقتی پیونددهنده به فایلهای آرشیو میرسد، بداند چه نمادهایی هنوز تعریفنشده باقی ماندهاند.
اگر فایلهای آرشیو را در ابتدای خط فرمان قرار دهید، پیونددهنده هیچ نماد تعریفنشدهای ندارد و بنابراین هیچ فایل شیئی از آرشیوها بیرون کشیده نمیشود. میتوانید با استفاده از گزینههای --start-group و --end-group ترتیب پردازش را تغییر دهید، اگرچه این کار سرعت پیونددهنده را کاهش میدهد.
پیونددهنده mold و همچنین پیونددهنده LLVM lld(1) رویکرد متفاوتی در پیش میگیرند. آنها به جای فراموش کردن نمادها پس از پردازش هر آرشیو، به خاطر میسپارند کدام نمادها را میتوان از فایلهای آرشیو تفکیک کرد. بنابراین، mold و lld(1) میتوانند در خط فرمان «به عقب برگردند» تا فایلهای شیء را از آرشیوها بیرون بکشند در صورتی که برای تفکیک نمادهای تعریفنشده باقیمانده مورد نیاز باشند. آنها به ترتیب فایلهای ورودی حساس نیستند.
گزینههای --start-group و --end-group همچنان توسط mold و lld(1) برای سازگاری با پیونددهندههای سنتی پذیرفته میشوند، اما در سکوت نادیده گرفته میشوند.
تفکیک پویای نمادها
درک برخی از قابلیتهای پیونددهندههای یونیکس بدون فهم معناشناسی تفکیک پویای نمادها دشوار است. بنابراین، هرچند که این موضوع مختص mold نیست، آن را در اینجا توضیح میدهیم.
ما از اصطلاح «ماژول ELF» یا به سادگی «ماژول» به عنوان واژهای فراگیر برای اشاره به یک فایل اجرایی یا یک کتابخانه اشتراکی در قالب ELF استفاده میکنیم.
یک ماژول ELF ممکن است فهرستی از نمادهای وارداتی و نمادهای صادراتی و همچنین فهرستی از نامهای کتابخانههای اشتراکی داشته باشد که نمادهای وارداتی باید از آنها وارد شوند. نکته این است که نمادهای وارداتی تا زمان اجرا به هیچ کتابخانه اشتراکی خاصی متصل نیستند.
نحوه تفکیک نمادهای پویا توسط پیونددهنده پویای یونیکس به این صورت است: هنگام شروع یک برنامه ELF، پیونددهنده پویا فهرستی از ماژولهای ELF میسازد که در کل یک برنامه کامل را تشکیل میدهند. فایل اجرایی همیشه در ابتدای فهرست قرار دارد و پس از آن کتابخانههای اشتراکی وابسته به آن میآیند. یک نماد وارداتی از ابتدای فهرست تا انتها جستجو میشود. اگر دو یا چند ماژول نماد یکسانی را تعریف کنند، ماژولی که زودتر در فهرست ظاهر شده بر دیگران اولویت دارد.
این معناشناسی یونیکس بر خلاف سیستمهایی مانند ویندوز است که فضای نام دو سطحی برای نمادهای پویا دارند. به عنوان مثال در ویندوز، نمادهای پویا به صورت تاپلی از (symbol-name, shared-library-name) نشان داده میشوند، به طوری که تضمین میشود هر نماد پویا از یک کتابخانه خاص تفکیک شود.
معمولاً یک ماژول ELF که نمادی را صادر میکند، همان نماد را وارد نیز میکند. چنین نمادی معمولاً به خودش تفکیک میشود، اما اگر ماژولی که قبل از آن در فهرست جستجوی نماد ظاهر شده تعریف دیگری از همان نماد را ارائه دهد، اینگونه نخواهد بود.
بیایید malloc را به عنوان مثال در نظر بگیریم. فرض کنید نسخه خود را از malloc در فایل اجرایی اصلی خود تعریف کردهاید. سپس، تمام فراخوانیهای malloc از هر ماژولی به جای تابع موجود در libc به تابع شما تفکیک میشوند، زیرا فایل اجرایی همیشه در ابتدای فهرست جستجوی نمادهای پویا قرار دارد. توجه داشته باشید که حتی فراخوانیهای malloc درون libc نیز به تعریف شما تفکیک میشوند زیرا libc تابع malloc را هم صادر و هم وارد میکند. بنابراین با تعریف malloc توسط خودتان، میتوانید یک تابع کتابخانه را رونویسی کنید و malloc موجود در libc به کد مرده تبدیل میشود.
این معناشناسی یونیکس پیچیده است و گاهی زیانبار تلقی میشود. برای مثال، فرض کنید به طور تصادفی atoi را به عنوان یک تابع سراسری در فایل اجرایی خود تعریف کنید که کاملاً متفاوت از تابع استاندارد C رفتار میکند. در این صورت تمام فراخوانیهای تابع atoi از هر ماژولی (حتی فراخوانیهای درون libc) به جای تابع موجود در libc به تابع شما هدایت میشوند که به احتمال زیاد باعث بروز مشکل خواهد شد. این یک پیامد تا حدی غافلگیرکننده برای یک تداخل نام تصادفی است. از سوی دیگر، این معناشناسی گاهی مفید است زیرا به کاربران امکان میدهد توابع کتابخانهای را بدون بازسازی مجدد ماژولهای حاوی آنها بازنویسی (override) کنند.
خوب یا بد، باید این معناشناسی را به خاطر بسپارید تا رفتارهای پیونددهندههای یونیکس را درک کنید.
بازتولیدپذیری ساخت
خروجی mold قطعی است؛ یعنی اگر فایلهای شیء و گزینههای خط فرمان یکسانی را به یک نسخه از mold بدهید، تضمین میشود که mold خروجی کاملاً یکسان بیتبهبیت تولید میکند. تصادفیبودنهای داخلی پیونددهنده مانند زمانبندی ریسمانها یا ترتیب پیمایش جدولهای درهمسازی تاثیری بر خروجی ندارند.
دستور mold هیچ تنظیمات پیشفرض مختص میزبانی ندارد. این بر خلاف پیونددهندههای GNU است که برخی مقادیر قابل تنظیم در آنها مانند مسیرهای جستجوی کتابخانههای وابسته به سیستم به صورت هاردکدشده هستند. دستور mold فقط به آرگومانهای خط فرمان خود وابسته است.
قالببندی گزینهها (OPTION NOTATIONS)
گزینههای طولانی چندحرفی ممکن است پس از یک خطتیره یا دو خطتیره بیایند، به جز گزینههایی که با حرف "o" شروع میشوند. به دلایل تاریخی، گزینههای طولانی که با "o" شروع میشوند باید حتماً پس از دو خطتیره بیایند.
برای مثال، میتوانید --as-needed را به صورت -as-needed بنویسید، اما --omagic نباید به صورت -omagic نوشته شود؛ چرا که -omagic به عنوان --omagic تفسیر نمیشود بلکه به صورت -o magic تفسیر خواهد شد.
گزینههای اختصاصی MOLD (MOLD-SPECIFIC OPTIONS)
- --chroot=dir
- پوشه dir را به عنوان دایرکتوری ریشه تنظیم میکند.
- --color-diagnostics=[ auto | always | never ]
- پیامهای عیبیابی را با استفاده از توالیهای گریز ANSI رنگی نمایش میدهد. مقدار auto بدین معناست که mold پیامها را فقط در صورتی رنگی چاپ میکند که خروجی استاندارد به یک TTY متصل باشد. حالت پیشفرض auto است.
- --color-diagnostics
- هممعنی --color-diagnostics=auto.
- --no-color-diagnostics
- هممعنی --color-diagnostics=never.
- --detach, --no-detach
- به mold اجازه میدهد یا مانع میشود که فایل اطلاعات اشکالزدایی را در پسزمینه ایجاد کند.
- --fork, --no-fork
- یک فرایند فرزند ایجاد میکند و پیوند واقعی را به آن میسپارد. هنگام پیوند دادن یک برنامه بزرگ، هسته سیستمعامل ممکن است چند صد میلیثانیه برای پایان دادن به فرایند mold زمان ببرد. گزینه --fork این تأخیر را پنهان میکند. به طور پیشفرض چنگال (fork) انجام میشود.
- توجه داشته باشید که --fork همچنین آمار مصرف منابع گزارششده توسط time(2) را پنهان میکند، زیرا waitpid(2) را روی فرایند فرزند فراخوانی نمیکند. اگر به این آمارها نیاز دارید، گزینه --no-fork را بدهید.
- --perf
- آمارهای کارایی و عملکرد را چاپ میکند.
- --print-dependencies
- اطلاعات وابستگی فایلهای ورودی را چاپ میکند.
- هر خط از خروجی این گزینه نشان میدهد کدام فایل برای استفاده از یک نماد خاص به کدام فایل وابسته است. این گزینه برای اشکالزدایی اینکه چرا یک فایل شیء در یک آرشیو ایستا پیوند خورده است یا چرا یک کتابخانه اشتراکی حتی با وجود --as-needed در فهرست وابستگیهای فایل خروجی باقی مانده مفید است.
- --relocatable-merge-sections
- به طور پیشفرض هنگام ادغام فایلهای شیء ورودی در یک فایل شیء خروجی برای -r، پیونددهنده mold بخشهای ورودی را بر اساس نام ادغام نمیکند. برای مثال، .text.foo و .text.bar برای -r ادغام نمیشوند حتی اگر بر اساس قواعد پیشفرض ادغام بخشها در .text ادغام گردند.
- این گزینه این رفتار را تغییر میدهد تا mold بخشهای ورودی را طبق قواعد پیشفرض ادغام بخشها بر اساس نام ادغام کند.
- --repro
- فایلهای ورودی و همچنین یک فایل متنی حاوی گزینههای خط فرمان را در یک فایل tar آرشیو میکند تا بتوانید مجدداً mold را با دقیقاً همان ورودیها اجرا کنید. این گزینه برای گزارش اشکال به همراه نمونه بازتولیدکننده مفید است. نام فایل خروجی path/to/output.tar خواهد بود، که در آن path/to/output نام فایل خروجی مشخصشده با -o است.
- --reverse-sections
- ترتیب بخشهای ورودی را قبل از تخصیص آفستها در فایل خروجی معکوس میکند.
- این گزینه برای یافتن اشکالاتی که به ترتیب مقداردهی اولیه اشیاء سراسری وابسته هستند مفید است. در ++C، سازندههای اشیاء سراسری در یک فایل منبع واحد تضمین میشوند که به ترتیب موجود در کد منبع اجرا شوند، اما چنین تضمینی در میان واحدهای ترجمه مختلف وجود ندارد. معمولاً سازندهها به ترتیبی که به پیونددهنده داده میشوند اجرا میگردند، اما تکیه بر این موضوع اشتباه است.
- با معکوس کردن ترتیب بخشهای ورودی با استفاده از --reverse-sections، میتوانید به راحتی بررسی کنید که آیا برنامه شما با ترتیب معکوس مقداردهی اولیه به درستی کار میکند یا خیر.
- --run command arg...
- دستور command را با قرار دادن mold به جای /usr/bin/ld اجرا میکند. به طور دقیقتر، mold دستور مشخصشده را با متغیر محیطی LD_PRELOAD برای رهگیری خانواده توابع exec(3) اجرا کرده و در صورت یکی بودن نام برنامه با ld، ld.gold یا ld.lld، مقدار argv[0] را با خود جایگزین میکند.
- --separate-debug-file, --separate-debug-file=file
- بخشهای اطلاعات اشکالزدایی را به جای جاسازی در فایل اجرایی یا کتابخانه اشتراکی خروجی، در یک فایل جداگانه بستهبندی میکند. دستور mold به طور پیشفرض فایل اطلاعات اشکالزدایی را در پسزمینه ایجاد میکند تا بتوانید اجرای فایل اجرایی خود را در سریعترین زمان ممکن آغاز کنید.
- به طور پیشفرض، فایل اطلاعات اشکالزدایی در همان پوشه فایل خروجی و با پسوند .dbg ایجاد میشود. این نام فایل در فایل خروجی جاسازی میشود تا gdb بتواند به طور خودکار فایل اطلاعات اشکالزدایی مربوط به فایل خروجی را پیدا کند. برای اطلاعات بیشتر درباره ویژگیهای gdb مرتبط با فایلهای اشکالزدایی جداگانه، به https://sourceware.org/gdb/current/onlinedocs/gdb.html/Separate-Debug-Files.html مراجعه کنید.
- پیونددهنده mold هنگام ایجاد فایل اطلاعات اشکالزدایی در پسزمینه، با استفاده از flock(2) قفل فایل را نگه میدارد.
- اگر مایل نیستید فایل اطلاعات اشکالزدایی در پسزمینه ایجاد شود، گزینه --no-detach را مشخص کنید.
- --shuffle-sections, --shuffle-sections=number
- با برهم زدن تصادفی ترتیب بخشهای ورودی قبل از تخصیص آفستها در فایل خروجی، خروجی را تصادفیسازی میکند. اگر یک number داده شود، به عنوان بذر (seed) تولیدکننده اعداد تصادفی استفاده میشود تا پیونددهنده برای بذر یکسان، خروجی یکسانی تولید کند. اگر بذری مشخص نشود، یک عدد تصادفی به عنوان بذر استفاده میشود.
- این گزینه برای محکزنی (benchmarking) مفید است. پردازندههای مدرن نسبت به چیدمان حافظه برنامه حساس هستند. یک تغییر به ظاهر بیضرر در چیدمان برنامه، مانند افزایش جزئی اندازه یک تابع در میانه برنامه، میتواند بر عملکرد برنامه تأثیر بگذارد. بنابراین، حتی اگر کد جدیدی بنویسید و نتیجه محک خوبی بگیرید، دشوار است بگوییم آیا کد جدید کارایی برنامه را بهبود بخشیده است یا خیر؛ ممکن است چیدمان جدید حافظه بر حسب تصادف عملکرد بهتری داشته باشد.
- با اجرای چندین باره یک آزمون محک با چیدمانهای تصادفی حافظه با استفاده از --shuffle-sections، میتوانید عملکرد واقعی برنامه خود را از تصادفی بودن ناشی از تغییر چیدمان حافظه جدا کنید.
- --spare-program-headers=number
- تعداد مشخصشدهای از مدخلهای PT_NULL را به انتهای سرآیند برنامه اضافه میکند، تا ابزارهای پردازش پس از پیوند بتوانند به راحتی با بازنویسی مدخلهای تهی، بخشهای جدیدی اضافه کنند.
- توجه داشته باشید که استاندارد ELF نیازمند آن است که تمام سگمنتهای PT_LOAD بر اساس p_vaddr مرتب شوند. بنابراین، اگر یک سگمنت LOAD جدید اضافه کنید، ممکن است لازم باشد کل سرآیند برنامه را مرتب کنید.
- --stats
- آمارهای ورودی را چاپ میکند.
- --thread-count=count
- از تعداد count ریسمان استفاده میکند.
- --threads, --no-threads
- از چند ریسمان استفاده میکند. به طور پیشفرض، mold به اندازه تعداد هستهها یا ۳۲ ریسمان (هر کدام که کمتر باشد) استفاده میکند. دلیل محدود شدن به ۳۲ این است که mold فراتر از آن نقطه مقیاسپذیری خوبی ندارد. برای استفاده از فقط یک ریسمان، --no-threads یا --thread-count=1 را ارسال کنید.
- --quick-exit, --no-quick-exit
- برای خروج از تابع quick_exit استفاده میکند یا نمیکند.
- --zero-to-bss
- بخشهای داده کاملاً صفر را به BSS تبدیل میکند.
- هنگامی که این گزینه فعال باشد، mold بخشهای داده ورودی را که از نوع SHT_NOBITS نیستند بررسی کرده و وارسی میکند که آیا محتوای آنها صرفاً از بایتهای صفر تشکیل شده است یا خیر. این بخشها سپس به بخشهای BSS (SHT_NOBITS) تبدیل میشوند. این کار اندازه فایل خروجی را کاهش میدهد، زیرا بخشهای BSS فضایی در تصویر فایل اشغال نمیکنند.
- این رفتار به ویژه برای بخشهای تعریفشده توسط کاربر که با __attribute__((section(".sectname"))) ایجاد شده و شامل متغیرهای سراسری مقداردهینشده هستند مفید است. کامپایلرهای GCC و Clang این بخشها را حتی اگر محتوایشان کاملاً صفر باشد به طور خودکار به عنوان BSS علامتگذاری نمیکنند و در عوض آنها را به عنوان بخشهای داده عادی منتشر میکنند.
- برای مثال، __attribute__((section(".sectname"))) int vec[256]; را در نظر بگیرید.
- به طور پیشفرض این تعریف منجر به بخشی به نام .sectname از نوع SHT_PROGBITS پر از صفر میشود. با گزینه --zero-to-bss، پیونددهنده آن را به عنوان داده خالی تشخیص داده و به یک بخش SHT_NOBITS تبدیل میکند که بدون تغییر در معناشناسی زمان اجرا، اندازه فایل خروجی را کاهش میدهد.
- -z rewrite-endbr, -z norewrite-endbr
- به عنوان یک اقدام امنیتی، برخی از مجموعههای دستورالعمل CPU اخیراً قابلیتی را برای محافظت از یکپارچگی جریان کنترل با غیرمجاز کردن پرشهای غیرمستقیم به طور پیشفرض دریافت کردهاند. اگر این ویژگی فعال باشد، دستورالعملی که بلافاصله پس از یک پرش غیرمستقیم اجرا میشود باید یک دستورالعمل نشانهگذار مقصد پرش باشد، وگرنه خطایی در سطح CPU رخ میدهد. دستورالعمل نشانهگذار با نام «landing pad» نیز شناخته میشود که پرشهای غیرمستقیم میتوانند بر روی آن فرود آیند. این ویژگی انجام حملات ROP را سختتر میکند.
- برای استفاده از این قابلیت، تابعی که اشارهگر آن گرفته میشود باید با یک landing pad شروع شود، زیرا فراخوانی تابع از طریق اشارهگر تابع به یک پرش غیرمستقیم کامپایل میشود. از سوی دیگر، اگر یک تابع فقط به صورت مستقیم فراخوانی شود (یعنی فقط دستورالعملهای پرش مستقیم به آن اشاره کنند)، نیازی به شروع با آن ندارد.
- به طور پیشفرض، کامپایلر همیشه یک landing pad در ابتدای هر تابع سراسری منتشر میکند زیرا نمیداند آیا اشارهگر آن تابع در واحد ترجمه دیگری گرفته شده است یا خیر. در نتیجه، باینری حاصل سطح حمله بیشتری نسبت به حد نیاز دارد.
- اگر گزینه --rewrite-endbr داده شود، mold یک تحلیل روی کل برنامه انجام میدهد تا توابعی را که آدرس آنها واقعاً گرفته شده است شناسایی کرده و landing padها را برای توابعی که آدرس آنها گرفته نشده با دستورهای no-op بازنویسی میکند و در نتیجه سطح حمله را کاهش میدهد.
- این ویژگی در حال حاضر فقط روی x86-64 در دسترس است.
گزینههای سازگار با GNU (GNU-COMPATIBLE OPTIONS)
- --help
- اطلاعات نحوه استفاده را در خروجی استاندارد نمایش میدهد و خارج میشود.
- -v, --version
- اطلاعات نسخه را در خروجی استاندارد گزارش میدهد.
- -V
- اطلاعات نسخه و هدف را در خروجی استاندارد گزارش میدهد.
- -E, --export-dynamic, --no-export-dynamic
- هنگام ایجاد یک فایل اجرایی، استفاده از گزینه -E باعث میشود همه نمادهای سراسری در جدول نمادهای پویا قرار گیرند، به طوری که نمادها در زمان اجرا برای سایر ماژولهای ELF قابل مشاهده باشند.
- به طور پیشفرض یا در صورت ارائه گزینه --no-export-dynamic، تنها نمادهایی که در زمان پیوند توسط DSOها ارجاع داده شدهاند از یک فایل اجرایی صادر میشوند.
- -F libname, --filter=libname
- فیلد بخش پویای DT_FILTER را به libname تنظیم میکند.
- -I file, --dynamic-linker=file, --no-dynamic-linker
- مسیر پیونددهنده پویا را روی file تنظیم میکند. اگر گزینه -I داده نشود یا اگر --no-dynamic-linker داده شود، هیچ مسیر پیونددهنده پویایی برای فایل خروجی تنظیم نمیشود. این بر خلاف پیونددهندههای GNU است که در این حالت یک مسیر پیشفرض پیونددهنده پویا تنظیم میکنند. این تفاوت معمولاً تفاوتی ایجاد نمیکند زیرا راهانداز کامپایلر همیشه -I را به پیونددهنده ارسال میکند.
- -L dir, --library-path=dir
- پوشه dir را به فهرست مسیرهای جستجوی کتابخانه اضافه میکند که mold از آنها کتابخانهها را برای گزینه -l جستجو میکند.
- برخلاف پیونددهندههای GNU، پیونددهنده mold مسیرهای جستجوی پیشفرض ندارد. این تفاوت معمولاً تأثیری در عمل ندارد زیرا راهانداز کامپایلر همیشه تمام مسیرهای جستجوی لازم را به پیونددهنده ارسال میکند.
- -M, --print-map
- یک فایل نگاشت (map file) در خروجی استاندارد مینویسد.
- -N, --omagic, --no-omagic
- پیونددهنده mold را مجبور میکند تا فایل خروجی را با چیدمان حافظه قدیمی تولید کند. نخست، اولین سگمنت داده را در مرز صفحه تراز نمیکند. دوم، اگر این گزینه مشخص شود بخشهای متنی به عنوان قابل نوشتن علامتگذاری میشوند.
- -S, --strip-debug
- بخشهای .debug_* را از فایل خروجی حذف میکند.
- -T file, --script=file
- اسکریپت پیونددهنده را از file میخواند.
- -X, --discard-locals
- نمادهای محلی موقت را برای کاهش اندازه جدول نمادها و جدول رشتهها حذف میکند. نمادهای محلی موقت، نمادهای محلی هستند که با .L شروع میشوند. کامپایلرها معمولاً چنین نمادهایی را برای عناصر بینام برنامه مانند رشتههای لفظی یا مقادیر لفظی ممیز شناور ایجاد میکنند. این رفتار پیشفرض است؛ برای حفظ نمادهای محلی موقت از --discard-none استفاده کنید.
- --discard-none
- همه نمادهای محلی را در جدول نمادها نگه میدارد، از جمله نمادهای موقتی که با .L شروع میشوند، به جز نمادهای موجود در بخشهای قابل ادغام. این رفتار پیشفرض GNU ld را بازیابی میکند. پیونددهندههای mold و ld.lld نمادهای محلی موقت را به طور پیشفرض دور میاندازند.
- -e symbol, --entry=symbol:
- نقطه ورود برنامه را روی symbol تنظیم میکند.
- -f shlib, --auxiliary=shlib
- فیلد بخش پویای DT_AUXILIARY را به shlib تنظیم میکند.
- -h libname, --soname=libname
- فیلد بخش پویای DT_SONAME را به libname تنظیم میکند. این گزینه هنگام ساخت یک فایل شیء اشتراکی استفاده میشود. معمولاً هنگامی که libfoo.so را میسازید، میخواهید --soname=foo را به پیونددهنده ارسال کنید.
- -l libname
- به دنبال liblibname.so یا liblibname.a در مسیرهای جستجوی کتابخانه میگردد.
- -m target
- یک هدف (target) را انتخاب میکند.
- -o file, --output=file
- از file به عنوان نام فایل خروجی به جای نام پیشفرض a.out استفاده میکند.
- -r, --relocatable
- به جای تولید یک فایل اجرایی یا شیء اشتراکی، فایلهای شیء ورودی را ترکیب کرده تا فایل شیء دیگری تولید کند که بتواند به عنوان ورودی برای یک پیونددهنده استفاده شود.
- -s, --strip-all
- بخش .symtab را از فایل خروجی حذف میکند.
- -u symbol, --undefined=symbol
- اگر symbol پس از خواندن تمام فایلهای شیء به عنوان یک نماد تعریفنشده باقی بماند، و اگر آرشیو ایستایی حاوی فایل شیئی باشد که symbol را تعریف میکند، آن فایل شیء را بیرون کشیده و پیوند میدهد تا فایل خروجی حاوی تعریفی از symbol باشد.
- -y symbol, --trace-symbol=symbol
- مراجع به symbol را ردگیری میکند.
- --Bdynamic
- پیوند را با کتابخانههای اشتراکی انجام میدهد.
- --Bstatic
- پیوند را با کتابخانههای اشتراکی انجام نمیدهد.
- --Bsymbolic
- هنگام ایجاد یک کتابخانه اشتراکی، نمادهای سراسری را فقط صادراتی میکند (یعنی همان نماد را وارد نمیکند). در نتیجه، ارجاعات درون یک کتابخانه اشتراکی همیشه به صورت محلی تفکیک میشوند و بازنویسی نماد در زمان اجرا بیاثر میشود. برای اطلاعات بیشتر در مورد واردات و صادرات نمادها، بخش «تفکیک پویای نمادها» را ببینید.
- --Bsymbolic-functions
- این گزینه همان اثر --Bsymbolic را دارد اما فقط برای نمادهای تابع کار میکند. نمادهای داده همچنان هم وارد و هم صادر میشوند.
- --Bsymbolic-non-weak
- این گزینه همان اثر --Bsymbolic را دارد اما فقط برای نمادهای غیرضعیف (non-weak) کار میکند. نمادهای ضعیف همچنان هم وارد و هم صادر میشوند.
- --Bsymbolic-non-weak-functions
- این گزینه همان اثر --Bsymbolic را دارد اما فقط برای نمادهای تابع غیرضعیف کار میکند. نمادهای داده و نمادهای تابع ضعیف همچنان هم وارد و هم صادر میشوند.
- --Bno-symbolic
- گزینههای --Bsymbolic، --Bsymbolic-functions، --Bsymbolic-non-weak و --Bsymbolic-non-weak-functions را لغو میکند.
- --Map=file
- فایل نگاشت را در file مینویسد.
- --Tbss=address
- نام مستعار برای --section-start=.bss=address.
- --Tdata=address
- نام مستعار برای --section-start=.data=address.
- --Ttext=address
- نام مستعار برای --section-start=.text=address.
- --Ttext-segment=address
- آدرس اولین بایت سگمنت متن را تنظیم میکند.
- --allow-multiple-definition
- به طور معمول، اگر بیش از یک تعریف از یک نماد وجود داشته باشد، پیونددهنده خطا گزارش میکند. این گزینه رفتار پیشفرض را تغییر میدهد تا برای تعاریف تکراری خطا گزارش نکند و در عوض از اولین تعریف استفاده کند.
- --allow-shlib-undefined, --no-allow-shlib-undefined
- حتی اگر mold در پیوند دادن یک فایل اجرایی اصلی بدون خطاهای نماد تعریفنشده موفق شود، ممکن است در زمان اجرا با خطاهای جستجوی نماد روبرو شوید زیرا پیونددهنده پویا نمیتواند برخی نمادها در کتابخانههای اشتراکی را در هیچ ماژول ELF پیدا کند. این اتفاق میافتد زیرا mold به طور پیشفرض نمادهای تعریفنشده در کتابخانههای اشتراکی را نادیده میگیرد.
- اگر گزینه --no-allow-shlib-undefined را بدهید، mold بررسی میکند که آیا نمادهای تعریفنشده در کتابخانههای اشتراکی دادهشده به پیونددهنده در زمان پیوند قابل تفکیک هستند یا خیر. به عبارت دیگر، این کار خطای زمان اجرا را به خطای زمان پیوند تبدیل میکند.
- توجه داشته باشید که باید تمام کتابخانههای اشتراکی، از جمله کتابخانههای وابسته غیرمستقیم را به عنوان آرگومانهای -l به پیونددهنده ارسال کنید. اگر یک کتابخانه اشتراکی به کتابخانهای وابسته باشد که به پیونددهنده داده نشده است، تأیید برای آن فایل نادیده گرفته میشود.
- --as-needed, --no-as-needed
- به طور پیشفرض، کتابخانههای اشتراکی دادهشده به پیونددهنده بدون قید و شرط به فهرست کتابخانههای مورد نیاز در یک فایل خروجی اضافه میشوند. با این حال، کتابخانههای اشتراکی پس از --as-needed تنها زمانی به فهرست اضافه میشوند که حداقل یک نماد واقعاً توسط فایل خروجی استفاده شده باشد. به عبارت دیگر، کتابخانههای اشتراکی پس از --as-needed اگر توسط برنامه مورد نیاز نباشند به فهرست کتابخانههای لازم اضافه نمیشوند.
- گزینه --no-as-needed رفتار پیشفرض را برای فایلهای بعدی بازمیگرداند.
- --build-id=[ md5 | sha1 | sha256 | fast | uuid | 0xhexstring | none ]
- یک بخش .note.gnu.build-id شامل یک رشته بایتی برای شناسایی منحصربهفرد فایل خروجی ایجاد میکند. مقدار sha256 یک درهمسازی رمزنگاری ۲۵۶ بیتی از فایل خروجی محاسبه کرده و آن را برای شناسه ساخت تنظیم میکند. مقادیر md5 و sha1 همان درهمسازی را محاسبه میکنند اما قبل از تنظیم برای شناسه ساخت، آن را به ترتیب به ۱۲۸ و ۱۶۰ بیت کوتاه میکنند. مقدار uuid یک شناسه تصادفی ۱۲۸ بیتی UUID تنظیم میکند. مقدار 0xhexstring مقدار hexstring را تنظیم میکند. مقدار fast هممعنی sha256 است.
- --build-id
- هممعنی --build-id=sha256.
- --no-build-id
- هممعنی --build-id=none.
- --compress-debug-sections=[ zlib | zlib-gabi | zlib:N | zstd | zstd:N | none ]
- اطلاعات اشکالزدایی DWARF (بخشهای .debug_*) را با استفاده از الگوریتم فشردهسازی zlib یا zstd فشرده میکند. مقدار zlib-gabi نام مستعار zlib است. مقدار zlib:N سطح فشردهسازی zlib را تعیین میکند که در آن N بین ۰ تا ۹ است (۰ به معنی عدم فشردهسازی است)، و zstd:N سطح فشردهسازی zstd را تعیین میکند که N بین ۱ تا ۲۲ است. سطوح بالاتر به نسبتهای فشردهسازی بهتری دست مییابند اما کندتر هستند. مقدار zlib معادل zlib:1 و zstd معادل zstd:3 است.
- --defsym=symbol=value
- نماد symbol را به عنوان نام مستعار برای value تعریف میکند.
- مقدار value یا یک عدد صحیح (در مبنای ۱۰ یا ۱۶ با پیشوند 0x) یا یک نام نماد است. اگر یک عدد صحیح به عنوان مقدار داده شود، symbol به عنوان یک نماد مطلق با مقدار دادهشده تعریف میشود.
- --default-symver
- از soname به عنوان نسخه نماد استفاده کرده و آن نسخه را به همه نمادها الحاق میکند.
- --demangle, --no-demangle
- نمادهای ++C و Rust را در پیامهای گزارش رمزگشایی و خوانا (demangle) میکند.
- --dependency-file=file
- یک فایل وابستگی در file مینویسد. محتوای فایل نوشتهشده توسط make(1) قابل خواندن است، که تنها یک قاعده با فایل خروجی پیونددهنده به عنوان هدف و تمام فایلهای ورودی به عنوان پیشنیازهای آن تعریف میکند. انتظار میرود کاربران فایل وابستگی تولیدشده را در یک Makefile بگنجانند تا مدیریت وابستگی خودکار شود. این گزینه شبیه به گزینههای -MM -MF کامپایلر است.
- --dynamic-list=file
- فهرستی از نمادهای پویا را از file میخواند. مشابه --export-dynamic-symbol-list است، با این تفاوت که بر --Bsymbolic دلالت دارد. اگر file در پوشه فعلی وجود نداشته باشد، به منظور سازگاری با GNU ld در مسیرهای جستجوی کتابخانه جستجو میشود.
- --eh-frame-hdr, --no-eh-frame-hdr
- بخش .eh_frame_hdr را ایجاد میکند.
- --emit-relocs
- پیونددهنده معمولاً بخشهای بازمکانی (relocation) را مصرف میکند؛ یعنی بازمکانیها را روی بخشهای دیگر اعمال کرده و خود بخشهای بازمکانی دور انداخته میشوند.
- گزینه --emit-relocs به پیونددهنده دستور میدهد بخشهای بازمکانی را در فایل خروجی باقی بگذارد. برخی از ابزارهای بهینهسازی یا تحلیل باینری پس از پیوند مانند LLVM Bolt به آنها نیاز دارند.
- --enable-new-dtags, --disable-new-dtags
- به طور پیشفرض، mold برچسب DT_RUNPATH را برای --rpath منتشر میکند. اگر --disable-new-dtags را بدهید، mold در عوض DT_RPATH را برای --rpath منتشر میکند.
- --execute-only:
- صفحات کد را فقط قابل اجرا تعیین میکند.
- --exclude-libs=libraries ...
- همه نمادها در libraries دادهشده را پنهان علامتگذاری میکند.
- --export-dynamic-symbol=symbol
- نمادهای منطبق بر symbol را در جدول نمادهای پویا قرار میدهد. مقدار symbol ممکن است یک الگوی تطبیق (glob pattern) با همان ساختار نحوی گزینههای --export-dynamic-symbol-list یا --version-script باشد.
- --export-dynamic-symbol-list=file
- فهرستی از نمادهای پویا را از file میخواند.
- --fatal-warnings, --no-fatal-warnings
- هشدارها را به عنوان خطا در نظر میگیرد.
- --fini=symbol
- نماد symbol را در زمان تخلیه (unload) فراخوانی میکند.
- --gc-sections, --no-gc-sections
- بخشهای بدون ارجاع را حذف میکند.
- --gdb-index
- یک بخش .gdb_index برای افزایش سرعت اشکالزدای GNU ایجاد میکند. برای استفاده از این قابلیت، باید فایلهای منبع را با پرچم کامپایلر -ggnu-pubnames کامپایل کنید.
- --hash-style=[ sysv | gnu | both | none ]
- سبک درهمسازی را تنظیم میکند.
- --icf=[ safe | all | none ], --no-icf
- غیرمعمول نیست که یک برنامه شامل توابع یکسان بسیاری باشد که فقط در نام با هم تفاوت دارند. برای مثال، قالب std::vector در ++C بسیار محتمل است که برای std::vector<int> و std::vector<unsigned> به کدهای یکسانی تبدیل شود زیرا برای این ظرف تنها اندازه نوع پارامتر اهمیت دارد. تا کردن کدهای یکسان (ICF یا Identical Code Folding) یک بهینهسازی اندازه برای شناسایی و ادغام چنین توابع یکسانی است.
- اگر --icf=all داده شود، mold سعی میکند همه توابع یکسان را ادغام کند. این کار اندازه خروجی را بیش از همه کاهش میدهد، اما یک بهینهسازی «ایمن» نیست. در C و ++C تضمین شده است که دو اشارهگر به دو تابع مختلف هرگز برابر نخواهند بود، اما --icf=all این فرض را میشکند زیرا دو تابع یکسان پس از ادغام دارای آدرس یکسانی خواهند بود. بنابراین هنگام استفاده از این پرچم باید مراقب باشید که برنامه شما به یکتا بودن اشارهگر توابع وابسته نباشد.
- گزینه --icf=safe پرچمی است برای ادغام توابع تنها در زمانی که انجام آن ایمن باشد؛ یعنی اگر برنامهای آدرس یک تابع را نگیرد، ادغام آن تابع با تابع دیگر ایمن است، زیرا نمیتوانید بدون گرفتن آدرس یک تابع، اشارهگر تابع را با چیز دیگری مقایسه کنید.
- گزینه --icf=safe باید با کامپایلری استفاده شود که از بخش .llvm_addrsig پشتیبانی کند، بخشی که حاوی اطلاعات مربوط به نمادهایی است که آدرس آنها گرفته شده است. کامپایلر LLVM/Clang به طور پیشفرض از این بخش پشتیبانی میکند. از آنجا که GCC هنوز از آن پشتیبانی نمیکند، نمیتوانید از --icf=safe همراه با GCC استفاده کنید (هیچ آسیبی نمیرساند اما اصلاً بهینهسازی نمیکند.)
- گزینههای --icf=none و --no-icf قابلیت ICF را غیرفعال میکنند.
- --ignore-data-address-equality
- باعث میشود ICF نه تنها توابع، بلکه دادهها را نیز ادغام کند. این گزینه باید در ترکیب با --icf=all استفاده شود.
- --image-base=addr
- آدرس پایه را به addr تنظیم میکند.
- --init=symbol
- نماد symbol را در زمان بارگذاری فراخوانی میکند.
- --no-undefined
- نمادهای تعریفنشده را گزارش میدهد (حتی با --shared).
- --noinhibit-exec
- حتی در صورت وقوع خطا، فایل خروجی را ایجاد میکند.
- --package-metadata=percent-encoded-string
- یک رشته مشخص را در بخش .note.package جاسازی میکند. این گزینه برای اسکریپتهای ساختی طراحی شده است که بستههای باینری مانند .rpm یا .deb تولید میکنند تا متادادههای بسته را در هر فایل اجرایی بگنجانند. این کار فرآیند شناسایی بسته مربوطه را برای یک فایل اجرایی یا فایل هسته دادهشده (core file) ساده میکند.
- آرگومان این گزینه به صورت کدگذاری درصدی (percent-encoded) در نظر گرفته شده و قبل از درج در بخش رمزگشایی میشود، که به شما امکان میدهد از استفاده از نویسه کاما (,) در آرگومان اجتناب کنید. این امر مفید است زیرا کامپایلر تمام موارد کاما در -Wl, را قبل از ارسال به پیونددهنده با فاصله جایگزین میکند. توجه داشته باشید که mold همیشه آرگومان را به عنوان کدگذاری درصدی تفسیر میکند، بنابراین باید تمام نویسههای % را نیز با %25 اسکیپ کنید.
- --pack-dyn-relocs=[ relr | android | android+relr | none ]
- بازمکانیهای پویا را در فایل خروجی فشرده میکند.
- اگر relr مشخص شود، تمام بازمکانیهای R_*_RELATIVE به جای بخشهای .rel.dyn یا .rela.dyn در بخش .relr.dyn قرار میگیرند. از آنجا که بخش .relr.dyn از یک طرح کدگذاری با بهرهوری فضایی بالا استفاده میکند، تعیین این پرچم میتواند اندازه خروجی را کاهش دهد. این معمولاً برای فایلهای اجرایی مستقل از موقعیت (PIE) بیشترین کارایی را دارد.
- اگر android مشخص شود، تمام بازمکانیهای پویا در قالب بازمکانی بستهبندیشده اندروید (APS2) کدگذاری شده و در بخش .rel.dyn یا .rela.dyn ذخیره میشوند که نوع بخش آنها به SHT_ANDROID_REL یا SHT_ANDROID_RELA تغییر مییابد. جدول پویا بهروزرسانی میشود تا از DT_ANDROID_REL / DT_ANDROID_RELA و گونههای SZ آنها به جای برچسبهای استاندارد استفاده کند.
- مقدار android+relr هر دو را ترکیب میکند: بازمکانیهای R_*_RELATIVE به .relr.dyn میروند و بقیه با APS2 کدگذاری میشوند. این پیکربندی است که توسط بیشتر باینریهای سیستم اندروید استفاده میشود.
- توجه داشته باشید که یک بارگذار زمان اجرا باید از .relr.dyn پشتیبانی کند تا فایلهای اجرایی یا کتابخانههای اشتراکی پیوند خورده با --pack-dyn-relocs=relr را اجرا کند. تا سال ۲۰۲۶، کتابخانههای glibc (از نسخه ۲٫۳۶)، musl (از نسخه ۱٫۲٫۴)، Android، ChromeOS و Fuchsia همگی از آن پشتیبانی میکنند. از سوی دیگر، قالب APS2 تنها توسط بارگذار bionic اندروید پشتیبانی میشود؛ خود کدگذار مستقل از هدف است، اما باینری تولیدشده تنها در پلتفرمهایی قابل بارگذاری است که bionic (یا یک بارگذار سازگار) برچسبهای DT_ANDROID_REL(A) را مدیریت کند.
- --pie, --pic-executable, --no-pie, --no-pic-executable
- یک فایل اجرایی مستقل از موقعیت (PIE) ایجاد میکند.
- --print-gc-sections, --no-print-gc-sections
- بخشهای بدون ارجاع حذفشده را چاپ میکند.
- --print-icf-sections, --no-print-icf-sections
- بخشهای یکسان تا شده (ادغامشده) را چاپ میکند.
- --push-state, --pop-state
- گزینه --push-state مقادیر فعلی --as-needed، --whole-archive، --static و --start-lib را ذخیره میکند. مقادیر ذخیرهشده را میتوان با pop-state بازیابی کرد.
- جفتهای --push-state و --pop-state میتوانند به صورت تو در تو استفاده شوند.
- این گزینهها زمانی مفید هستند که بخواهید گزینههای خط فرمان پیونددهنده را به صورت برنامهنویسی بسازید. به عنوان مثال اگر میخواهید libfoo.so را بر اساس نیاز پیوند دهید اما نمیخواهید وضعیت سراسری --as-needed را تغییر دهید، میتوانید --push-state --as-needed -lfoo --pop-state را به گزینههای خط فرمان پیونددهنده اضافه کنید.
- --relax, --no-relax
- دستورالعملهای ماشین را برای برخی بازمکانیها با دستورالعملهای کارآمدتر بازنویسی میکند. این ویژگی به طور پیشفرض فعال است.
- --require-defined=symbol
- مشابه --undefined است، با این تفاوت که نماد جدید باید تا پایان پیوند تعریف شده باشد.
- --retain-symbols-file=file
- تنها نمادهای فهرستشده در file را نگه میدارد. فایل file یک فایل متنی حاوی یک نام نماد در هر خط است. دستور mold تمام نمادهای محلی و همچنین نمادهای سراسری را که در file نیستند دور میاندازد. توجه داشته باشید که این گزینه نمادها را فقط از بخش .symtab حذف میکند و تأثیری بر بخش .dynsym که برای پیوند پویا استفاده میشود ندارد.
- --rpath=dir
- پوشه dir را به مسیرهای جستجوی زمان اجرا اضافه میکند.
- --section-start=section=address
- مقدار address را برای بخش تنظیم میکند. مقدار address یک عدد در مبنای ۱۶ است که ممکن است با 0x اختیاری شروع شود.
- یک کتابخانه اشتراکی ایجاد میکند.
- --spare-dynamic-tags=number
- تعداد مشخصشده از مدخلهای DT_NULL را به انتهای بخش .dynamic اضافه میکند، به طوری که ابزارهای پردازش پس از پیوند بتوانند به راحتی با بازنویسی مدخلهای خالی، برچسبهای پویای جدیدی اضافه کنند.
- --start-lib, --end-lib
- با فایلهای شیء بین --start-lib و --end-lib طوری رفتار میکند که گویی در یک فایل آرشیو هستند؛ یعنی فایلهای شیء بین آنها تنها زمانی پیوند داده میشوند که برای تفکیک نمادهای تعریفنشده مورد نیاز باشند. این گزینهها در صورتی مفید هستند که بخواهید فایلهای شیء را فقط در صورت نیاز پیوند دهید، اما بخواهید از سربار اجرای ar(3) اجتناب کنید.
- --static
- پیوند را با کتابخانههای اشتراکی انجام نمیدهد.
- --sysroot=dir
- پوشه ریشه سیستم هدف را به dir تنظیم میکند.
- --trace
- نام هر فایل ورودی را چاپ میکند.
- --undefined-glob=pattern
- هممعنی --undefined است، با این تفاوت که --undefined-glob به جای یک نام نماد منفرد، یک الگوی تطبیق میگیرد.
- --undefined-version, --no-undefined-version
- به طور پیشفرض، mold در مورد نمادی که توسط یک اسکریپت نسخه یا توسط --export-dynamic-symbol مشخص شده ولی تعریف نشده باشد هشدار میدهد. میتوانید با --undefined-version این هشدار را بیصدا کنید.
- --unique=pattern
- بخشهای ورودی را که با الگوی تطبیق دادهشده pattern مطابقت دارند ادغام نمیکند.
- --unresolved-symbols=[ report-all | ignore-all | ignore-in-object-files | ignore-in-shared-libs ]
- نحوه مدیریت نمادهای تعریفنشده را تعیین میکند.
- --version-script=file
- اسکریپت نسخه را از file میخواند. اگر file در پوشه فعلی وجود نداشته باشد، به منظور سازگاری با GNU ld در مسیرهای جستجوی کتابخانه جستجو میشود.
- -w, --no-warnings
- هشدارها را سرکوب کرده و --fatal-warnings را لغو میکند.
- --warn-common, --no-warn-common
- درباره نمادهای مشترک (common symbols) هشدار میدهد.
- --warn-once
- برای هر نماد تعریفنشده فقط یک بار هشدار میدهد به جای اینکه برای هر بازمکانی که به یک نماد تعریفنشده ارجاع میدهد هشدار دهد.
- --warn-unresolved-symbols, --error-unresolved-symbols
- به طور معمول، پیونددهنده برای نمادهای تفکیکنشده خطا گزارش میکند. گزینه --warn-unresolved-symbols آن را به هشدار تبدیل میکند. گزینه --error-unresolved-symbols رفتار پیشفرض را بازمیگرداند.
- --whole-archive, --no-whole-archive
- هنگامی که فایلهای آرشیو (فایلهای .a) به پیونددهنده داده میشوند، تنها فایلهای شیئی که برای تفکیک نمادهای تعریفنشده مورد نیاز هستند از آنها استخراج شده و به فایل خروجی پیوند میخورند. گزینه --whole-archive این رفتار را برای آرشیوهای بعدی تغییر میدهد تا پیونددهنده تمام فایلهای شیء را استخراج کرده و به خروجی پیوند دهد. برای مثال اگر در حال ایجاد یک فایل شیء اشتراکی هستید و میخواهید تمام اعضای آرشیو را در خروجی بگنجانید، باید --whole-archive را ارسال کنید. گزینه --no-whole-archive رفتار پیشفرض را برای آرشیوهای بعدی بازمیگرداند.
- --wrap=symbol
- باعث میشود symbol به __wrap_symbol تفکیک شود. نماد اصلی میتواند به عنوان __real_symbol تفکیک شود. این گزینه معمولاً برای پوشش دادن (wrapping) یک تابع موجود استفاده میشود.
- -z cet-report=[ warning | error | none ]
- فناوری اجرای جریان کنترل اینتل (CET) یک ویژگی جدید x86 است که از زمان Tiger Lake (منتشرشده در ۲۰۲۰) در دسترس است. این فناوری دستورالعملهای جدیدی برای سختتر کردن امنیت تعریف میکند تا از برنامهها در برابر حملات ربودن کنترل محافظت کند. میتوانید با تعیین پرچم -fcf-protection به کامپایلر بگویید از این ویژگی استفاده کند.
- پرچم -z cet-report برای اطمینان از این است که تمام فایلهای شیء با یک پرچم صحیح -fcf-protection کامپایل شدهاند. اگر warning یا error داده شود، در صورتی که یک فایل شیء با پرچم کامپایلر کامپایل نشده باشد، mold یک پیام هشدار یا خطا چاپ میکند.
- پیونددهنده mold به دنبال بیتهای GNU_PROPERTY_X86_FEATURE_1_IBT و GNU_PROPERTY_X86_FEATURE_1_SHSTK در بخش .note.gnu.property میگردد تا مشخص کند آیا یک فایل شیء با -fcf-protection کامپایل شده است یا خیر.
- -z now, -z lazy
- به طور پیشفرض، توابعی که به ماژولهای ELF دیگر ارجاع میدهند توسط پیونددهنده پویا زمانی که برای نخستین بار فراخوانی میشوند تفکیک میگردند. گزینه -z now یک فایل اجرایی یا کتابخانه اشتراکی را علامتگذاری میکند تا تمام نمادهای پویا در زمان بارگذاری فایل در حافظه تفکیک شوند. گزینه -z lazy رفتار پیشفرض را بازمیگرداند.
- -z origin
- شیء را نیازمند پردازش فوری $ORIGIN در زمان اجرا علامتگذاری میکند.
- -z ibt
- بیت GNU_PROPERTY_X86_FEATURE_1_IBT را در بخش .note.gnu.property روشن میکند تا نشان دهد که خروجی از PLT با قابلیت IBT استفاده میکند. این گزینه بر -z ibtplt دلالت دارد.
- -z ibtplt
- یک PLT با قابلیت ردگیری شاخه اینتل (IBT) تولید میکند که در x86-64 پیشفرض است. این حالت پیشفرض است.
- -z execstack, -z noexecstack
- به طور پیشفرض، صفحات مربوط به ناحیه پشته (یعنی صفحاتی که متغیرهای محلی در آنها قرار دارند) به دلایل امنیتی قابل اجرا نیستند. گزینه -z execstack آن را قابل اجرا میکند. گزینه -z noexecstack رفتار پیشفرض را بازمیگرداند.
- -z keep-text-section-prefix, -z nokeep-text-section-prefix
- بخشهای .text.hot، .text.unknown، .text.unlikely، .text.startup و .text.exit را به عنوان بخشهای جداگانه در باینری نهایی نگه میدارد به جای اینکه آنها را به صورت .text ادغام کند.
- -z rodynamic
- بخش .dynamic را فقطخواندنی میکند.
- -z relro, -z norelro
- برخی بخشها مانند .dynamic تنها در زمان بارگذاری ماژول در حافظه باید قابل نوشتن باشند. هنگامی که پیونددهنده پویا کار خود را به پایان رساند، چنین بخشهایی توسط هیچکس تغییر نخواهند کرد. به عنوان یک راهکار امنیتی، ترجیح داده میشود چنین سگمنتهایی در طول اجرای برنامه فقطخواندنی شوند.
- گزینه -z relro چنین بخشهایی را در یک سگمنت ویژه به نام relro قرار میدهد. پیونددهنده پویا پس از اتمام کار خود، سگمنت relro را فقطخواندنی میکند.
- به طور پیشفرض، mold یک سگمنت relro تولید میکند. گزینه -z norelro این ویژگی را غیرفعال میکند.
- -z sectionheader, -z nosectionheader
- گزینه -z nosectionheader به پیونددهنده دستور میدهد از درج سرآیند بخش صرفنظر کند. به طور پیشفرض، پیونددهنده از سرآیند بخش صرفنظر نمیکند.
- -z separate-loadable-segments, -z separate-code, -z noseparate-code
- اگر یک صفحه حافظه شامل چندین سگمنت باشد، بیتهای حفاظت از صفحه به گونهای تنظیم میشوند که ویژگیهای مورد نیاز (قابل نوشتن یا قابل اجرا) برای تمام سگمنتها برآورده شوند. این حالت معمولاً در مرز دو سگمنت با دو ویژگی متفاوت رخ میدهد.
- گزینه separate-loadable-segments بین سگمنتهایی با ویژگیهای متفاوت فاصلهگذاری (padding) اضافه میکند تا آنها یک صفحه مشترک نداشته باشند.
- گزینه separate-code فقط بین سگمنتهای قابل اجرا و غیرقابل اجرا فاصلهگذاری اضافه میکند. این حالت پیشفرض است.
- گزینه noseparate-code هیچ فاصلهگذاری بین سگمنتها اضافه نمیکند.
- -z defs, -z nodefs
- نمادهای تعریفنشده را گزارش میدهد (حتی با --shared).
- -z shstk
- پشته سایه (shadow stack) را با روشن کردن بیت GNU_PROPERTY_X86_FEATURE_1_SHSTK در بخش خروجی .note.gnu.property اعمال میکند. پشته سایه بخشی از فناوری اجرای جریان کنترل اینتل (CET) است که از Tiger Lake (سال ۲۰۲۰) در دسترس است.
- -z start_stop_visibility=[ hidden | protected ]
- اگر نام یک بخش به عنوان شناسه C معتبر باشد (یعنی با الگوی /^[_a-zA-Z][_a-zA-Z0-9]*$/ مطابقت داشته باشد)، پیونددهنده mold نمادهای __start_SECNAME و __stop_SECNAME را برای مشخص کردن ابتدا و انتهای بخش ایجاد میکند، که در آن SECNAME نام بخش است.
- میتوانید با ارسال -z start_stop_visibility=protected این نمادهای نشانهگذار را برای سایر ماژولهای ELF قابل مشاهده کنید. مقدار پیشفرض hidden است.
- -z text, -z notext, -z textoff
- پیونددهنده mold به طور پیشفرض اگر بازمکانیهای پویا در بخشهای فقطخواندنی ایجاد شوند، خطا گزارش میکند. اگر -z notext یا -z textoff داده شود، mold چنین بازمکانیهای پویایی را بدون گزارش خطا ایجاد میکند. گزینه -z text رفتار پیشفرض را بازمیگرداند.
- -z max-page-size=number
- برخی از معماریهای پردازنده از چندین اندازه صفحه حافظه پشتیبانی میکنند. این گزینه حداکثر اندازه صفحهای را مشخص میکند که یک باینری خروجی میتواند روی آن اجرا شود. به طور کلی، باینریهای ساختهشده برای اندازه صفحه بزرگتر میتوانند روی سیستمی با اندازه صفحه کوچکتر اجرا شوند، اما عکس آن ممکن نیست. مقدار پیشفرض ۴ کیلوبایت برای i386، x86-64 و RISC-V، و ۶۴ کیلوبایت برای ARM64 است.
- -z nodefaultlib
- باعث میشود بارگذار پویا مسیرهای جستجوی پیشفرض را نادیده بگیرد.
- -z nodelete
- ماژول DSO را به عنوان غیرقابل حذف در زمان اجرا علامتگذاری میکند.
- -z nodlopen
- ماژول DSO را برای dlopen(3) غیرقابل دسترس علامتگذاری میکند. این گزینه به پیونددهنده امکان میدهد با بازنویسی دستورالعملها برای برخی اهداف، دسترسی به متغیرهای محلی ریسمان را بهینهسازی کند.
- -z nodump
- ماژول DSO را برای dldump(3) غیرقابل دسترس علامتگذاری میکند.
- -z nocopyreloc
- بازمکانیهای رونوشت (copy relocations) ایجاد نمیکند.
- -z initfirst
- ماژول DSO را علامتگذاری میکند تا ابتدا در زمان اجرا مقداردهی اولیه شود.
- -z interpose
- شیء را علامتگذاری میکند تا بین همه DSOها به جز فایل اجرایی میانجیگری کند.
- -(, -), -EL, -Onumber, --dc, --dp, --end-group, --no-add-needed, --no-copy-dt-needed-entries, --nostdlib, --rpath-link=Ar dir, --sort-common, --sort-section, --start-group, --warn-constructors, --warn-once, --fix-cortex-a53-835769, --fix-cortex-a53-843419, -z combreloc, -z common-page-size, -z nocombreloc
- نادیده گرفته میشوند.
متغیرهای محیطی (ENVIRONMENT VARIABLES)
- MOLD_JOBS
- اگر این متغیر روی 1 تنظیم شود، در هر لحظه فقط یک فرایند mold اجرا خواهد شد. اگر یک فرایند جدید mold در حالی که فرایند دیگری فعال است شروع شود، فرایند جدید منتظر میماند تا فرایند فعال قبل از شروع تکمیل شود.
- دلیل اصلی این متغیر محیطی، به حداقل رساندن اوج مصرف حافظه است. از آنجا که mold برای کار با همزمانی بالا طراحی شده است، اجرای همزمان چندین نمونه mold ممکن است مفید نباشد. اگر N نمونه از mold را به طور همزمان اجرا کنید، ممکن است به N برابر زمان و N برابر حافظه نیاز داشته باشد. از سوی دیگر، اجرای آنها یکی پس از دیگری ممکن است همچنان N برابر بیشتر طول بکشد، اما اوج مصرف حافظه همانند اجرای یک نمونه منفرد خواهد بود.
- اگر سیستم ساخت شما چندین فرایند پیونددهنده را به طور همزمان فراخوانی میکند و برخی از آنها اغلب به دلیل خطای کمبود حافظه (OOM) متوقف میشوند، میتوانید این متغیر محیطی را روی 1 تنظیم کنید تا ببینید آیا مشکل OOM برطرف میشود یا خیر.
- در حال حاضر، هر مقداری به جز 1 در سکوت نادیده گرفته میشود.
- MOLD_DEBUG
- اگر این متغیر روی یک رشته غیرخالی تنظیم شود، mold گزینههای خط فرمان خود را در بخش .comment فایل خروجی جاسازی میکند.
- MOLD_REPRO
- تنظیم این متغیر روی یک رشته غیرخالی همان اثر ارسال گزینه --repro را دارد.
همچنین ببینید (SEE ALSO)
gold(1), ld(1), elf(5), ld.so(8)
نویسنده (AUTHOR)
Rui Ueyama ruiu@cs.stanford.edu
اشکالات (BUGS)
گزارش اشکالات را به https://github.com/rui314/mold/issues ارسال کنید.
| August 2026 |