| LD.LLD(1) | General Commands Manual | LD.LLD(1) |
نام (NAME)
ld.lld —
پیونددهنده
ELF از پروژه
LLVM
خلاصه دستور (SYNOPSIS)
ld.lld [options]
objfile ...
توضیحات (DESCRIPTION)
یک پیونددهنده یک یا چند فایل شیء (object)، آرشیو و کتابخانه را دریافت کرده و آنها را در یک فایل خروجی (یک فایل اجرایی، یک کتابخانه اشتراکی یا یک فایل شیء دیگر) ترکیب میکند. این ابزار کدها و دادهها را از فایلهای ورودی بازنشانی (relocate) کرده و ارجاعات نمادها میان آنها را حلوفصل میکند.
ld.lld
جایگزینی
مستقیم
برای
پیونددهندههای
GNU BFD و gold است. این
ابزار
بیشتر
آرگومانهای
خط فرمان و
اسکریپتهای
پیونددهنده
مشابه
پیونددهندههای
GNU را
میپذیرد.
ld.lld در
حال حاضر از
مقصدهای
i386، x86-64، ARM،
AArch64، LoongArch، PowerPC32،
PowerPC64، MIPS32، MIPS64،
RISC-V، AMDGPU، Hexagon و SPARC V9
پشتیبانی
میکند.
ld.lld اگر
بهصورت
lld-link
فراخوانی
شود مانند
پیونددهندهای
سازگار با link.exe
مایکروسافت
عمل میکند
و اگر
بهصورت
ld.ld64
فراخوانی
شود مانند ld
در macOS عمل
میکند.
صرفنظر از
اینکه ld.lld
چگونه
ساخته شده
باشد،
تمامی این
مقصدها
همیشه
پشتیبانی
میشوند؛
بنابراین
همیشه
میتوانید
از ld.lld هم
بهعنوان
پیونددهنده
بومی (native) و هم
پیونددهنده
متقاطع (cross linker)
استفاده
کنید.
گزینهها (OPTIONS)
بسیاری از
گزینهها
دارای هر دو
شکل
تکحرفی و
بلند هستند.
هنگام
استفاده از
شکل بلند،
گزینههایی
بهجز
مواردی که
با حرف o
آغاز
میشوند را
میتوان با
یک یا دو خط
تیره پیش از
نام گزینه
مشخص کرد.
گزینههای
بلندی که با
o شروع
میشوند،
برای
جلوگیری از
اشتباه
گرفته شدن
با گزینهٔ
-o path به
دو خط تیره
نیاز
دارند.
--allow-multiple-definition- در صورت تعریف چندبارهٔ یک نماد، خطایی صادر نشود. از اولین تعریف استفاده خواهد شد.
--allow-shlib-undefined- اجازه دادن به ارجاعات حلنشده در کتابخانههای اشتراکی. این گزینه هنگام پیوند دادن یک کتابخانه اشتراکی بهطور پیشفرض فعال است.
--apply-dynamic-relocs- اعمال مقادیر زمان پیوند برای بازنشانیهای پویا.
--as-needed- تنظیم
DT_NEEDEDبرای کتابخانههای اشتراکی، تنها در صورت استفاده از آنها. --auxiliary=value- تنظیم فیلد
DT_AUXILIARYبه نام مشخصشده. --Bdynamic,--dy- پیوند با کتابخانههای اشتراکی.
--Bstatic,--static,--dn- عدم پیوند با کتابخانههای اشتراکی.
-Bno-symbolic- عدم
مقیدسازی
محلی
نمادهای
تعریفشده
با نمایانی
پیشفرض
برای
-shared(پیشفرض). -Bsymbolic- مقیدسازی
محلی
نمادهای
تعریفشده
با نمایانی
پیشفرض
برای
-shared. همچنین پرچمDF_SYMBOLICرا تنظیم میکند. -Bsymbolic-non-weak- مقیدسازی
محلی
نمادهای STB_GLOBAL
تعریفشده
با نمایانی
پیشفرض
برای
-shared. -Bsymbolic-functions- مقیدسازی
محلی
نمادهای
توابع
تعریفشده
با نمایانی
پیشفرض
برای
-shared. -Bsymbolic-non-weak-functions- مقیدسازی
محلی
نمادهای
توابع STB_GLOBAL
تعریفشده
با نمایانی
پیشفرض
برای
-shared. --be8- نوشتن یک فایل ELF با ترتیب بایت بزرگ (Big Endian) با استفاده از قالب BE8 (فقط در AArch32).
--branch-to-branch- فعالسازی
بهینهسازیهای
پرش به پرش:
دستوری که
مقصد آن یک
دستور پرش
دیگر است
بازنویسی
میشود تا
مستقیماً
به مقصد پرش
دوم اشاره
کند (تنها
در AArch64 و X86_64).
بهطور
پیشفرض در
-O2فعال است. --build-id=value- تولید یک
یادداشت
شناسه ساخت
(build ID note). value
میتواند
یکی از
موارد
fast ،md5 ،sha1 ،tree ،uuid ،0xhex-string وnoneباشد.treeنام مستعاری برایsha1است. شناسههای ساخت از نوعfast ،md5 ،sha1وtreeاز محتوای شیء محاسبه میشوند.fastبرای امنیت از نظر رمزنگاری در نظر گرفته نشده است. --build-id- مترادفی
برای
--build-id=sha1. --call-graph-profile-sort=algorithm- algorithm میتواند موارد زیر باشد:
--color-diagnostics=value- استفاده از
رنگها در
پیامهای
عیبیابی.
value
میتواند
یکی از
مقادیر
always ،autoوneverباشد.autoرنگها را تنها در صورتی فعال میکند که خروجی به ترمینال فرستاده شود. --color-diagnostics- نام
مستعاری
برای
--color-diagnostics=auto. --compress-debug-sections=value- فشردهسازی
بخشهای
اشکالزدایی
DWARF. اگر
محتوای
فشردهشده
بزرگتر
شود،
بخشها
بدون
فشردهسازی
باقی
میمانند.
valueمیتواند مقادیر زیر باشد: --compress-sections=section-glob={none,zlib,zstd}[:level]- فشردهسازی
بخشهای
خروجی که با
glob مطابقت
دارند و
فاقد پرچم
SHF_ALLOC هستند.
اگر محتوای
فشردهشده
بزرگتر
شود،
بخشهای
منطبق بدون
فشردهسازی
باقی
میمانند.
سطح
فشردهسازی
برابر با
level(در صورت مشخص شدن) یا سطح پیشفرض متمرکز بر سرعت است. این گزینه مشابه حالت تعمیمیافتهٔ--compress-debug-sectionsاست. --cref- خروجی دادن
جدول ارجاع
متقابل. در
صورت مشخص
شدن
-Map، در فایل نگاشت (map file) چاپ میشود. --debug-names- تولید یک
بخش
ادغامشدهٔ
.debug_names. --default-script=file,-dTfile- در صورت عدم
وجود
--script، این اسکریپت پیونددهنده پیشفرض خوانده شود. --defsym=symbol=expression- تعریف یک
نام مستعار
برای نماد.
expression
میتواند
نمادی دیگر
یا یک عبارت
اسکریپت
پیونددهنده
باشد. برای
نمونه،
‘
--defsym=foo=bar’ یا ‘--defsym=foo=bar+0x100’. --demangle- برگرداندن نام نمادها به شکل اولیه (Demangle).
- غیرفعال کردن برچسبهای پویای جدید.
--discard-all,-x- حذف تمام نمادهای محلی.
--discard-locals,-X- حذف نمادهای محلی موقت.
--discard-none- نگهداشتن تمام نمادها در جدول نمادها.
--dynamic-linker=value- مشخص کردن
پیونددهنده
پویایی که
برای یک
فایل
اجرایی با
پیوند پویا
باید
استفاده
شود. این
مقدار در یک
سگمنت ELF از
نوع
PT_INTERPثبت میشود. --dynamic-list=file- مشابه با
--export-dynamic-symbol-list. هنگام ایجاد یک شیء اشتراکی، متضمن-Bsymbolicاست، اما DF_SYMBOLIC را تنظیم نمیکند. --EB- انتخاب قالب ترتیب بایت بزرگ در دستور OUTPUT_FORMAT.
--EL- انتخاب قالب ترتیب بایت کوچک در دستور OUTPUT_FORMAT.
--eh-frame-hdr- درخواست
ایجاد بخش
.eh_frame_hdrو سرآیند سگمنتPT_GNU_EH_FRAME. --emit-relocs,-q- تولید بازنشانیها در خروجی.
- فعال کردن برچسبهای پویای جدید.
--enable-non-contiguous-regions- سرریز کردن بخشهای ورودی به بخشهای خروجی منطبق بعدی برای جلوگیری از سرریز ناحیه حافظه.
--end-lib- پایان دادن به گروهبندی اشیائی که باید طوری در نظر گرفته شوند که گویی با هم در یک آرشیو هستند.
--entry=entry- نام نماد نقطه ورود.
--error-limit=value- حداکثر تعداد خطاهایی که پیش از توقف نمایش داده میشوند. مقدار صفر نشاندهنده نامحدود بودن است.
--error-unresolved-symbols- گزارش کردن نمادهای حلنشده به عنوان خطا.
--error-handing-script=script_path- فراخوانی
اسکریپت
script_path در
صورت بروز
خطا، با
tag به
عنوان
آرگومان
نخست و یک
پارامتر
اضافی به
عنوان
آرگومان
دوم. انتظار
میرود
اسکریپت در
صورت
موفقیت 0 را
برگرداند.
هر مقدار
دیگری به
عنوان یک
خطای عمومی
در نظر
گرفته
میشود..Ar tag
میتواند
missing-libبه همراه نام کتابخانهٔ مفقود، یاundefined-symbolبه همراه نام نماد تعریفنشده باشد. --execute-only- بخشهای قابلاجرا را به عنوان غیرقابلخواندن علامتگذاری میکند. این گزینه در حال حاضر تنها روی AArch64 پشتیبانی میشود.
--exclude-libs=value- کتابخانههای ایستا را از برونریزی خودکار مستثنی میکند.
--export-dynamic,-E- نمادها را در جدول نمادهای پویا قرار میدهد.
--export-dynamic-symbol=glob- (فایل
اجرایی)
نمادهای
تعریفشدهٔ
غیرمحلی
منطبق را در
جدول
نمادهای
پویا قرار
میدهد.
(شیء
اشتراکی)
ارجاعات به
نمادهای STV_DEFAULT
غیرمحلی
منطبق
نباید به
تعاریف
درون شیء
اشتراکی
مقید شوند،
حتی اگر در
غیر این
صورت به
دلیل
-Bsymbolic،-Bsymbolic-functionsیا--dynamic-listچنین میشدند. --export-dynamic-symbol-list=file- فهرستی از
الگوهای
نمادهای
پویا را از
file
میخواند.
--export-dynamic-symbolرا روی هر الگو اعمال میکند. --fatal-warnings- با هشدارها مانند خطا رفتار میکند.
--filter=value,-Fvalue- فیلد
DT_FILTERرا به مقدار مشخصشده تنظیم میکند. --fini=symbol- یک تابع نهاییساز (finalizer) را مشخص میکند.
--force-group-allocation- تنها برای -r معنادار است. گروههای بخش دور ریخته میشوند. اگر دو عضو یک گروه بخش در بخش خروجی یکسانی قرار گیرند، بازنشانیهای (relocations) آنها را نیز ترکیب میکند.
--format=input-format,-binput-format- قالب
ورودیهای
پس از این
گزینه را
مشخص
میکند.
input-format
میتواند
یکی از
binary ،elfیاdefaultباشد.defaultمترادفی برایelfاست. --gc-sections- جمعآوری زبالهٔ (garbage collection) بخشهای استفادهنشده را فعال میکند.
--gdb-index- بخش
.gdb_indexرا تولید میکند. --hash-style=value- سبک
درهمسازی
(hash style) را مشخص
میکند.
value
میتواند
sysv ،gnuیاbothباشد.bothپیشفرض است. --help- پیام راهنما را چاپ میکند.
--icf=all- تا کردن کدهای یکسان (identical code folding) را فعال میکند.
--icf=safe- تا کردن ایمن کدهای یکسان را فعال میکند.
--icf=none- تا کردن کدهای یکسان را غیرفعال میکند.
--ignore-data-address-equality- برابری نشانی دادهها را نادیده میگیرد. در C/C++ الزامی است که هر داده نشانی یکتایی داشته باشد. این گزینه به lld اجازه میدهد بهینهسازی ناامنی را انجام دهد که این الزام را نقض میکند: ایجاد کپی از دادههای فقطخواندنی، یا ادغام دو یا چند دادهٔ فقطخواندنی که اتفاقاً مقادیر یکسانی دارند.
--ignore-function-address-equality- برابری نشانی توابع را نادیده میگیرد. این گزینه فراخوانیهای غیر-PIC به تابعی با نمایانی غیرپیشفرض در یک شیء اشتراکی را مجاز میداند. تابع ممکن است در فایل اجرایی و در شیء اشتراکی نشانیهای متفاوتی داشته باشد.
--image-base=value- نشانی پایه را به value تنظیم میکند.
--init=symbol- یک تابع مقداردهی اولیه (initializer) را مشخص میکند.
--keep-unique=symbol- نماد symbol را در طول ICF تا نمیکند.
-llibName,--library=libName- نام اصلی کتابخانه برای استفاده.
-Ldir,--library-path=dir- یک دایرکتوری به مسیر جستجوی کتابخانه اضافه میکند.
--lto-aa-pipeline=value- خطلولهٔ AA
برای اجرا
در حین LTO. در
ترکیب با
--lto-newpm-passesاستفاده میشود. --lto-newpm-passes=value- گذرها (passes) برای اجرا در حین LTO.
--lto-Oopt-level- سطح بهینهسازی برای LTO.
--lto-partitions=value- تعداد بخشهای تولید کد (codegen) در LTO.
-mvalue- شبیهسازی هدف را تعیین میکند.
--Map=file,-Mfile- نگاشت پیوند (link map) را در file چاپ میکند.
--nmagic,-n- بخشها را همتراز با صفحه نمیکند، پیوند را با کتابخانههای ایستا انجام میدهد.
--no-allow-shlib-undefined- ارجاعات حلنشده در کتابخانههای اشتراکی را مجاز نمیداند. این گزینه به طور پیشفرض هنگام پیوند دادن یک فایل اجرایی فعال است.
--no-as-needed- همواره
DT_NEEDEDرا برای کتابخانههای اشتراکی تنظیم میکند. --no-color-diagnostics- از رنگها در پیامهای عیبیابی استفاده نمیکند.
--no-demangle- نامهای نمادها را رمزگشایی (demangle) نمیکند.
--no-dynamic-linker- از خروجی
دادن بخش
.interpجلوگیری میکند. --no-fortran-common- اعضای آرشیو را برای تعاریفی که نمادهای COMMON را بازنویسی میکنند جستجو نمیکند.
--no-gc-sections- جمعآوری زبالهٔ بخشهای استفادهنشده را غیرفعال میکند.
--no-gnu-unique- اتصال نماد STB_GNU_UNIQUE را غیرفعال میکند.
--no-merge-exidx-entries- ادغام مدخلهای .ARM.exidx را غیرفعال میکند.
--no-nmagic- بخشها را همتراز با صفحه میکند.
--no-omagic- بخشهای کد و داده را به صورت قابلنوشتن تنظیم نمیکند، و بخشها را همتراز با صفحه قرار میدهد.
--no-relax- تعدیلهای (relaxations) وابسته به معماری هدف را غیرفعال میکند. برای x86-64 این گزینه بهینهسازیهای GOT با R_X86_64_GOTPCRELX و R_X86_64_REX_GOTPCRELX را غیرفعال میکند.
--no-rosegment- بخشهای فقطخواندنی غیرقابلاجرا را در قطعهٔ (segment) جداگانهٔ خود قرار نمیدهد.
--undefined-version- اسکریپتهای نسخهای را که به نمادهای تعریفنشده ارجاع میدهند گزارش نمیکند.
--no-undefined- نمادهای حلنشده را حتی در صورت ساخت یک شیء اشتراکی توسط پیونددهنده گزارش میکند.
--no-warn-mismatch- انواع بخشهای ناشناخته را رد نمیکند.
--no-warn-symbol-ordering- در مورد مشکلات فایل مرتبسازی نمادها یا پروفایل گراف فراخوانی هشداری صادر نمیکند.
--no-warnings,-w- هشدارها را
فرومینشاند
و
--fatal-warningsرا لغو میکند. --no-whole-archive- رفتار پیشفرض بارگذاری اعضای آرشیو را بازیابی میکند.
--no-pie,--no-pic-executable- یک فایل اجرایی مستقل از موقعیت (PIE) ایجاد نمیکند.
--noinhibit-exec- فایل خروجی اجرایی را تا زمانی که همچنان قابل استفاده باشد نگه میدارد.
--nostdlib- تنها دایرکتوریهای مشخصشده در خط فرمان را جستجو میکند.
-opath- فایل
اجرایی،
کتابخانه
یا شیء
خروجی را در
path
مینویسد.
در صورت عدم
تعیین،
a.outبهعنوان پیشفرض استفاده میشود. -Ovalue- فایل خروجی
را
بهینهسازی
میکند.
value
میتواند
مقادیر زیر
باشد:
0- ادغام رشتهها را غیرفعال میکند.
1- ادغام رشتهها را فعال میکند.
2- ادغام
انتهای
رشتهها (string tail
merging) و
بهینهسازی
شاخه-به-شاخه
را فعال
میکند.
حالت
پیشفرض
-O1است. --oformat=format- قالب فایل
شیء خروجی
را مشخص
میکند.
تنها format
پشتیبانیشده
binaryاست، که خروجی را بدون سرآیند ELF تولید میکند. --omagic,-N- بخشهای text و data را خواندنی و نوشتنی تنظیم میکند، بخشها را همتراز صفحه (page align) نمیکند، و پیوند را در برابر کتابخانههای ایستا انجام میدهد.
--opt-remarks-filenamefile- ملاحظات بهینهسازی را در قالب YAML درون file مینویسد.
--opt-remarks-passespass-regex- ملاحظات بهینهسازی را فقط با مجاز کردن گذرهایی (passes) که با pass-regex تطابق دارند، پالایش میکند.
--opt-remarks-with-hotness- اطلاعات بسامد اجرا (hotness) را در فایل ملاحظات بهینهسازی میگنجاند.
--orphan-handling=mode- نحوه
مدیریت
بخشهای
یتیم (orphan sections) را
کنترل
میکند.
بخش یتیم
بخشی است
که بهطور
مشخص در
اسکریپت
پیوندساز
ذکر نشده
باشد. mode
میتواند
یکی از
موارد زیر
باشد:
place- قرار دادن بخشهای یتیم در بخشهای خروجی مناسب.
warn- قرار دادن
بخشهای
یتیم
مانند
placeو همچنین گزارش دادن یک هشدار. error- قرار دادن
بخشهای
یتیم
مانند
placeو همچنین گزارش دادن یک خطا.
placeحالت پیشفرض است. --pack-dyn-relocs=format- بستهبندی
بازنشانیهای
پویا در
قالب
ارائهشده.
format
میتواند
یکی از
موارد زیر
باشد:
none- بستهبندی نشود. بازنشانیهای پویا در SHT_REL(A) کدگذاری میشوند.
android- بستهبندی بازنشانیهای پویا در SHT_ANDROID_REL(A).
relr- بستهبندی بازنشانیهای نسبی در SHT_RELR و مابقی بازنشانیهای پویا در SHT_REL(A).
android+relr- بستهبندی بازنشانیهای نسبی در SHT_RELR و مابقی بازنشانیهای پویا در SHT_ANDROID_REL(A).
noneحالت پیشفرض است. اگر--use-android-relr-tagsمشخص شده باشد، بهجای SHT_RELR از SHT_ANDROID_RELR استفاده میشود. --package-metadata- درج یک
رشته با
کدگذاری
درصدی (percent-encoded)
در بخش
.note.package. به عنوان مثال، %25 به یک % تنها رمزگشایی میشود. --pic-veneer- همیشه thunkهای مستقل از موقعیت تولید میکند.
--pie,--pic-executable- یک فایل اجرایی مستقل از موقعیت (position independent executable) ایجاد میکند.
--power10-stubs=mode- تعیین استفاده از دستورالعملهای Power10 در کالاستابها (call stubs) برای R_PPC64_REL24_NOTOC و تعاملپذیری TOC/NOTOC. mode میتواند یکی از موارد زیر باشد:
--print-gc-sections- فهرست کردن بخشهای بلااستفادهٔ حذفشده.
--print-gc-sections=file- فهرست کردن بخشهای بلااستفادهٔ حذفشده در فایل مشخصشده.
--print-icf-sections- فهرست کردن بخشهای تاخوردهٔ یکسان (identical folded sections).
--print-map- چاپ نقشه پیوند در خروجی استاندارد.
--print-archive-stats=file- نوشتن آمار استفاده از بایگانی در فایل مشخصشده. تعداد اعضا و اعضای واکشیشده را برای هر بایگانی چاپ میکند.
--push-state- ذخیره
وضعیت
فعلی
--as-needed,--static, و--whole-archive. --pop-state- بازیابی
وضعیتهای
ذخیرهشده
توسط
--push-state. --randomize-section-padding=seed- درج
فاصلهگذاری
(padding) تصادفی
بین
بخشهای
ورودی و در
ابتدای هر
سگمنت با
استفاده
از seed
مشخصشده.
فاصلهگذاری
در
بخشهای
خروجی با
نامهای
منطبق بر
الگوهای
زیر درج
میشود:
.bss,.data,.data.rel.ro,.lbss,.ldata,.lrodata,.ltext,.rodataو.text*. ---relax-gp- فعالسازی کاهش اشارهگر سراسری (global pointer relaxation) برای RISC-V.
--relocatable,-r- ایجاد فایل شیء با قابلیت بازنشانی.
--remap-inputs=from-glob=to-file- فایلهای
ورودی
منطبق بر
from-globبهto-fileنگاشت میشوند. برای نادیده گرفتن یک فایل ورودی از/dev/nullاستفاده کنید. --remap-inputs-file=file- نگاشت
مجدد
فایلهای
ورودی بر
اساس
الگوهای
موجود در
file. هر خط
در فایل
نگاشت
مجدد در
قالب
from-glob=to-fileیا یک توضیح است که با#آغاز میشود. --reproduce=path- یک فایل tar درون path مینویسد، که شامل تمام فایلهای ورودی لازم برای بازتولید پیوند، یک فایل متنی با نام response.txt شامل گزینههای خط فرمان، و یک فایل متنی با نام version.txt شامل خروجی ld.lld --version است. این بایگانی پس از استخراج، میتواند برای اجرای دوباره پیوندساز با همان گزینهها و فایلهای ورودی استفاده شود.
--retain-symbols-file=file- تنها نمادهای فهرستشده در فایل را نگه میدارد.
--rpath=value,-Rvalue- افزودن یک
DT_RUNPATHبه خروجی. --rsp-quoting=value- سبک
نقلقول
برای
فایلهای
پاسخ.
مقدارهای
پشتیبانیشده
windowsوposixهستند. --script=file,-Tfile- خواندن اسکریپت پیوندساز از file. در صورت ارائه چندین اسکریپت پیوندساز، آنها بهگونهای پردازش میشوند که گویی به ترتیبی که در خط فرمان ظاهر شدهاند، به یکدیگر متصل شدهاند.
--section-start=section=address- تنظیم نشانی بخش.
- ساخت یک شیء مشترک (shared object).
--shuffle-sections=seed- بُر زدن بخشهای منطبق با استفاده از seed مشخصشده پیش از نگاشت آنها به بخشهای خروجی. اگر -1 باشد، ترتیب بخشها معکوس میشود. اگر 0 باشد، از یک seed تصادفی استفاده میشود.
--soname=value,-hvalue- تنظیم
DT_SONAMEبه value. --sort-common- این گزینه برای سازگاری با GNU نادیده گرفته میشود.
--sort-section=value- قاعده مرتبسازی بخشها را هنگام استفاده از linkerscript مشخص میکند.
--start-lib- آغاز دستهبندی از اشیاء که باید همانند قرار داشتن در یک بایگانی رفتار شوند.
--strip-all,-s- حذف تمام
نمادها.
بهمعنای
اعمال
--strip-debugنیز هست. --strip-debug,-S- حذف اطلاعات اشکالزدایی.
--symbol-ordering-file=file- چیدمان بخشها به ترتیبی که توسط file مشخص شده است.
--sysroot=value- تنظیم ریشه سیستم.
--target1-abs- تفسیر
R_ARM_TARGET1بهعنوانR_ARM_ABS32. --target1-rel- تفسیر
R_ARM_TARGET1بهعنوانR_ARM_REL32. --target2=type- تفسیر
R_ARM_TARGET2بهعنوان type, که در آن type یکی از مقادیرrel,abs, یاgot-relاست. --Tbss=value- مشابه با
--section-startبا.bssبهعنوان نام بخش. --Tdata=value- مشابه با
--section-startبا.dataبهعنوان نام بخش. --Ttext=value- مشابه با
--section-startبا.textبهعنوان نام بخش. --thinlto-cache-dir=value- مسیر به دایرکتوری فایلهای شیء حافظهپنهان ThinLTO.
--thinlto-cache-policy=value- سیاست هرس کردن برای حافظهپنهان ThinLTO.
--thinlto-jobs=value- تعداد کارهای ThinLTO.
--threads=N- تعداد
رشتهها.
مقدار
all(پیشفرض) به معنی تمام رشتههای همروندِ پشتیبانیشده است.1چندرشتهای بودن را غیرفعال میکند. --fat-lto-objects- استفاده از بخش .llvm.lto، که حاوی بیتکد LLVM است، در فایلهای شیء fat LTO برای انجام LTO..It Fl -no-fat-lto-objects بخش .llvm.lto در فایلهای شیء قابل بازنشانی (relocatable) نادیده گرفته میشود (پیشفرض).
--time-trace- ثبت ردگیری زمانی (time trace).
--time-trace-file=file- نوشتن خروجی ردگیری زمانی در file.
--time-trace-granularity=value- حداقل دانهبندی زمان (به میکروثانیه) که توسط پروفایلر زمانی ردگیری میشود.
--trace- چاپ نام فایلهای ورودی.
--trace-symbol=symbol,-ysymbol- ردگیری ارجاعها به symbol.
--undefined=symbol,-usymbol- اگر symbol پس از تفکیک نمادها تعریف نشده باشد، و کتابخانهای ایستا وجود داشته باشد که شامل یک فایل شیء تعریفکنندهٔ این نماد باشد، آن عضو بارگذاری میشود تا فایل شیء در فایل خروجی گنجانده شود.
--undefined-glob=pattern- مترادفی
برای
--undefined-،با این تفاوت که یک الگوی glob میپذیرد. در یک الگوی glob،*با صفر یا چند نویسه، ? با هر نویسهٔ تکی، و[...]با نویسههای درون قلابها تطابق مییابد. تمام نمادهایی که با یک الگوی دادهشده مطابقت داشته باشند طوری مدیریت میشوند که گویی به عنوان آرگومانهای--undefinedداده شدهاند. --unique- یک بخش خروجی جداگانه برای هر بخش ورودی یتیم (orphan) ایجاد میکند.
--unresolved-symbols=value- تعیین
نحوهٔ
مدیریت
نمادهای
حلنشده (unresolved).
value
میتواند
یکی از
مقادیر
زیر باشد:
report-all- گزارش نمادهای حلنشده (پیشفرض).
ignore-in-object-files- فقط نمادهای حلنشدهٔ موجود در کتابخانههای مشترک گزارش شوند.
- فقط نمادهای حلنشدهٔ موجود در فایلهای شیء گزارش شوند.
ignore-all- نمادهای حلنشده گزارش نشوند.
- استفاده از برچسبهای SHT_ANDROID_RELR / DT_ANDROID_RELR* به جای SHT_RELR / DT_RELR*.
-v,-V- نمایش شماره نسخه و ادامهٔ روند پیوند در صورتی که فایلهای شیء مشخص شده باشند.
--version- نمایش شماره نسخه و خروج.
--verbose- حالت پرگو (verbose).
--version-script=file- خواندن اسکریپت نسخه از file.
--warn-backrefs- هشدار دربارهٔ وابستگیهای معکوس یا چرخهای به یا بین آرشیوهای ایستا. این گزینه میتواند برای اطمینان از حفظ سازگاری فراخوانی پیونددهنده با پیونددهندههای سنتی شبهیونیکس استفاده شود.
--warn-backrefs-exclude=glob- الگوی glob
توصیفکنندهٔ
یک آرشیو
(یا یک فایل
شیء درون --start-lib)
که باید
برای
--warn-backrefsنادیده گرفته شود. --warn-common- هشدار دربارهٔ نمادهای مشترک (common symbols) تکراری.
--warn-ifunc-textrel- هشدار دربارهٔ استفاده از نمادهای ifunc در ترکیب با بازنشانیهای متن (text relocations). نسخههای قدیمیتر کتابخانهٔ glibc (نسخهٔ ۲.۲۸ و پیش از آن) دارای باگی هستند که باعث میشود قطعهای که شامل نمادهای ifunc است، هنگام بازنشانی به عنوان غیرقابلاجرا علامتگذاری شود. در نتیجه، هرچند برنامه با موفقیت کامپایل و پیوند داده میشود، اما هنگامی که اشارهگر دستورالعمل به یک نماد ifunc میرسد خطای segmentation fault رخ میدهد. از -warn-ifunc-textrel استفاده کنید تا اگر کد ممکن است شامل نمادهای ifunc باشد، بازنشانیهای متن انجام دهد و با نسخهٔ قدیمیتر glibc پیوند داده شود، lld هشدار دهد. در غیر این صورت، نیازی به استفاده از آن نیست، زیرا مقدار پیشفرض هشداری نمیدهد. این پرچم در اواخر سال ۲۰۱۸ معرفی شد، معادلی در پیونددهندههای ld و gold ندارد، و ممکن است در آینده حذف شود.
--warn-unresolved-symbols- گزارش نمادهای حلنشده به عنوان هشدار.
--whole-archive- اجبار به بارگذاری تمام اعضا در یک کتابخانهٔ ایستا.
--why-extract=file- چاپ دلیل استخراج اعضای آرشیو در یک فایل.
--why-live=glob- گزارش زنجیرهای از ارجاعها که مانع از جمعآوری زباله (garbage collection) برای هر نماد منطبق با glob میشوند.
--wrap=symbol- تغییر مسیر ارجاعهای symbol به __wrap_symbol و ارجاعهای __real_symbol به symbol.
-zoption- افزونههای
گزینههای
پیونددهنده.
dead-reloc-in-nonalloc=section_glob=value- حل یک بازنشانی در یک بخش غیر SHF_ALLOC تطبیقیافته که به یک نماد دور ریختهشده ارجاع دارد، به value الگوهای glob را میپذیرد؛ در صورتی که یک بخش با بیش از یک گزینه مطابقت داشته باشد، آخرین گزینه اولویت دارد. ترتیبی از تطابق با کمترین ویژگی به بیشترین ویژگی توصیه میشود.
execstack- قابلاجرا
کردن
پشتهٔ
اصلی (main stack).
مجوزهای
پشته در
قطعهٔ
PT_GNU_STACKثبت میشوند. bti-report=[none|warning|error]- تعیین
نحوهٔ
گزارش
ویژگی
مفقود
GNU_PROPERTY_AARCH64_FEATURE_1_BTI.
noneپیشفرض است؛ پیونددهنده ویژگی مفقود را گزارش نمیکند، در غیر این صورت به عنوان یک هشدار یا یک خطا گزارش خواهد شد. cet-report=[none|warning|error]- تعیین
نحوهٔ
گزارش
ویژگیهای
مفقود
GNU_PROPERTY_X86_FEATURE_1_IBT یا
GNU_PROPERTY_X86_FEATURE_1_SHSTK.
noneپیشفرض است؛ پیونددهنده ویژگی مفقود را گزارش نمیکند، در غیر این صورت به عنوان یک هشدار یا یک خطا گزارش خواهد شد. gcs-report=[none|warning|error]- تعیین
نحوهٔ
گزارش
ویژگی
مفقود
GNU_PROPERTY_AARCH64_FEATURE_1_GCS. ویژگی GNU_PROPERTY_AARCH64_FEATURE_1_GCS نشاندهندهٔ پشتیبانی فایل شیء از قابلیت امنیتی Guarded Control Stack است.noneپیشفرض است؛ پیونددهنده ویژگی مفقود را گزارش نمیکند، در غیر این صورت به عنوان یک هشدار یا یک خطا گزارش خواهد شد. dynamic-undefined-weak- پویا کردن
نمادهای
ضعیف (weak)
تعریفنشده
در صورت
وجود جدول
نمادهای
پویا، در
صورتی که
از
فایلهای
شیء قابل
بازنشانی
به آنها
ارجاع
داده شده
باشد و با
دیداریپذیری
نماد یا
نسخهبندی
به حالت
محلی
محدود
نشده
باشند. در
صورت مشخص
شدن
nodynamic-undefined-weakآنها را پویا نکنید.dynamic-undefined-weakهنگام ساخت یک شیء مشترک (shared object)، یا زمانی که یک شیء مشترک ورودی وجود دارد، حالت پیشفرض است. pauth-report=[none|warning|error]- تعیین
نحوهٔ
گزارش
ویژگی
مفقود
GNU_PROPERTY_AARCH64_FEATURE_PAUTH.
noneپیشفرض است؛ پیونددهنده ویژگی مفقود را گزارش نمیکند، در غیر این صورت به عنوان یک هشدار یا یک خطا گزارش خواهد شد. force-bti- فعالسازی اجباری دستورالعمل BTI مربوط به AArch64 در PLT؛ اگر فایل ELF ورودی فاقد ویژگی GNU_PROPERTY_AARCH64_FEATURE_1_BTI باشد، هشدار میدهد.
force-ibt- فعالسازی اجباری Intel Indirect Branch Tracking در PLT؛ اگر یک فایل ELF ورودی فاقد ویژگی GNU_PROPERTY_X86_FEATURE_1_IBT باشد، هشدار میدهد.
global- تنظیم
پرچم
DF_1_GLOBALدر بخشDYNAMIC. بارگذارهای مختلف میتوانند به خودی خود نحوهٔ مدیریت این پرچم را تعیین کنند. ifunc-noplt- تولید
نکردن
مدخلهای
PLT برای
نمادهای ifunc.
در عوض،
بازنشانیهای
متنی
ارجاعدهنده
به resolver ایجاد
میشوند.
این یک
بهینهسازی
آزمایشی
است و تنها
برای
محیطهای
مستقل (standalone)
مناسب است
که در
آنها
بازنشانیهای
متن معایب
معمول را
ندارند.
این گزینه
باید با
گزینهٔ
-znotextترکیب شود. initfirst- تنظیم
پرچم
DF_1_INITFIRSTبرای نشان دادن اینکه پودمان (module) باید ابتدا مقداردهی اولیه شود. interpose- تنظیم
پرچم
DF_1_INTERPOSEبرای نشان دادن به پیونددهندهٔ زمان اجرا مبنی بر اینکه شیء یک interposer است. در هنگام تفکیک نمادها، interposerها پس از برنامه اما پیش از سایر وابستگیها جستجو میشوند..Pp lrodata-after-bss- قرار دادن .lrodata پس از .bss.
muldefs- در صورت
تعریف
چندبارهٔ
یک نماد،
خطایی
صادر نشود.
نخستین
تعریف
استفاده
خواهد شد.
این گزینه
مترادفی
برای
--allow-multiple-definitionاست. nocombreloc- غیرفعالسازی ترکیب و مرتبسازی چندین بخش بازآرایی (relocation).
nocopyreloc- غیرفعالسازی ایجاد بازآراییهای کپی (copy relocations).
nodefaultlib- تنظیم
پرچم
DF_1_NODEFLIBبرای مشخص ساختن اینکه مسیرهای پیشفرض جستجوی کتابخانه باید نادیده گرفته شوند. nodelete- تنظیم
پرچم
DF_1_NODELETEبرای مشخص ساختن اینکه شیء نباید از یک فرایند تخلیه شود. nodlopen- تنظیم
پرچم
DF_1_NOOPENبرای مشخص ساختن اینکه شیء نباید توسط dlopen(3) باز شود. nognustack- عدم صدور
قطعهٔ
PT_GNU_STACK. norelro- عدم
مشخصسازی
اینکه
بخشهایی
از شیء
باید پس از
پردازش
اولیهٔ
بازآرایی،
به صورت
فقطخواندنی
نگاشت
شوند. شیء
از درج
قطعهٔ
PT_GNU_RELROصرفنظر خواهد کرد. nosectionheader- عدم تولید جدول سرآیند بخشها (section header table).
notext- مجاز
دانستن
بازآراییها
بر روی
قطعههای
فقطخواندنی.
پرچم
DT_TEXTRELرا در بخشDYNAMICتنظیم میکند. now- تنظیم
پرچم
DF_BIND_NOWبرای مشخص ساختن اینکه بارگذار زمان اجرا (run-time loader) باید تمام پردازش بازآرایی را به عنوان بخشی از مقداردهی اولیهٔ شیء انجام دهد. به طور پیشفرض، بازآراییها ممکن است برحسب تقاضا انجام شوند. origin- تنظیم
پرچم
DF_ORIGINبرای مشخص ساختن اینکه شیء نیازمند پردازش $ORIGIN است. pac-plt- تنها در AArch64، استفاده از احراز هویت اشارهگر در PLT.
pack-relative-relocs- مشابه
-pack-dyn-relocs=relrاست، اما در صورت وجود وابستگی نسخهٔ GLIBC_2.*، وابستگی نسخهٔ GLIBC_ABI_DT_RELR را تولید میکند. بخش ld.so در glibc از بارگذاری یک شیء پیوند خورده به صورت پویا بدون وابستگی نسخهٔ GLIBC_ABI_DT_RELR خودداری میکند. rel- استفاده از قالب REL برای بازآراییهای پویا.
rela- استفاده از قالب RELA برای بازآراییهای پویا.
retpolineplt- تولید ورودیهای PLT با قالب retpoline به عنوان راهکاری برای کاهش اثر CVE-2017-5715.
rodynamic- فقطخواندنی
کردن بخش
.dynamic. برچسبDT_DEBUGصادر نخواهد شد. separate-loadable-segmentsseparate-codenoseparate-code- مشخص
میکند که
آیا دو
قطعهٔ
مجاور PT_LOAD
مجاز به
همپوشانی
در صفحات
هستند یا
خیر.
noseparate-code(پیشفرض) همپوشانی را مجاز میداند.separate-codeهمپوشانی بین دو قطعهٔ قابل اجرا یا دو قطعهٔ غیرقابل اجرا را مجاز میداند.separate-loadable-segmentsهمپوشانی را غیرمجاز میکند. shstk- تنها در x86، استفاده از پشتهٔ سایه (shadow stack).
gcs=[implicit|never|always]- مشخص
میکند که
بیت
GNU_PROPERTY_AARCH64_FEATURE_1_GCSچگونه در فایل ELF خروجی تنظیم شود. هنگامی که تنظیم شود، نشاندهندهٔ پشتیبانی از ویژگی امنیتی پشتهٔ کنترل محافظتشده (GCS) است.implicit(پیشفرض) بیت ویژگی GCS در صورتی تنظیم میشود که همهٔ فایلهای بازآراییپذیر ورودی دارای یک بخش .note.gnu.property حاوی بیت GNU_PROPERTY_AARCH64_FEATURE_1_GCS باشند.neverصرفنظر از نشانهگذاریهای فایلهای بازآراییپذیر ورودی، بیت ویژگی GCS را پاک میکند.alwaysصرفنظر از نشانهگذاریهای شیء ورودی، بیت ویژگی GCS را تنظیم میکند. stack-size=size- تنظیم
اندازهٔ
پشتهٔ
رشتهٔ
اصلی به
size.
اندازهٔ
پشته به
عنوان
اندازهٔ
size.
قطعهٔ
برنامهٔ
PT_GNU_STACKثبت میشود. start-stop-gc- ارجاعات __start_/__stop_ مانع از جمعآوری بخشهای نام شناسهٔ C متناظر نشوند (پیشفرض).
nostart-stop-gc- به ارجاعات __start_/__stop_ اجازه میدهد بخشهای نام شناسهٔ C متناظر را حفظ کنند.
text- عدم اجازه به بازآراییها بر روی قطعههای فقطخواندنی. این حالت پیشفرض است.
nobtcfi- ایجاد یک
قطعهٔ
PT_OPENBSD_NOBTCFI. wxneeded- ایجاد یک
قطعهٔ
PT_OPENBSD_WXNEEDED.
LLD_REPRODUCE- یک فایل tarball
بازتولید
با نام
مشخصشده
ایجاد
میکند. در
صورت مشخص
شدن
--reproduceگزینهٔ--reproduceاولویت خواهد داشت. LLD_VERSION- دستور ld.lld
بخشی به
نام
.commentحاوی رشتهٔ نگارش LLD ایجاد میکند. این رشتهٔ نگارش را میتوان با این متغیر محیطی بازنویسی کرد، که برای از بین بردن تفاوتهای ایجادشده در باینری ناشی از تفاوت شماره نگارش LLD سودمند است.
نکات پیادهسازی (IMPLEMENTATION NOTES)
نحوهٔ
مدیریت
فایلهای
آرشیو
(آنهایی که
پسوند فایل
.a دارند)
توسط ld.lld
با
پیونددهندههای
سنتی مورد
استفاده در
سیستمهای
شبیه
یونیکس
متفاوت
است.
پیونددهندههای سنتی مجموعهای از نمادهای تعریفنشده را در طول فرایند پیوند نگهداری میکنند. پیونددهنده هر فایل را به ترتیبی که در خط فرمان ظاهر میشود پردازش میکند تا زمانی که مجموعهٔ نمادهای تعریفنشده خالی شود. یک فایل شیء هنگام مواجهه در شیء خروجی پیوند داده شده و نمادهای تعریفنشدهٔ آن به مجموعه افزوده میشوند. یک پیونددهندهٔ سنتی پس از مواجهه با یک فایل آرشیو، اشیاء درون آن را جستجو کرده و مواردی را پردازش میکند که نمادهای موجود در مجموعهٔ برطرفنشده را برآورده سازند.
مدیریت
آرشیوهایی
با وابستگی
متقابل
هنگام
استفاده از
یک
پیونددهندهٔ
سنتی
میتواند
دشوار باشد.
ممکن است
لازم باشد
فایلهای
آرشیو
چندین بار
مشخص شوند،
یا از
گزینههای
ویژهٔ خط
فرمان
--start-group و
--end-group
استفاده
شود تا
پیونددهنده
روی
فایلهای
درون گروه
تا زمانی که
هیچ نماد
جدیدی به
مجموعه
افزوده
نشود حلقه
بزند.
ld.lld
همزمان با
پیمایش
آرگومانهای
خط فرمان،
تمام
نمادهای
یافتشده
در اشیاء و
آرشیوها را
ثبت میکند.
هنگامی که
ld.lld با یک
نماد
تعریفنشده
مواجه
میشود که
میتواند
توسط یک
فایل شیء
موجود در یک
فایل
آرشیوِ از
قبل
پردازششده
برطرف شود،
بلافاصله
آن را
استخراج
کرده و در
شیء خروجی
پیوند
میدهد.
با برخی
ورودیهای
آرشیو،
ld.lld ممکن
است در
مقایسه با
پیونددهندههای
سنتی نتایج
متفاوتی
تولید کند.
در عمل،
بخشهای
وسیعی از
نرمافزارهای
شخص ثالث
بدون
مشکلات
اساسی با
ld.lld پیوند
داده
شدهاند.
گزینهٔ
--warn-backrefs
میتواند
برای
شناسایی
فراخوانیهایی
از
پیونددهنده
به کار رود
که ممکن است
با رفتار
سنتی
پیونددهندهها
در
سیستمهای
شبیه
یونیکس
ناسازگار
باشند.
| July 25, 2023 | Linux 6.12.113+deb13-amd64 |