| LD(1) | GNU Development Tools | LD(1) |
نام (NAME)
ld - پیونددهنده گنو (The GNU linker)
خلاصه دستور (SYNOPSIS)
ld [options] objfile ...
شرح (DESCRIPTION)
ld تعدادی از فایلهای شیء و بایگانی را ترکیب کرده، دادههای آنها را بازنشانی میکند و ارجاعات نمادها را پیوند میزند. معمولاً آخرین گام در کامپایل یک برنامه، اجرای ld است.
ld فایلهای «زبان فرمان پیونددهنده» (Linker Command Language) را که در ابرمجموعهای از نحو «زبان فرمان ویرایشگر پیوند AT&T» نوشته شدهاند میپذیرد، تا مهار کامل و صریحی بر فرایند پیونددهی فراهم سازد.
این صفحه راهنما زبان فرمان را توصیف نمیکند؛ برای جزئیات کامل پیرامون زبان فرمان و سایر جنبههای پیونددهنده گنو، مدخل ld را در "info" ببینید.
این نسخه از ld از کتابخانههای چندمنظوره BFD برای کار بر روی فایلهای شیء استفاده میکند. این به ld اجازه میدهد فایلهای شیء را در قالبهای بسیار متفاوتی بخواند، ترکیب کند و بنویسد---برای نمونه، COFF یا "a.out". قالبهای گوناگون میتوانند به یکدیگر پیوند داده شوند تا هر نوع فایل شیء موجود تولید گردد.
جدا از انعطافپذیری، پیونددهنده گنو در ارائه اطلاعات تشخیصی نسبت به دیگر پیونددهندهها بسیار سودمندتر است. بسیاری از پیونددهندهها به محض مواجهه با یک خطا بلافاصله اجرا را متوقف میکنند؛ در حالی که هر زمان امکانپذیر باشد، ld به اجرا ادامه میدهد و به شما امکان میدهد خطاهای دیگر را نیز شناسایی کنید (یا در مواردی، با وجود خطا فایل خروجی را دریافت نمایید).
پیونددهنده گنو ld به منظور پوشش دامنه گستردهای از شرایط و داشتن بیشترین سازگاری ممکن با سایر پیونددهندهها طراحی شده است. در نتیجه، گزینههای فراوانی برای مهار رفتار آن در اختیار دارید.
گزینهها (OPTIONS)
پیونددهنده از گزینههای خط فرمان متعددی پشتیبانی میکند، اما در عمل تنها تعداد اندکی از آنها در هر زمینه خاص به کار میروند. برای نمونه، یک کاربرد متداول ld پیوند فایلهای شیء استاندارد یونیکس در یک سیستم استاندارد و پشتیبانیشده یونیکس است. در چنین سیستمی، برای پیوند یک فایل "hello.o":
ld -o <output> /lib/crt0.o hello.o -lc
این به ld میگوید فایلی به نام output را در نتیجه پیوند فایل "/lib/crt0.o" با "hello.o" و کتابخانه "libc.a" (که از پوشههای استاندارد جستجو خواهد آمد) تولید کند. (بررسی گزینه -l را در زیر ببینید.)
برخی از گزینههای خط فرمان ld را میتوان در هر نقطهای از خط فرمان مشخص کرد. با این حال، گزینههایی که به فایلها ارجاع میدهند، مانند -l یا -T، سبب میشوند فایل در همان نقطهای که گزینه در خط فرمان ظاهر میشود، نسبت به فایلهای شیء و دیگر گزینههای فایل خوانده شود. تکرار گزینههای غیرفایلی با یک آرگومان متفاوت یا هیچ اثر دیگری نخواهد داشت، یا موارد پیشین آن گزینه (مواردی که بیشتر در سمت چپ خط فرمان قرار دارند) را بازنویسی میکند. گزینههایی که میتوانند به طور معناداری بیش از یک بار مشخص شوند در توضیحات زیر ذکر شدهاند.
آرگومانهای غیرگزینهای، فایلهای شیء یا بایگانیهایی هستند که قرار است با یکدیگر پیوند داده شوند. آنها میتوانند پس از گزینههای خط فرمان، قبل از آنها یا در میان آنها قرار گیرند، به جز اینکه یک آرگومان فایل شیء نباید میان یک گزینه و آرگومان آن قرار گیرد.
معمولاً پیونددهنده با حداقل یک فایل شیء فراخوانی میشود، اما میتوانید اشکال دیگری از فایلهای ورودی باینری را با استفاده از -l، -R و زبان فرمان اسکریپت مشخص کنید. اگر هیچ فایل ورودی باینری مشخص نشده باشد، پیونددهنده هیچ خروجی تولید نمیکند و پیام No input files را صادر مینماید.
اگر پیونددهنده نتواند قالب یک فایل شیء را تشخیص دهد، فرض میکند که آن یک اسکریپت پیونددهنده است. اسکریپتی که به این روش مشخص شود، اسکریپت اصلی پیونددهنده را که برای پیوند استفاده میشود (خواه اسکریپت پیشفرض پیونددهنده باشد یا اسکریپتی که با استفاده از -T تعیین شده است) گسترش میدهد. این ویژگی به پیونددهنده اجازه میدهد تا با فایلی پیوند برقرار کند که ظاهراً یک فایل شیء یا بایگانی است، اما در عمل تنها مقادیر برخی نمادها را تعریف میکند یا از "INPUT" یا "GROUP" برای بارگذاری اشیاء دیگر استفاده مینماید. تعیین یک اسکریپت به این شیوه صرفاً اسکریپت اصلی پیونددهنده را گسترش میدهد و دستورات اضافه پس از اسکریپت اصلی قرار میگیرند؛ از گزینه -T برای جایگزینی کامل اسکریپت پیشفرض پیونددهنده استفاده کنید، اما به تأثیر دستور "INSERT" نیز توجه داشته باشید.
برای گزینههایی که نام آنها تکحرفی است، آرگومانهای گزینه باید یا بدون فاصله میانی بلافاصله پس از حرف گزینه بیایند، یا به عنوان آرگومانهای جداگانه بلافاصله پس از گزینهای که به آنها نیاز دارد قرار گیرند.
برای گزینههایی که نام آنها چندحرفی است، یک یا دو خط تیره میتواند پیش از نام گزینه قرار گیرد؛ برای نمونه، -trace-symbol و --trace-symbol معادل یکدیگرند. توجه---یک استثنا برای این قاعده وجود دارد. گزینههای چندحرفی که با حرف کوچک 'o' شروع میشوند فقط میتوانند با دو خط تیره همراه باشند. این امر برای کاهش سردرگمی با گزینه -o است. بنابراین به عنوان مثال -omagic نام فایل خروجی را روی magic تنظیم میکند در حالی که --omagic پرچم NMAGIC را روی خروجی تنظیم مینماید.
آرگومانهای گزینههای چندحرفی باید یا با علامت مساوی از نام گزینه جدا شوند، یا به صورت آرگومانهای جداگانه بلافاصله پس از گزینهای که به آنها نیاز دارد قرار گیرند. برای مثال، --trace-symbol foo و --trace-symbol=foo معادل هستند. اختصارات یکتای نام گزینههای چندحرفی پذیرفته میشوند.
توجه---اگر پیونددهنده به طور غیرمستقیم و از طریق راهانداز کامپایلر (مانند gcc) فراخوانی میشود، تمام گزینههای خط فرمان پیونددهنده باید دارای پیشوند -Wl, (یا هر آنچه برای آن راهانداز خاص کامپایلر مناسب است) باشند، مانند این:
gcc -Wl,--start-group foo.o bar.o -Wl,--end-group
این امر مهم است، زیرا در غیر این صورت برنامه راهانداز کامپایلر ممکن است بدون هیچ هشداری گزینههای پیونددهنده را نادیده بگیرد که منجر به پیوند نادرست خواهد شد. همچنین هنگام ارسال گزینههایی که نیاز به مقدار دارند از طریق راهانداز ممکن است سردرگمی ایجاد شود، چرا که استفاده از فاصله میان گزینه و آرگومان به عنوان جداکننده عمل میکند و باعث میشود راهانداز فقط گزینه را به پیونددهنده و آرگومان را به کامپایلر ارسال کند. در این حالت، سادهترین راه استفاده از شکل پیوسته هر دو نوع گزینههای تکحرفی و چندحرفی است، مانند:
gcc foo.o bar.o -Wl,-eENTRY -Wl,-Map=a.map
در اینجا جدولی از سوییچهای عمومی خط فرمان که توسط پیونددهنده گنو پذیرفته میشوند آورده شده است:
- @file
- گزینههای
خط فرمان را
از file
میخواند.
گزینههای
خواندهشده
به جای
گزینه اصلی
@file درج
میشوند.
اگر file وجود
نداشته
باشد یا
قابل
خواندن
نباشد، با
گزینه به
صورت لفظی
رفتار
میشود و
حذف نخواهد
شد.
گزینهها در file با فاصلههای خالی (whitespace) از یکدیگر جدا میشوند. یک نویسه فاصله خالی میتواند با قرار دادن کل گزینه در گیومه تکی یا جفتی درون گزینه گنجانده شود. هر نویسهای (از جمله بکاسلش) میتواند با قرار دادن یک بکاسلش قبل از نویسه مورد نظر گنجانده شود. خود file ممکن است شامل گزینههای @file بیشتری باشد؛ چنین گزینههایی به صورت بازگشتی پردازش خواهند شد.
- -a keyword
- این گزینه برای سازگاری با HP/UX پشتیبانی میشود. آرگومان keyword باید یکی از رشتههای archive، shared، یا default باشد. -aarchive از نظر عملکردی معادل -Bstatic است، و دو کلیدواژه دیگر از نظر عملکردی معادل -Bdynamic هستند. این گزینه را میتوان به هر تعداد بار استفاده کرد.
- --audit AUDITLIB
- مقدار AUDITLIB را به مدخل "DT_AUDIT" در بخش پویا اضافه میکند. وجود AUDITLIB بررسی نمیشود، و همچنین از DT_SONAME مشخصشده در کتابخانه استفاده نخواهد کرد. در صورت تعیین چندباره، "DT_AUDIT" شامل فهرستی از رابطهای بازرسی جداشده با دونقطه خواهد بود. اگر پیونددهنده هنگام جستجو برای کتابخانههای مشترک شیئی با مدخل بازرسی بیابد، مدخل متناظر "DT_DEPAUDIT" را در فایل خروجی اضافه خواهد کرد. این گزینه تنها در پلتفرمهای ELF پشتیبانیکننده از رابط rtld-audit معنادار است.
- -b input-format
- --format=input-format
- برنامه ld
ممکن است
برای
پشتیبانی
از بیش از
یک نوع فایل
شیء
پیکربندی
شده باشد.
اگر ld شما
بدین صورت
پیکربندی
شده است،
میتوانید
از گزینه -b
برای مشخص
کردن قالب
دودویی
فایلهای
شیء ورودی
که پس از
این گزینه
در خط فرمان
میآیند
استفاده
کنید. حتی
هنگامی که
ld برای
پشتیبانی
از
قالبهای
شیء
جایگزین
پیکربندی
شده است،
معمولاً
نیازی به
تعیین این
گزینه
ندارید،
زیرا ld
باید طوری
پیکربندی
شده باشد که
رایجترین
قالب روی هر
ماشین را به
عنوان قالب
ورودی
پیشفرض
انتظار
داشته باشد.
input-format یک رشته
متنی و نام
قالبی خاص
است که توسط
کتابخانههای
BFD پشتیبانی
میشود.
(میتوانید
قالبهای
دودویی
موجود را با
objdump -i فهرست
کنید.)
اگر فایلهایی با قالب دودویی غیرمعمول را پیوند میدهید، ممکن است بخواهید از این گزینه استفاده کنید. همچنین میتوانید از -b برای جابهجایی صریح قالبها (هنگام پیوند دادن فایلهای شیء با قالبهای گوناگون) استفاده کنید، با گنجاندن -b input-format پیش از هر گروه از فایلهای شیء در یک قالب مشخص.
قالب پیشفرض از متغیر محیطی "GNUTARGET" گرفته میشود.
همچنین میتوانید قالب ورودی را از درون یک اسکریپت و با استفاده از دستور "TARGET" تعیین کنید؛
- -c MRI-commandfile
- --mri-script=MRI-commandfile
- برای سازگاری با پیونددهندههای تولیدشده توسط MRI، برنامه ld فایلهای اسکریپت نوشتهشده با زبان دستوری جایگزین و محدودی را میپذیرد که در بخش «فایلهای اسکریپت سازگار با MRI (MRI Compatible Script Files)» از مستندات GNU ld شرح داده شده است. فایلهای اسکریپت MRI را با گزینه -c معرفی کنید؛ از گزینه -T برای اجرای اسکریپتهای پیونددهنده نوشتهشده با زبان اسکریپتنویسی عمومی ld استفاده کنید. اگر MRI-cmdfile وجود نداشته باشد، ld در دایرکتوریهای مشخصشده توسط هر گزینه -L به دنبال آن میگردد.
- -d
- -dc
- -dp
- این سه گزینه معادل یکدیگرند؛ شکلهای چندگانه برای سازگاری با سایر پیونددهندهها پشتیبانی میشوند. آنها حتی در صورت مشخص شدن فایل خروجی بازجابجاییپذیر (با -r)، به نمادهای مشترک فضا تخصیص میدهند. دستور اسکریپت "FORCE_COMMON_ALLOCATION" اثری مشابه دارد.
- --depaudit AUDITLIB
- -P AUDITLIB
- مقدار AUDITLIB را به مدخل "DT_DEPAUDIT" در بخش پویا اضافه میکند. وجود AUDITLIB بررسی نمیشود، و همچنین از DT_SONAME مشخصشده در کتابخانه استفاده نخواهد کرد. در صورت تعیین چندباره، "DT_DEPAUDIT" شامل فهرستی از رابطهای بازرسی جداشده با دونقطه خواهد بود. این گزینه تنها در پلتفرمهای ELF پشتیبانیکننده از رابط rtld-audit معنادار است. گزینه -P برای سازگاری با Solaris ارائه شده است.
- --enable-linker-version
- دستورالعمل
اسکریپت
پیونددهنده
"LINKER_VERSION" را
فعال
میکند که
در
دادههای
بخش خروجی (Output
Section Data) شرح
داده شده
است. اگر
این
دستورالعمل
در یک
اسکریپت
پیونددهنده
استفاده
شود و این
گزینه فعال
شده باشد،
رشتهای
حاوی نسخه
پیونددهنده
در نقطه
جاری درج
خواهد شد.
توجه - محل قرارگیری این گزینه در خط فرمان پیونددهنده اهمیت دارد. این گزینه تنها بر اسکریپتهای پیونددهندهای تأثیر میگذارد که پس از آن در خط فرمان میآیند، یا در پیونددهنده تعبیه شدهاند.
- --disable-linker-version
- دستورالعمل اسکریپت پیونددهنده "LINKER_VERSION" را غیرفعال میکند تا رشته نسخه را درج نکند. این حالت پیشفرض است.
- --enable-non-contiguous-regions
- این گزینه
از ایجاد
خطا در
صورتی که یک
بخش ورودی
در یک بخش
خروجی
منطبق
نگنجد،
جلوگیری
میکند.
پیونددهنده
تلاش
میکند بخش
ورودی را به
بخشهای
خروجی
منطبق بعدی
تخصیص دهد،
و تنها در
صورتی خطا
ایجاد
میکند که
هیچ بخش
خروجی به
اندازه
کافی بزرگ
نباشد. این
ویژگی
زمانی مفید
است که
چندین
ناحیه
حافظه
غیرپیوسته
در دسترس
باشند و بخش
ورودی به
ناحیه خاصی
نیاز
نداشته
باشد.
ترتیبی که
بخشهای
ورودی بر
پایه آن
ارزیابی
میشوند
تغییر
نمیکند،
برای نمونه:
MEMORY { MEM1 (rwx) : ORIGIN = 0x1000, LENGTH = 0x14 MEM2 (rwx) : ORIGIN = 0x1000, LENGTH = 0x40 MEM3 (rwx) : ORIGIN = 0x2000, LENGTH = 0x40 } SECTIONS { mem1 : { *(.data.*); } > MEM1 mem2 : { *(.data.*); } > MEM2 mem3 : { *(.data.*); } > MEM3 } with input sections: .data.1: size 8 .data.2: size 0x10 .data.3: size 4 results in .data.1 affected to mem1, and .data.2 and .data.3 affected to mem2, even though .data.3 would fit in mem3.این گزینه با دستورهای INSERT ناسازگار است زیرا نحوه نگاشت بخشهای ورودی به بخشهای خروجی را تغییر میدهد.
- --enable-non-contiguous-regions-warnings
- این گزینه هشدارهایی را فعال میکند هنگامی که "--enable-non-contiguous-regions" اجازه تطابقهای احتمالاً غیرمنتظره را در نگاشت بخشها میدهد؛ امری که بالقوه میتواند به جای شکست خوردن برنامه به دلیل عدم گنجایش در هیچ ناحیه خروجی، به کنار گذاشتن بیسروصدای یک بخش بینجامد.
- -e entry
- --entry=entry
- از entry به عنوان نماد صریح برای شروع اجرای برنامه استفاده میکند، به جای نقطه ورود پیشفرض. اگر هیچ نمادی با نام entry وجود نداشته باشد، پیونددهنده تلاش خواهد کرد entry را به عنوان یک عدد تجزیه کند، و از آن به عنوان نشانی ورود استفاده نماید (این عدد در مبنای ۱۰ تفسیر خواهد شد؛ میتوانید از یک 0x در ابتدا برای مبنای ۱۶، یا یک 0 برای مبنای ۸ استفاده کنید). برای i386 PE، مقدار entry همچنین میتواند نام اصلی تابع باشد (بدون خط تیره زیرین پیشین و/یا stdcall پسین @number در صورت کاربرد).
- --exclude-libs lib,lib,...
- فهرستی از کتابخانههای آرشیو را مشخص میکند که نمادهای آنها نباید بهطور خودکار برونریزی شوند. نامهای کتابخانه ممکن است با کاما یا دونقطه جدا شوند. تعیین "--exclude-libs ALL" نمادها را در تمام کتابخانههای آرشیو از برونریزی خودکار مستثنی میکند. این گزینه تنها برای پورتهای با هدف ELF و PE در پیونددهنده در دسترس است. برای اهداف PE، نمادهایی که بهطور صریح در یک فایل .def فهرست شدهاند، صرفنظر از این گزینه همچنان برونریزی میشوند. برای پورتهای با هدف ELF، با نمادهای تحت تأثیر این گزینه به عنوان پنهان (hidden) رفتار خواهد شد.
- --exclude-modules-for-implib module,module,...
- فهرستی از فایلهای شیء یا اعضای آرشیو را مشخص میکند که نمادهای آنها نباید بهطور خودکار برونریزی شوند، اما باید بهطور یکپارچه در کتابخانه واردسازی که در طول پیوند تولید میشود کپی شوند. نامهای ماژول میتوانند با کاما یا دونقطه جدا شوند، و باید دقیقاً با نامهای فایلی که توسط ld برای باز کردن فایلها استفاده شده مطابقت داشته باشند؛ برای اعضای آرشیو، این صرفاً نام عضو است، اما برای فایلهای شیء، نام فهرستشده باید شامل هر مسیری باشد که برای تعیین فایل ورودی در خط فرمان پیونددهنده استفاده شده و دقیقاً با آن مطابقت داشته باشد. نمادهایی که بهطور صریح در یک فایل .def فهرست شدهاند، صرفنظر از این گزینه همچنان برونریزی میشوند. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- -E
- --export-dynamic
- --no-export-dynamic
- هنگام ساخت
یک فایل
اجرایی با
پیوند
پویا،
استفاده از
گزینه -E یا
گزینه --export-dynamic
باعث
میشود
پیونددهنده
تمام
نمادها را
به جدول
نمادهای
پویا اضافه
کند. جدول
نمادهای
پویا
مجموعهای
از نمادها
است که در
زمان اجرا
از اشیاء
پویا قابل
مشاهده
هستند.
اگر از هیچیک از این گزینهها استفاده نکنید (یا از گزینه --no-export-dynamic برای بازگرداندن رفتار پیشفرض استفاده کنید)، جدول نمادهای پویا معمولاً فقط شامل نمادهایی خواهد بود که توسط یک شیء پویای ذکرشده در پیوند ارجاع داده شده باشند.
اگر از "dlopen" برای بارگذاری یک شیء پویا استفاده میکنید که لازم است به جای یک شیء پویای دیگر، به نمادهای تعریفشده توسط برنامه ارجاع داشته باشد، احتمالاً باید هنگام پیوند خود برنامه از این گزینه استفاده کنید.
همچنین در صورت پشتیبانی قالب خروجی، میتوانید از فهرست پویا برای کنترل نمادهایی که باید به جدول نمادهای پویا اضافه شوند استفاده کنید. توضیحات مربوط به --dynamic-list را ببینید.
توجه داشته باشید که این گزینه ویژه پورتهای با هدف ELF است. اهداف PE از یک قابلیت مشابه برای برونریزی تمام نمادها از یک DLL یا EXE پشتیبانی میکنند؛ توضیحات مربوط به --export-all-symbols در زیر را ببینید.
- --export-dynamic-symbol=glob
- هنگام ساخت یک فایل اجرایی با پیوند پویا، نمادهای منطبق با glob به جدول نمادهای پویا افزوده خواهند شد. هنگام ساخت یک کتابخانه مشترک، ارجاعات به نمادهای منطبق با glob به تعاریف درون کتابخانه مشترک مقید نخواهند شد. این گزینه هنگام ساخت کتابخانه مشترک و در صورتی که -Bsymbolic یا --dynamic-list تعیین نشده باشند، بیاثر است. این گزینه تنها در بسترهای ELF که از کتابخانههای مشترک پشتیبانی میکنند دارای معنا است.
- --export-dynamic-symbol-list=file
- برای هر الگو در فایل، یک --export-dynamic-symbol تعیین کنید. قالب فایل مشابه گره نسخه بدون دامنه و نام گره است. برای اطلاعات بیشتر VERSION را ببینید.
- -EB
- پیوند فایلهای شیء با بایتبندی مهین (big-endian). این گزینه بر قالب خروجی پیشفرض اثر میگذارد.
- -EL
- پیوند فایلهای شیء با بایتبندی کهین (little-endian). این گزینه بر قالب خروجی پیشفرض اثر میگذارد.
- -f name
- --auxiliary=name
- هنگام ساخت
یک شیء
مشترک ELF،
فیلد درونی
DT_AUXILIARY را روی
نام
مشخصشده
تنظیم
میکند. این
کار به
پیونددهنده
پویا اعلام
میکند که
جدول
نمادهای
این شیء
مشترک باید
به عنوان یک
پالایه
کمکی روی
جدول
نمادهای
شیء مشترک
name استفاده
شود.
اگر بعداً برنامهای را در برابر این شیء پالایه پیوند دهید، هنگام اجرای برنامه، پیونددهنده پویا فیلد DT_AUXILIARY را مشاهده خواهد کرد. چنانچه پیونددهنده پویا نمادی را از شیء پالایه حل کند، ابتدا بررسی میکند که آیا تعریفی در شیء مشترک name وجود دارد یا خیر. اگر تعریفی وجود داشته باشد، به جای تعریف موجود در شیء پالایه استفاده خواهد شد. شیء مشترک name نیازی نیست حتماً وجود داشته باشد؛ بنابراین از شیء مشترک name میتوان برای ارائه پیادهسازی جایگزین برای توابع خاص، شاید به منظور اشکالزدایی یا کارایی ویژه سختافزار استفاده کرد.
این گزینه میتواند بیش از یک بار مشخص شود. مدخلهای DT_AUXILIARY به همان ترتیبی که در خط فرمان ظاهر میشوند ایجاد خواهند شد.
- -F name
- --filter=name
- هنگام ساخت
یک شیء
مشترک ELF،
فیلد درونی
DT_FILTER را روی
نام
مشخصشده
تنظیم
میکند. این
کار به
پیونددهنده
پویا اعلام
میکند که
جدول
نمادهای
شیء مشترک
در حال
ایجاد،
باید به
عنوان یک
پالایه روی
جدول
نمادهای
شیء مشترک
name استفاده
شود.
اگر بعداً برنامهای را در برابر این شیء پالایه پیوند دهید، هنگام اجرای برنامه، پیونددهنده پویا فیلد DT_FILTER را مشاهده خواهد کرد. پیونددهنده پویا نمادها را طبق معمول بر اساس جدول نمادهای شیء پالایه حل خواهد کرد، اما در واقع به تعاریف موجود در شیء مشترک name پیوند میدهد. بنابراین شیء پالایه میتواند برای انتخاب زیرمجموعهای از نمادهای ارائهشده توسط شیء name به کار رود.
برخی پیونددهندههای قدیمیتر از گزینه -F در سراسر زنجیره ابزار کامپایل برای تعیین قالب فایل شیء، هم برای ورودی و هم برای خروجی استفاده میکردند. پیونددهنده GNU برای این منظور از سازوکارهای دیگری بهره میبرد: گزینههای -b، --format، --oformat، دستور "TARGET" در اسکریپتهای پیونددهنده و متغیر محیطی "GNUTARGET". پیونددهنده GNU در صورتی که شیء مشترک ELF ایجاد نکند، گزینه -F را نادیده خواهد گرفت.
- -fini=name
- هنگام ساخت یک فایل اجرایی یا شیء مشترک ELF، با تنظیم DT_FINI روی نشانی تابع، هنگام تخلیه فایل اجرایی یا شیء مشترک، NAME را فراخوانی کنید. به طور پیشفرض، پیونددهنده از "_fini" به عنوان تابع فراخوانی استفاده میکند.
- -g
- نادیده گرفته میشود. برای سازگاری با سایر ابزارها فراهم شده است.
- -G value
- --gpsize=value
- حداکثر اندازه اشیایی را که قرار است با استفاده از ثبات GP بهینهسازی شوند، روی size تنظیم میکند. این گزینه تنها برای قالبهای فایل شیء مانند MIPS ELF که از قرار دادن اشیای بزرگ و کوچک در بخشهای متفاوت پشتیبانی میکنند معنادار است. برای سایر قالبهای فایل شیء نادیده گرفته میشود.
- -h name
- -soname=name
- هنگام ساخت یک شیء مشترک ELF، فیلد درونی DT_SONAME را روی نام مشخصشده تنظیم میکند. هنگامی که یک فایل اجرایی با یک شیء مشترک دارای فیلد DT_SONAME پیوند داده میشود، هنگام اجرای فایل اجرایی، پیونددهنده پویا به جای استفاده از نام فایلی که به پیونددهنده داده شده بود، تلاش خواهد کرد شیء مشترک تعیینشده توسط فیلد DT_SONAME را بارگذاری کند.
- -i
- یک پیوند افزایشی (incremental link) انجام میدهد (همانند گزینه -r).
- -init=name
- هنگام ساخت یک فایل اجرایی یا شیء مشترک ELF، با تنظیم DT_INIT روی نشانی تابع، هنگام بارگذاری فایل اجرایی یا شیء مشترک، NAME را فراخوانی کنید. به طور پیشفرض، پیونددهنده از "_init" به عنوان تابع فراخوانی استفاده میکند.
- -l namespec
- --library=namespec
- بایگانی یا
فایل شیء
مشخصشده
توسط namespec را
به فهرست
فایلهای
مورد پیوند
اضافه
میکند. این
گزینه
میتواند
به هر تعداد
بار
استفاده
شود. اگر namespec
به شکل :filename
باشد، ld
مسیر
کتابخانه
را برای
فایلی به
نام filename
جستوجو
خواهد کرد؛
در غیر این
صورت مسیر
کتابخانه
را برای
فایلی به
نام libnamespec.a
جستوجو
میکند.
در سیستمهایی که از کتابخانههای مشترک پشتیبانی میکنند، ممکن است ld فایلی غیر از libnamespec.a را نیز جستوجو کند. بهویژه در سیستمهای ELF و SunOS، ابزار ld پیش از جستوجوی کتابخانهای به نام libnamespec.a، شاخه را برای کتابخانهای به نام libnamespec.so جستوجو خواهد کرد (طبق رسم، پسوند ".so" نمایانگر یک کتابخانه مشترک است). توجه داشته باشید که این رفتار در مورد :filename صدق نمیکند، چرا که همواره فایلی به نام filename را مشخص میسازد.
پیونددهنده یک بایگانی را تنها یک بار، در همان مکانی که در خط فرمان مشخص شده است، جستوجو میکند. اگر بایگانی نمادی را تعریف کند که در شیئی پیش از آن بایگانی در خط فرمان تعریفنشده باقی مانده بود، پیونددهنده فایل(های) مناسب را از بایگانی دربر خواهد گرفت. با این حال، نمادی تعریفنشده در شیئی که بعداً در خط فرمان آمده باشد باعث جستوجوی دوباره بایگانی توسط پیونددهنده نخواهد شد.
برای روشی جهت واداشتن پیونددهنده به جستوجوی چندباره بایگانیها، گزینه -( را ببینید.
میتوانید یک بایگانی یکسان را چندین بار در خط فرمان فهرست کنید.
این گونه جستوجوی بایگانی در پیونددهندههای Unix استاندارد است. با این حال، اگر از ld در AIX استفاده میکنید، توجه داشته باشید که با رفتار پیونددهنده AIX تفاوت دارد.
- -L searchdir
- --library-path=searchdir
- مسیر searchdir را
به فهرست
مسیرهایی
که ld برای
کتابخانههای
بایگانی و
اسکریپتهای
کنترلی ld
جستوجو
میکند
اضافه
میکند.
میتوانید
از این
گزینه به هر
تعداد بار
استفاده
کنید.
شاخهها به
ترتیبی که
در خط فرمان
مشخص
شدهاند
جستوجو
میشوند.
شاخههای
مشخصشده
در خط فرمان
پیش از
شاخههای
پیشفرض
جستوجو
میشوند.
همه
گزینههای
-L، صرفنظر
از ترتیبی
که در خط
فرمان ظاهر
میشوند،
برای تمامی
گزینههای
-l اعمال
میشوند.
گزینههای
-L نحوه
جستوجوی ld
برای
اسکریپت
پیونددهنده
را تغییر
نمیدهند،
مگر آنکه
گزینه -T
تعیین شده
باشد.
اگر searchdir با "=" یا $SYSROOT آغاز شود، این پیشوند با sysroot prefix جایگزین خواهد شد که توسط گزینه --sysroot مهار میشود یا هنگام پیکربندی پیونددهنده تعیین میگردد.
مجموعه پیشفرض مسیرهای جستوجوشده (بدون تعیین با -L) به حالت شبیهسازی مورد استفاده ld و در برخی موارد به نحوه پیکربندی آن بستگی دارد.
این مسیرها همچنین میتوانند در یک اسکریپت پیوند با دستور "SEARCH_DIR" مشخص شوند. شاخههای مشخصشده از این طریق، در نقطهای که اسکریپت پیونددهنده در خط فرمان ظاهر میشود، جستوجو میگردند.
- -m emulation
- پیونددهنده
emulation را
شبیهسازی
میکند.
میتوانید
شبیهسازیهای
موجود را با
گزینههای
--verbose یا -V
فهرست کنید.
اگر گزینه -m به کار نرود، در صورت تعریف بودن متغیر محیطی "LDEMULATION"، شبیهسازی از آن گرفته میشود.
در غیر این صورت، شبیهسازی پیشفرض به نحوه پیکربندی پیونددهنده بستگی دارد.
- --remap-inputs=pattern=filename
- --remap-inputs-file=file
- این
گزینهها
اجازه
میدهند
نام
فایلهای
ورودی پیش
از تلاش
پیونددهنده
برای باز
کردن آنها
تغییر یابد.
گزینه --remap-inputs=foo.o=bar.o
سبب میشود
هر تلاشی
برای
بارگذاری
فایلی به
نام foo.o در
عوض تلاش
کند فایلی
به نام bar.o را
بارگذاری
کند.
الگوهای
نویسه عام
(wildcard) در اولین
نام فایل
مجاز
هستند،
بنابراین
--remap-inputs=foo*.o=bar.o نام
هر فایل
ورودی را که
با foo*.o
مطابقت
داشته باشد
به bar.o تغییر
خواهد داد.
شکل جایگزین این گزینه یعنی --remap-inputs-file=filename اجازه میدهد بازنگاشتها از یک فایل خوانده شوند. هر خط در فایل میتواند شامل یک بازنگاشت باشد. خطوط خالی نادیده گرفته میشوند. هر چیزی از نویسه هش (#) تا انتهای خط، توضیح در نظر گرفته شده و نادیده گرفته میشود. الگوی نگاشت میتواند با فاصله خالی یا نویسه مساوی (=) از نام فایل جدا شود.
این گزینهها میتوانند چندین بار مشخص شوند. محتوای آنها انباشته میشود. بازنگاشتها به همان ترتیبی که در خط فرمان آمدهاند و اگر از یک فایل باشند، به ترتیبی که در فایل وجود دارند پردازش خواهند شد. اگر تطابقی حاصل شود، هیچ بررسی دیگری برای آن نام فایل انجام نخواهد گرفت.
اگر نام فایل جایگزین /dev/null یا صرفاً NUL باشد، بازنگاشت عملاً سبب نادیده گرفته شدن فایل ورودی خواهد شد. این کار میتواند روشی مناسب برای آزمایش جهت حذف فایلهای ورودی از یک محیط ساخت پیچیده باشد.
توجه داشته باشید که این گزینه وابسته به مکان است و تنها بر نام فایلهایی اثر میگذارد که پس از آن در خط فرمان بیایند. بنابراین:
ld foo.o --remap-inputs=foo.o=bar.o
هیچ اثری نخواهد داشت، در حالی که:
ld --remap-inputs=foo.o=bar.o foo.o
نام فایل ورودی foo.o را به bar.o تغییر خواهد داد.
توجه - این گزینهها همچنین بر فایلهای ارجاعشده توسط عبارتهای INPUT در اسکریپتهای پیونددهنده اثر میگذارند. اما از آنجا که اسکریپتهای پیونددهنده پس از خواندن کل خط فرمان پردازش میشوند، مکان گزینههای بازنگاشت در خط فرمان اهمیتی ندارد.
اگر گزینه verbose فعال باشد، هر نگاشتی که مطابقت یابد گزارش خواهد شد؛ هرچند مجدداً گزینه verbose باید در خط فرمان پیش از ظاهر شدن نام فایلهای بازنگاشتشده فعال شده باشد.
اگر گزینههای -Map یا --print-map فعال باشند، فهرست بازنگاشت در خروجی نقشه گنجانده خواهد شد.
- -M
- --print-map
- چاپ یک نقشهی پیوند (link map) در خروجی استاندارد. یک نقشهی پیوند اطلاعاتی دربارهی پیوند ارائه میدهد، از جمله موارد زیر:
- جایی که پروندههای شیء در حافظه نگاشت میشوند.
- نحوهی تخصیص نمادهای عام (common symbols).
- تمامی اعضای آرشیو که در پیوند گنجانده شدهاند، همراه با ذکر نمادی که سبب وارد شدن آن عضو آرشیو شده است.
- مقادیر
اختصاصیافته
به نمادها.
یادداشت - نمادهایی که مقدار آنها با عبارتی محاسبه میشود که شامل ارجاع به مقدار پیشین همان نماد است، ممکن است نتیجهی درستی در نقشهی پیوند نمایش ندهند. این امر بدان سبب است که پیونددهنده نتایج میانی را دور میریزد و تنها مقدار پایانی یک عبارت را نگه میدارد. در چنین شرایطی، پیونددهنده مقدار پایانی را درون قلابها نمایش میدهد. بنابراین برای نمونه یک اسکریپت پیونددهنده شامل:
foo = 1 foo = foo * 4 foo = foo + 8
در صورت استفاده از گزینهی -M، خروجی زیر را در نقشهی پیوند تولید خواهد کرد:
0x00000001 foo = 0x1 [0x0000000c] foo = (foo * 0x4) [0x0000000c] foo = (foo + 0x8)
برای اطلاعات بیشتر دربارهی عبارتها در اسکریپتهای پیونددهنده، Expressions را ببینید.
- نحوهی
ادغام
ویژگیهای
GNU.
هنگامی که پیونددهنده بخشهای ورودی .note.gnu.property را در یک بخش خروجی .note.gnu.property ادغام میکند، برخی ویژگیها حذف یا بهروزرسانی میشوند. این کنشها در نقشهی پیوند گزارش میشوند. برای نمونه:
Removed property 0xc0000002 to merge foo.o (0x1) and bar.o (not found)
این نشان میدهد که ویژگی 0xc0000002 هنگام ادغام ویژگیها در foo.o که مقدار ویژگی 0xc0000002 آن 0x1 است و bar.o که فاقد ویژگی 0xc0000002 است، از خروجی حذف شده است.
Updated property 0xc0010001 (0x1) to merge foo.o (0x1) and bar.o (0x1)
این نشان میدهد که مقدار ویژگی 0xc0010001 هنگام ادغام ویژگیها در foo.o که مقدار ویژگی 0xc0010001 آن 0x1 است و bar.o که مقدار ویژگی 0xc0010001 آن 0x1 است، در خروجی به 0x1 بهروزرسانی شده است.
- در برخی
مقصدهای ELF،
فهرستی از
اصلاحیهها
(fixups) که توسط --relax
درج
شدهاند
foo.o: Adjusting branch at 0x00000008 towards "far" in section .text
این نشان میدهد که انشعاب در 0x00000008 در foo.o که نماد "far" را در بخش .text هدف قرار داده، با یک ترامپولین جایگزین شده است.
- --print-map-discarded
- --no-print-map-discarded
- چاپ (یا عدم چاپ) فهرست بخشهای کنارگذاشتهشده و زبالهروبیشده در نقشهی پیوند. بهطور پیشفرض فعال است.
- --print-map-locals
- --no-print-map-locals
- چاپ (یا عدم چاپ) نمادهای محلی در نقشهی پیوند. نمادهای محلی عبارت (local) را پیش از نام خود خواهند داشت و پس از تمامی نمادهای سراسری در یک بخش مشخص فهرست میشوند. نمادهای محلی موقت (معمولاً آنهایی که با .L آغاز میشوند) در خروجی گنجانده نخواهند شد. بهطور پیشفرض غیرفعال است.
- -n
- --nmagic
- خاموش کردن همترازی صفحهای بخشها، و غیرفعال کردن پیوند در برابر کتابخانههای اشتراکی. اگر قالب خروجی از شمارههای جادویی به سبک یونیکس پشتیبانی کند، خروجی را با "NMAGIC" علامتگذاری میکند.
- -N
- --omagic
- تنظیم بخشهای text و data به گونهای که هم خواندنی و هم نوشتنی باشند. همچنین قطعهی داده را صفحهبندی نمیکند، و پیوند در برابر کتابخانههای اشتراکی را غیرفعال میسازد. اگر قالب خروجی از شمارههای جادویی به سبک یونیکس پشتیبانی کند، خروجی را با "OMAGIC" علامتگذاری میکند. یادداشت: هرچند یک بخش text قابلنوشتن برای مقصدهای PE-COFF مجاز است، اما با مشخصات قالب منتشرشده توسط مایکروسافت همخوانی ندارد.
- --no-omagic
- این گزینه بیشتر اثرات گزینهی -N را خنثی میکند. بخش text را فقطخواندنی تنظیم کرده و قطعهی داده را وادار به همترازی صفحهای مینماید. یادداشت - این گزینه پیوند در برابر کتابخانههای اشتراکی را فعال نمیکند. برای این کار از -Bdynamic استفاده کنید.
- -o output
- --output=output
- استفاده از
output به عنوان
نام
برنامهی
تولیدشده
توسط ld؛
اگر این
گزینه مشخص
نشود، نام
a.out بهطور
پیشفرض به
کار میرود.
دستور
اسکریپت
"OUTPUT" نیز
میتواند
نام
پروندهی
خروجی را
مشخص کند.
یادداشت - پیونددهنده پروندهی خروجی را پیش از آغاز نوشتن درون آن حذف خواهد کرد. این کار حتی اگر مشخص شود که پیوند به دلیل خطاها نمیتواند کامل شود نیز انجام خواهد شد.
یادداشت - پیونددهنده بررسی خواهد کرد تا مطمئن شود نام پروندهی خروجی با نام هیچیک از پروندههای ورودی مطابقت نداشته باشد، اما همین و بس. بهویژه اگر پروندهی خروجی ممکن است روی یک پروندهی منبع یا پروندهی مهم دیگری رونویسی شود، هشداری نخواهد داد. بنابراین در سامانههای ساخت توصیه میشود که از گزینهی -o به عنوان آخرین گزینه در خط فرمان پیونددهنده استفاده شود. برای نمونه در نظر بگیرید:
ld -o $(EXE) $(OBJS) ld $(OBJS) -o $(EXE)
اگر متغیر EXE به دلیلی تعریف نشده باشد، نگارش نخست دستور پیونددهنده میتواند به حذف یکی از پروندههای شیء (نخستین مورد در فهرست OBJS) بیانجامد در حالی که نگارش دوم دستور پیونددهنده یک پیام خطا تولید کرده و چیزی را حذف نخواهد کرد.
- --dependency-file=depfile
- نوشتن یک dependency file (پروندهی وابستگی) در depfile. این پرونده دربردارندهی قانونی مناسب برای "make" است که پروندهی خروجی و تمامی پروندههای ورودی خواندهشده برای تولید آن را توصیف میکند. خروجی مشابه خروجی کامپایلر با -M -MP است. توجه داشته باشید که هیچ گزینهای مانند -MM در کامپایلر برای مستثنی کردن «پروندههای سامانه» (که برخلاف «سرایندههای سامانه» در کامپایلر، مفهومی بهخوبی مشخصشده در پیونددهنده نیست) وجود ندارد. بنابراین خروجی حاصل از --dependency-file همواره مختص وضعیت دقیق نصبی است که در آن تولید شده، و نباید بدون ویرایش دقیق در makefileهای توزیعشده کپی شود.
- -O level
- اگر level یک
مقدار عددی
بزرگتر از
صفر باشد،
ld خروجی را
بهینهسازی
میکند. این
کار ممکن
است
بهمیزان
قابلتوجهی
طولانیتر
شود و
بنابراین
احتمالاً
تنها باید
برای
دودویی
نهایی فعال
گردد. در
حال حاضر
این گزینه
فقط بر
تولید
کتابخانهی
اشتراکی ELF
تأثیر
میگذارد.
انتشارهای
آیندهی
پیونددهنده
ممکن است
استفادهی
بیشتری از
این گزینه
ببرند.
همچنین
اکنون
تفاوتی در
رفتار
پیونددهنده
برای
مقادیر
غیرصفر
گوناگون
این گزینه
وجود ندارد.
این امر نیز
ممکن است با
انتشارهای
آینده
تغییر یابد.
اگر level برابر صفر یا رشتهی fast باشد، ld در عوض از عملیاتهای اختیاری چشمپوشی میکند، که به پیوندی سریعتر میانجامد اما دودوییهای کندتر و بزرگتری تولید مینماید. در حال حاضر تنها عملیاتی که از آن صرفنظر میشود، ترکیب بخشهای قابلادغام است، اما این موضوع ممکن است در آینده دگرگون شود.
اگر level رشتهی default یا صرفاً نویسهی - باشد، رفتار پیشفرض پیونددهنده مبنی بر نه بهینهسازی و نه چشمپوشی از عملیاتها انتخاب میشود.
- -plugin name
- درگیر کردن
یک افزونه
در فرایند
پیوند.
پارامتر name
نام مطلق
پروندهی
افزونه است.
معمولاً
این
پارامتر
بهطور
خودکار
توسط
کامپایلر
هنگام
استفاده از
بهینهسازی
زمان پیوند
اضافه
میشود،
اما
کاربران در
صورت تمایل
میتوانند
افزونههای
خود را نیز
اضافه
نمایند.
توجه داشته باشید که محل افزونههای نشئتگرفته از کامپایلر با محلی که برنامههای ar، nm و ranlib در آن به جستجوی افزونههای خود میپردازند متفاوت است. برای آنکه آن دستورها بتوانند از یک افزونهی مبتنی بر کامپایلر بهره ببرند، باید ابتدا در شاخهی ${libdir}/bfd-plugins کپی شود. تمامی افزونههای پیونددهندهی مبتنی بر gcc با نگارشهای پیشین سازگار هستند، بنابراین کپی کردن تازهترین آنها کفایت میکند.
- --push-state
- گزینه --push-state
امکان حفظ
وضعیت
کنونی
پرچمهای
حاکم بر
مدیریت
فایل ورودی
را فراهم
میآورد تا
بتوان همه
آنها را با
یک گزینه
منطبق --pop-state
بازیابی
کرد.
گزینههایی که پوشش داده میشوند عبارتند از: -Bdynamic، -Bstatic، -dn، -dy، -call_shared، -non_shared، -static، -N، -n، --whole-archive، --no-whole-archive، --link-mapless، --no-link-mapless، -r، -Ur، --copy-dt-needed-entries، --no-copy-dt-needed-entries، --as-needed، --no-as-needed، و -a.
یک کاربرد این گزینه، مشخصات مربوط به pkg-config است. هنگامی که همراه با گزینه --libs استفاده شود، همه کتابخانههایی که احتمالاً مورد نیاز هستند فهرست شده و در نتیجه همواره پیوند داده میشوند. بهتر است خروجی به شکل زیر ارائه شود:
-Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state
- --pop-state
- اثر --push-state را خنثی کرده و مقادیر پیشین پرچمهای حاکم بر مدیریت فایل ورودی را بازمیگرداند.
- -q
- --emit-relocs
- بخشها و
محتوای
بازآدرسدهی
(relocation) را در
فایلهای
اجرایی
کاملاً
پیوندیافته
باقی
میگذارد.
ابزارهای
بهینهسازی
و تحلیل پس
از پیوند
ممکن است
برای انجام
اصلاحات
صحیح روی
فایلهای
اجرایی به
این
اطلاعات
نیاز داشته
باشند. این
امر منجر به
ایجاد
فایلهای
اجرایی با
حجم
بزرگتر
میشود.
این گزینه در حال حاضر تنها در بسترهای ELF پشتیبانی میشود.
- --force-dynamic
- فایل خروجی را وادار به داشتن بخشهای پویا (dynamic sections) میکند. این گزینه مختص مقصدهای VxWorks است.
- -r
- --relocatable
- تولید
خروجی قابل
بازآدرسدهی---یعنی
فایلی
خروجی
تولید
میکند که
میتواند
به نوبه خود
بهعنوان
ورودی به ld
داده شود.
این عمل
اغلب
پیوند
جزئی (partial linking)
نامیده
میشود.
بهعنوان
یک اثر
جانبی، در
محیطهایی
که از
شمارههای
جادویی
استاندارد
یونیکس
پشتیبانی
میکنند،
این گزینه
همچنین
شماره
جادویی
فایل خروجی
را روی
"OMAGIC"
تنظیم
میکند. اگر
این گزینه
مشخص نشود،
یک فایل
مطلق (absolute)
تولید
میشود.
هنگام
پیوند
برنامههای
C++، این
گزینه
ارجاعات به
سازندهها
(constructors) را حل
نخواهد
کرد؛ برای
انجام آن،
از -Ur
استفاده
کنید.
هنگامی که قالب فایل ورودی با فایل خروجی یکسان نباشد، پیوند جزئی تنها در صورتی پشتیبانی میشود که آن فایل ورودی فاقد هرگونه بازآدرسدهی باشد. قالبهای خروجی متفاوت میتوانند محدودیتهای بیشتری داشته باشند؛ برای نمونه برخی قالبهای مبتنی بر "a.out" اصلاً از پیوند جزئی با فایلهای ورودی در قالبهای دیگر پشتیبانی نمیکنند.
هنگامی که خروجی قابل بازآدرسدهی هم شامل محتوایی باشد که به بهینهسازی زمان پیوند (LTO) نیاز دارد و هم محتوایی که نیازی به LTO ندارد، بخشی با نام .gnu_object_only برای دربرگرفتن یک فایل شیء قابل بازآدرسدهی ایجاد خواهد شد، گویی -r روی تمام ورودیهای قابل بازآدرسدهی که به LTO نیازی ندارند اعمال شده است. هنگام پردازش یک ورودی قابل بازآدرسدهی دارای بخش .gnu_object_only، پیونددهنده بخش .gnu_object_only را بهعنوان یک ورودی جداگانه استخراج خواهد کرد.
توجه داشته باشید از آنجا که -r برخی از بخشهای فایلهای ورودی مختلف را با یکدیگر گروهبندی میکند، ممکن است اثرات منفی بر اندازه کد و محلیبودن (locality) در فایل اجرایی نهایی یا کتابخانه اشتراکی داشته باشد.
این گزینه عملکردی یکسان با -i دارد.
- -R filename
- --just-symbols=filename
- نامهای
نمادها و
نشانیهای
آنها را از
filename
میخواند،
اما آن را
بازآدرسدهی
نکرده و در
خروجی
نمیگنجاند.
این امر
اجازه
میدهد
فایل خروجی
شما
بهصورت
نمادین به
مکانهای
مطلق حافظه
که در
برنامههای
دیگر تعریف
شدهاند
ارجاع دهد.
میتوانید
از این
گزینه بیش
از یک بار
استفاده
کنید.
برای سازگاری با سایر پیونددهندههای ELF، اگر پس از گزینه -R بهجای نام فایل، نام یک شاخه بیاید، با آن همانند گزینه -rpath رفتار میشود.
- --rosegment
- --no-rosegment
- تلاش
میکند
اطمینان
حاصل شود که
تنها یک
سگمنت
فقطخواندنی
و غیرکد
ایجاد
میگردد.
تنها زمانی
سودمند است
که همراه با
گزینه -z separate-code
به کار رود.
باینریهای
حاصل باید
کوچکتر از
زمانی
باشند که -z
separate-code
بهتنهایی
استفاده
میشود.
بدون این
گزینه، یا
اگر --no-rosegment
مشخص شود،
گزینه -z separate-code
دو سگمنت
فقطخواندنی
ایجاد
خواهد کرد،
یکی پیش از
سگمنت کد و
دیگری پس از
آن.
نام این گزینهها گمراهکننده است، اما بهمنظور سازگاری پیونددهنده با پیونددهندههای LLD و GOLD برگزیده شدهاند.
این گزینهها تنها در مقصدهای ELF پشتیبانی میشوند.
- -s
- --strip-all
- حذف تمامی اطلاعات نمادها از فایل خروجی.
- -S
- --strip-debug
- حذف اطلاعات نمادهای اشکالزدایی (اما نه همه نمادها) از فایل خروجی.
- --strip-discarded
- --no-strip-discarded
- حذف (یا عدم حذف) نمادهای سراسری تعریفشده در بخشهای دور انداختهشده. بهطور پیشفرض فعال است.
- -plugin-save-temps
- ذخیره دائمی فایلهای میانی "موقت" افزونه.
- -t
- --trace
- چاپ نام فایلهای ورودی همگام با پردازش آنها توسط ld. اگر -t دو بار مشخص شود، اعضای درون آرشیوها نیز چاپ میشوند. خروجی -t برای ایجاد فهرستی از تمام فایلهای شیء و اسکریپتهای درگیر در پیوند، برای مثال هنگام بستهبندی فایلها جهت گزارش اشکال پیونددهنده، سودمند است.
- -T scriptfile
- --script=scriptfile
- استفاده از
scriptfile
بهعنوان
اسکریپت
پیونددهنده.
این
اسکریپت
جایگزین
اسکریپت
پیشفرض
پیونددهنده
ld میشود
(بهجای
افزودن به
آن)، مگر
آنکه
اسکریپت
حاوی
"INSERT"
باشد،
بنابراین
commandfile باید
تمام موارد
لازم برای
توصیف فایل
خروجی را
مشخص کند.
اگر scriptfile در شاخه کنونی وجود نداشته باشد، "ld" در شاخههای مشخصشده توسط هر یک از گزینههای پیشین -L به دنبال آن میگردد.
گزینههای خط فرمانی که پیش از گزینه -T ظاهر میشوند میتوانند بر اسکریپت اثر بگذارند، اما گزینههای خط فرمانی که پس از آن میآیند اثری نخواهند داشت.
اگر گزینههای متعدد -T در حال افزودن به اسکریپت کنونی باشند تجمیع میشوند، در غیر این صورت آخرین گزینه غیرتکمیلی -T استفاده خواهد شد.
روشهای دیگری نیز برای تعیین اسکریپتهای پیونددهنده وجود دارد. رجوع کنید به
- -dT scriptfile
- --default-script=scriptfile
- استفاده از
scriptfile
بهعنوان
اسکریپت
پیشفرض
پیونددهنده.
این گزینه مشابه گزینه --script است، با این تفاوت که پردازش اسکریپت تا پس از پردازش بقیه خط فرمان به تعویق میافتد. این امر به گزینههایی که پس از گزینه --default-script در خط فرمان قرار گرفتهاند اجازه میدهد بر رفتار اسکریپت پیونددهنده اثر بگذارند، که در صورت عدم امکان کنترل مستقیم خط فرمان پیونددهنده توسط کاربر (مثلاً به دلیل ساختهشدن خط فرمان توسط ابزاری دیگر مانند gcc) میتواند حائز اهمیت باشد.
- -u symbol
- --undefined=symbol
- وادار کردن
symbol به ورود
در فایل
خروجی
بهعنوان
یک نماد
تعریفنشده.
انجام این
کار برای
نمونه ممکن
است موجب
آغاز پیوند
ماژولهای
اضافی از
کتابخانههای
استاندارد
شود. -u
میتواند
با
آرگومانهای
گزینهای
مختلف
تکرار شود
تا نمادهای
تعریفنشده
بیشتری
وارد شوند.
این گزینه
معادل
دستور
اسکریپت
پیونددهنده
"EXTERN" است.
اگر از این گزینه برای کشیدن ماژولهای اضافی به درون پیوند استفاده میشود، و تعریفنشده ماندن نماد یک خطا به شمار میآید، باید بهجای آن از گزینه --require-defined استفاده شود.
- --require-defined=symbol
- الزام میکند که symbol در پرونده خروجی تعریف شده باشد. این گزینه همانند گزینه --undefined است با این تفاوت که اگر symbol در پرونده خروجی تعریف نشده باشد، پیونددهنده خطایی صادر کرده و خارج میشود. همین اثر را میتوان در یک اسکریپت پیونددهنده با استفاده همزمان از "EXTERN"، "ASSERT" و "DEFINED" به دست آورد. این گزینه میتواند چندین بار برای الزام نمادهای بیشتر استفاده شود.
- -Ur
- برای
برنامههایی
که از
سازندهها
(constructors) یا
ویرانگرها
(destructors) استفاده
نمیکنند،
یا برای
سامانههای
بر پایه ELF
این گزینه
معادل -r
است: خروجی
با قابلیت
بازنشانی
(relocatable) تولید
میکند---یعنی
یک پرونده
خروجی که به
نوبه خود
میتواند
به عنوان
ورودی ld به
کار رود. با
این حال،
برای دیگر
پروندههای
دودویی،
گزینه -Ur
مشابه -r
است اما
ارجاعات به
سازندهها
و
ویرانگرها
را نیز
حلوفصل
میکند.
برای آن سامانههایی که -r و -Ur در آنها رفتار متفاوتی دارند، استفاده از -Ur روی پروندههایی که خودشان قبلاً با -Ur پیوند یافتهاند کار نمیکند؛ هنگامی که جدول سازنده ساخته شد، نمیتوان چیزی به آن افزود. از -Ur تنها برای آخرین پیوند جزئی، و از -r برای سایر موارد استفاده کنید.
- --orphan-handling=MODE
- کنترل
چگونگی
مدیریت
بخشهای
یتیم (orphan sections). یک
بخش یتیم
بخشی است که
بهطور
مشخص در
اسکریپت
پیونددهنده
ذکر نشده
باشد.
MODE میتواند هر یک از مقادیر زیر را داشته باشد:
- "place"
- بخشهای یتیم با پیروی از راهبرد شرح داده شده در بخشهای یتیم (Orphan Sections) در یک بخش خروجی مناسب قرار میگیرند. گزینه --unique نیز بر نحوه قرارگیری بخشها اثر میگذارد.
- "discard"
- تمام بخشهای یتیم با قرار داده شدن در بخش /DISCARD/ دور ریخته میشوند.
- "warn"
- پیونددهنده بخش یتیم را همانند "place" جایگذاری میکند و همچنین هشداری صادر مینماید.
- "error"
- پیونددهنده در صورت یافتن هرگونه بخش یتیم، با خطا خارج خواهد شد.
پیشفرض در صورت مشخص نشدن --orphan-handling مقدار "place" است.
- --unique[=SECTION]
- یک بخش خروجی جداگانه برای هر بخش ورودی منطبق با SECTION ایجاد میکند، یا در صورت عدم وجود آرگومان نویسه عام اختیاری SECTION، برای هر بخش ورودی یتیم. یک بخش یتیم بخشی است که بهطور مشخص در اسکریپت پیونددهنده نام برده نشده است. میتوانید این گزینه را چندین بار در خط فرمان استفاده کنید؛ این گزینه از ادغام عادی بخشهای ورودی همنام جلوگیری کرده و بر تخصیصهای بخش خروجی در یک اسکریپت پیونددهنده اولویت مییابد.
- -v
- --version
- -V
- شماره نگارش ld را نمایش میدهد. گزینه -V همچنین شبیهسازیهای پشتیبانیشده را فهرست میکند. همچنین شرح --enable-linker-version در Options,,Command-line Options را ببینید که میتواند برای درج رشته نگارش پیونددهنده در یک پرونده دودویی استفاده شود.
- -x
- --discard-all
- حذف تمام نمادهای محلی.
- -X
- --discard-locals
- حذف تمام نمادهای محلی موقت. (این نمادها با پیشوندهای برچسب محلی مختص به سامانه آغاز میشوند، معمولاً .L برای سامانههای ELF یا L برای سامانههای سنتی a.out.)
- -y symbol
- --trace-symbol=symbol
- نام هر
پرونده
پیوندشدهای
را که symbol در
آن ظاهر
میشود چاپ
میکند. این
گزینه
میتواند
به هر تعداد
بار داده
شود. در
بسیاری از
سامانهها
افزودن یک
خط زیرین (underscore)
به ابتدای
آن الزامی
است.
این گزینه زمانی مفید است که نماد تعریفنشدهای در پیوند خود دارید اما نمیدانید این ارجاع از کجا میآید.
- -Y path
- مسیر path را به مسیر پیشفرض جستجوی کتابخانه میافزاید. این گزینه برای سازگاری با Solaris وجود دارد.
- -z keyword
- کلمات کلیدی شناختهشده عبارتند از:
- call-nop=prefix-addr
- call-nop=suffix-nop
- call-nop=prefix-byte
- call-nop=suffix-byte
- پُرکردن (padding) ۱-بایتی "NOP" را هنگام تبدیل فراخوانی غیرمستقیم به یک تابع با تعریف محلی، foo، از طریق شکاف GOT آن مشخص میکند. call-nop=prefix-addr مقدار "0x67 call foo" را تولید میکند. call-nop=suffix-nop مقدار "call foo 0x90" را تولید میکند. call-nop=prefix-byte مقدار "byte call foo" را تولید میکند. call-nop=suffix-byte مقدار "call foo byte" را تولید میکند. برای i386 و x86_64 پشتیبانی میشود.
- cet-report=none
- cet-report=warning
- cet-report=error
- چگونگی گزارش ویژگیهای ناموجود GNU_PROPERTY_X86_FEATURE_1_IBT و GNU_PROPERTY_X86_FEATURE_1_SHSTK در بخش ورودی .note.gnu.property را مشخص میکند. cet-report=none، که پیشفرض است، باعث میشود پیونددهنده ویژگیهای ناموجود در پروندههای ورودی را گزارش نکند. cet-report=warning باعث میشود پیونددهنده برای ویژگیهای ناموجود در پروندههای ورودی هشدار صادر کند. cet-report=error باعث میشود پیونددهنده برای ویژگیهای ناموجود در پروندههای ورودی خطا صادر کند. توجه داشته باشید که ibt گزارش ویژگی ناموجود GNU_PROPERTY_X86_FEATURE_1_IBT را خاموش میکند و shstk گزارش ویژگی ناموجود GNU_PROPERTY_X86_FEATURE_1_SHSTK را خاموش میکند. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- combreloc
- nocombreloc
- ترکیب چندین بخش بازنشانی پویا و مرتبسازی آنها جهت بهبود حافظه پنهان جستجوی نماد پویا. اگر nocombreloc باشد این کار انجام نمیشود.
- common
- nocommon
- تولید نمادهای مشترک با نوع STT_COMMON در حین پیوند با قابلیت بازنشانی. در صورت تعیین nocommon از نوع STT_OBJECT استفاده میشود.
- common-page-size=value
- تنظیم پرکاربردترین اندازه صفحه روی value. چیدمان تصویر حافظه برای به حداقل رساندن صفحات حافظه بهینهسازی خواهد شد چنانچه سامانه از صفحاتی با این اندازه استفاده کند.
- defs
- گزارش ارجاعات حلنشده به نمادها از پروندههای شیء عادی. این کار حتی اگر پیونددهنده در حال ایجاد یک کتابخانه اشتراکی غیرنمادین باشد نیز انجام میگیرد. این گزینه معکوس -z undefs است.
- dynamic-undefined-weak
- nodynamic-undefined-weak
- پویا کردن نمادهای ضعیف تعریفنشده هنگام ساخت شیء پویا، در صورتی که از یک پرونده شیء عادی به آنها ارجاع داده شده باشد و بر اساس پدیداری یا نسخهبندی نماد به اجبار محلی نشده باشند. اگر nodynamic-undefined-weak باشد آنها را پویا نکنید. اگر هیچیک از دو گزینه مشخص نشده باشد، هدف ممکن است بهطور پیشفرض یکی از گزینهها را اعمال کند، یا گزینش دیگری از نمادهای ضعیف تعریفنشده را پویا سازد. همه هدفها از این گزینهها پشتیبانی نمیکنند.
- execstack
- شیء را به عنوان نیازمند پشته با قابلیت اجرا نشانهگذاری میکند.
- global
- این گزینه تنها هنگام ساخت یک شیء اشتراکی معنادار است. این گزینه نمادهای تعریفشده توسط این شیء اشتراکی را برای حلوفصل نماد در کتابخانههایی که متعاقباً بارگذاری میشوند در دسترس قرار میدهد.
- globalaudit
- این گزینه تنها هنگام ساخت یک پرونده اجرایی پویا معنادار است. این گزینه پرونده اجرایی را با تنظیم بیت "DF_1_GLOBAUDIT" در برچسب پویای "DT_FLAGS_1"، به عنوان نیازمند ممیزی سراسری نشانهگذاری میکند. ممیزی سراسری مستلزم آن است که هر کتابخانه ممیزی تعریفشده از طریق گزینههای خط فرمان --depaudit یا -P، برای تمامی اشیاء پویای بارگذاریشده توسط برنامه اجرا شود.
- ibtplt
- ورودیهای PLT فعالشده برای ردگیری انشعاب غیرمستقیم اینتل (IBT) تولید میکند. در Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- ibt
- تولید GNU_PROPERTY_X86_FEATURE_1_IBT در بخش .note.gnu.property برای نشان دادن سازگاری با IBT. این گزینه همچنین ibtplt را در بر دارد. در Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- indirect-extern-access
- noindirect-extern-access
- تولید
GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS در
بخش .note.gnu.property
برای نشان
دادن
اینکه
پرونده هدف
نیازمند
اشارهگرهای
متعارف
تابع است و
نمیتواند
با
بازنشانی
رونوشت
استفاده
شود. این
گزینه
همچنین
noextern-protected-data و nocopyreloc
را نیز در
بر دارد. در i386
و x86-64
پشتیبانی
میشود.
noindirect-extern-access ویژگی GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS را از بخش .note.gnu.property حذف میکند.
- initfirst
- این گزینه تنها هنگام ساخت یک شیء اشتراکی معنا دارد. شیء را به گونهای علامتگذاری میکند که مقداردهی اولیه زمان اجرای آن پیش از مقداردهی اولیه زمان اجرای هر شیء دیگری که همزمان به فرآیند آورده شده است رخ دهد. به همین ترتیب، پایاندهی زمان اجرای شیء پس از پایاندهی زمان اجرای دیگر اشیاء صورت میپذیرد.
- interpose
- مشخص میکند که بارگذار پویا باید ترتیب جستجوی نمادها را به گونهای تغییر دهد که نمادهای این کتابخانه اشتراکی بر تمام کتابخانههای اشتراکی دیگری که چنین علامتگذاری نشدهاند میانگذاری (interpose) شوند.
- unique
- nounique
- هنگام تولید یک کتابخانه اشتراکی یا دیگر اشیاء ELF با قابلیت بارگذاری پویا، آن را به عنوان شیئی علامتگذاری میکند که (به طور پیشفرض) باید تنها یک بار، و تنها در فضای نام اصلی (هنگام استفاده از "dlmopen") بارگذاری شود. این گزینه بیشتر برای نشانهگذاری کتابخانههای بنیادین همچون libc و libpthread و غیره به کار میرود که معمولاً به درستی عمل نمیکنند مگر آنکه تنها نمونه موجود از خود باشند. این رفتار میتواند توسط فراخواننده "dlmopen" نادیده گرفته شود و برای سازوکارهای بارگذاری خاص (همچون کتابخانههای حسابرسی) اعمال نمیگردد.
- lam-u48
- تولید GNU_PROPERTY_X86_FEATURE_1_LAM_U48 در بخش .note.gnu.property برای نشان دادن سازگاری با Intel LAM_U48. در Linux/x86_64 پشتیبانی میشود.
- lam-u57
- تولید GNU_PROPERTY_X86_FEATURE_1_LAM_U57 در بخش .note.gnu.property برای نشان دادن سازگاری با Intel LAM_U57. در Linux/x86_64 پشتیبانی میشود.
- lam-u48-report=none
- lam-u48-report=warning
- lam-u48-report=error
- تعیین چگونگی گزارش ویژگی ناموجود GNU_PROPERTY_X86_FEATURE_1_LAM_U48 در بخش ورودی .note.gnu.property. lam-u48-report=none که حالت پیشفرض است، سبب میشود پیونددهنده ویژگیهای ناموجود در پروندههای ورودی را گزارش نکند. lam-u48-report=warning سبب میشود پیونددهنده برای ویژگیهای ناموجود در پروندههای ورودی هشدار صادر کند. lam-u48-report=error سبب میشود پیونددهنده برای ویژگیهای ناموجود در پروندههای ورودی خطا صادر کند. در Linux/x86_64 پشتیبانی میشود.
- lam-u57-report=none
- lam-u57-report=warning
- lam-u57-report=error
- تعیین چگونگی گزارش ویژگی ناموجود GNU_PROPERTY_X86_FEATURE_1_LAM_U57 در بخش ورودی .note.gnu.property. lam-u57-report=none که حالت پیشفرض است، سبب میشود پیونددهنده ویژگیهای ناموجود در پروندههای ورودی را گزارش نکند. lam-u57-report=warning سبب میشود پیونددهنده برای ویژگیهای ناموجود در پروندههای ورودی هشدار صادر کند. lam-u57-report=error سبب میشود پیونددهنده برای ویژگیهای ناموجود در پروندههای ورودی خطا صادر کند. در Linux/x86_64 پشتیبانی میشود.
- lam-report=none
- lam-report=warning
- lam-report=error
- تعیین چگونگی گزارش ویژگیهای ناموجود GNU_PROPERTY_X86_FEATURE_1_LAM_U48 و GNU_PROPERTY_X86_FEATURE_1_LAM_U57 در بخش ورودی .note.gnu.property. گزینه lam-report=none که حالت پیشفرض است، سبب میشود پیونددهنده ویژگیهای ناموجود در پروندههای ورودی را گزارش نکند. lam-report=warning سبب میشود پیونددهنده برای ویژگیهای ناموجود در پروندههای ورودی هشدار صادر کند. lam-report=error سبب میشود پیونددهنده برای ویژگیهای ناموجود در پروندههای ورودی خطا صادر کند. در Linux/x86_64 پشتیبانی میشود.
- lazy
- هنگام تولید یک پرونده اجرایی یا کتابخانه اشتراکی، آن را علامتگذاری میکند تا به پیونددهنده پویا بگوید حل و فصل فراخوانی تابع را به زمان فراخوانی تابع موکول کند (پیوند تاخیری)، به جای اینکه در زمان بارگذاری انجام شود. پیوند تاخیری حالت پیشفرض است.
- loadfltr
- مشخص میکند که پالایههای شیء بلافاصله در زمان اجرا پردازش شوند.
- max-page-size=value
- تنظیم بیشینه اندازه صفحه حافظه پشتیبانیشده به value.
- mark-plt
- nomark-plt
- علامتگذاری مدخلهای PLT با برچسبهای پویا، DT_X86_64_PLT، DT_X86_64_PLTSZ و DT_X86_64_PLTENT. از آنجا که این گزینه مقداری غیرصفر را در فیلد r_addend از بازنشانیهای R_X86_64_JUMP_SLOT ذخیره میکند، پروندههای اجرایی و کتابخانههای اشتراکی حاصل با پیونددهندههای پویا ناسازگار خواهند بود؛ مانند آنهایی که در نگارشهای قدیمیتر glibc بدون تغییر نادیدهگرفتن r_addend در بازنشانیهای R_X86_64_GLOB_DAT و R_X86_64_JUMP_SLOT قرار دارند و فیلد r_addend مربوط به بازنشانیهای R_X86_64_JUMP_SLOT را نادیده نمیگیرند. در x86_64 پشتیبانی میشود.
- muldefs
- اجازه دادن به تعریفهای چندگانه.
- nocopyreloc
- غیرفعال کردن متغیرهای .dynbss تولیدشده توسط پیونددهنده که به جای متغیرهای تعریفشده در کتابخانههای اشتراکی به کار میروند. ممکن است منجر به بازنشانیهای متن پویا شود.
- nodefaultlib
- مشخص میکند که جستجوی بارگذار پویا برای یافتن وابستگیهای این شیء باید تمام مسیرهای پیشفرض جستجوی کتابخانه را نادیده بگیرد.
- nodelete
- مشخص میکند که شیء نباید در زمان اجرا تخلیه شود.
- nodlopen
- مشخص میکند که شیء در دسترس "dlopen" نیست.
- nodump
- مشخص میکند که شیء نمیتواند توسط "dldump" رونوشتبرداری (dump) شود.
- noexecstack
- شیء را به عنوان شیئی که نیازمند پشته اجرایی نیست علامتگذاری میکند.
- noextern-protected-data
- هنگام ساخت یک کتابخانه اشتراکی، با نمادهای داده حفاظتشده مانند نمادهای بیرونی رفتار نمیکند. این گزینه رفتار پیشفرض بخش پسین پیونددهنده را لغو میکند. میتوان از آن برای دور زدن بازنشانیهای نادرست تولیدشده توسط کامپایلر علیه نمادهای داده حفاظتشده استفاده کرد. بهروزرسانیهای انجامشده روی نمادهای داده حفاظتشده توسط ماژولی دیگر برای کتابخانه اشتراکی حاصل نمایان نخواهند بود. در i386 و x86-64 پشتیبانی میشود.
- noreloc-overflow
- غیرفعال کردن بررسی سرریز بازنشانی. اگر در زمان اجرا هیچ سرریز بازنشانی پویایی وجود نداشته باشد، میتوان از این گزینه برای غیرفعال کردن بررسی سرریز بازنشانی استفاده کرد. در x86_64 پشتیبانی میشود.
- memory-seal
- nomemory-seal
- به پرونده اجرایی یا کتابخانه اشتراکی دستور میدهد که تمامی بخشهای PT_LOAD باید مهر و موم شوند تا از دستکاری بیشتر (مانند تغییر پرچمهای حفاظت، اندازه بخش، یا حذف نگاشت) جلوگیری شود. این یک مقاومسازی امنیتی است که نیازمند پشتیبانی سیستم است. این کار GNU_PROPERTY_MEMORY_SEAL را در بخش .note.gnu.property تولید میکند
- now
- هنگام تولید یک پرونده اجرایی یا کتابخانه اشتراکی، آن را علامتگذاری میکند تا به پیونددهنده پویا بگوید به جای موکول کردن حل و فصل فراخوانی تابع به زمانی که تابع برای نخستین بار فراخوانی میشود، در زمان آغاز برنامه یا هنگام بارگذاری کتابخانه اشتراکی توسط dlopen تمام نمادها را حل و فصل کند.
- origin
- مشخص میکند که شیء نیازمند رسیدگی به $ORIGIN در مسیرها است.
- pack-relative-relocs
- nopack-relative-relocs
- تولید بازنشانی نسبی فشرده در پرونده اجرایی مستقل از موقعیت و کتابخانه اشتراکی. این کار مدخلهای "DT_RELR"، "DT_RELRSZ" و "DT_RELRENT" را به بخش پویا میافزاید. هنگام ساخت پرونده اجرایی وابسته به موقعیت و خروجی با قابلیت بازنشانی نادیده گرفته میشود. nopack-relative-relocs حالت پیشفرض است که بازنشانی نسبی فشرده را غیرفعال میکند. هنگام پیوند با کتابخانه C گنو، یک وابستگی نگارش نماد GLIBC_ABI_DT_RELR بر روی کتابخانه اشتراکی C به خروجی افزوده میشود. در i386 و x86-64 پشتیبانی میشود.
- relro
- norelro
- یک سرآیند قطعه "PT_GNU_RELRO" از نوع ELF در شیء ایجاد میکند. این گزینه قطعهای از حافظه را مشخص میکند که در صورت پشتیبانی، باید پس از بازنشانی بهصورت فقطخواندنی درآید. تعیین common-page-size کوچکتر از اندازه صفحه سامانه این محافظت را بیاثر میکند. در صورت استفاده از norelro، قطعه "PT_GNU_RELRO" ایجاد نمیشود.
- report-relative-reloc
- گزارش بازنشانیهای نسبی پویای تولیدشده توسط پیونددهنده. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- sectionheader
- nosectionheader
- تولید سرآیند بخش. در صورت استفاده از nosectionheader سرآیند بخش تولید نمیشود. sectionheader حالت پیشفرض است.
- separate-code
- noseparate-code
- یک سرآیند قطعه "PT_LOAD" کد جداگانه در شیء ایجاد میکند. این گزینه قطعهای از حافظه را مشخص میکند که باید تنها حاوی دستورالعملها بوده و باید در صفحاتی کاملاً مجزا از هر داده دیگری قرار گیرد. در صورت استفاده از noseparate-code، قطعه "PT_LOAD" با کد جداگانه ایجاد نمیشود.
- shstk
- تولید GNU_PROPERTY_X86_FEATURE_1_SHSTK در بخش .note.gnu.property جهت اعلام سازگاری با پشته سایه اینتل (Intel Shadow Stack). برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- stack-size=value
- تعیین اندازه پشته برای قطعه "PT_GNU_STACK" از نوع ELF. تعیین مقدار صفر، ایجاد هرگونه قطعه "PT_GNU_STACK" با اندازه پیشفرض غیرصفر را لغو میکند.
- start-stop-gc
- nostart-stop-gc
- هنگامی که --gc-sections فعال باشد، ارجاع از یک بخش نگهداشتهشده به "__start_SECNAME" یا "__stop_SECNAME" سبب نگهداشته شدن تمام بخشهای ورودی با نام "SECNAME" نیز میشود، مشروط بر آنکه "SECNAME" بهصورت شناسه C قابل نمایش بوده و هر یک از "__start_SECNAME" یا "__stop_SECNAME" توسط پیونددهنده تولید شده باشد. گزینه -z start-stop-gc این اثر را غیرفعال کرده و اجازه میدهد بخشها به گونهای جمعآوری (حذف) شوند که گویی نمادهای ساختگی ویژه تعریف نشدهاند. گزینه -z start-stop-gc اثری بر تعریف "__start_SECNAME" یا "__stop_SECNAME" در یک پرونده شیء یا اسکریپت پیونددهنده ندارد. چنین تعریفی مانع از ارائه نمادهای ساختگی "__start_SECNAME" یا "__stop_SECNAME" توسط پیونددهنده میشود و بنابراین رفتار ویژه جمعآوری زباله برای آن ارجاعات لغو میگردد.
- start-stop-visibility=value
- تعیین نمایانی نماد ELF برای نمادهای ساختگی "__start_SECNAME" و "__stop_SECNAME". مقدار value باید دقیقاً default، internal، hidden یا protected باشد. اگر هیچ گزینه -z start-stop-visibility داده نشود، جهت سازگاری با روال گذشته از protected استفاده میشود. با این حال، استفاده از -z start-stop-visibility=hidden در برنامهها و کتابخانههای مشترک جدید اکیداً توصیه میشود تا این نمادها به بیرون از اشیاء مشترک صادر نشوند، چرا که معمولاً چنین منظوری مد نظر نیست.
- text
- notext
- textoff
- گزارش خطا در صورتی که DT_TEXTREL تنظیم شده باشد، یعنی اگر شیء مشترک یا مستقل از موقعیت دارای بازنشانیهای پویا در بخشهای فقطخواندنی باشد. در صورت استفاده از notext یا textoff خطایی گزارش نمیشود.
- undefs
- عدم گزارش ارجاعات نماد حلنشده از پروندههای شیء معمولی، چه هنگام ایجاد فایل اجرایی و چه هنگام ایجاد کتابخانه مشترک. این گزینه معکوس -z defs است.
- unique-symbol
- nounique-symbol
- پرهیز از نامهای نماد محلی تکراری در جدول رشتههای نمادها. در صورت استفاده از unique-symbol، عبارت "."number"" به نامهای نمادهای محلی تکراری الحاق میشود. nounique-symbol حالت پیشفرض است.
- x86-64-baseline
- x86-64-v2
- x86-64-v3
- x86-64-v4
- تعیین سطح ISA مربوط به x86-64 مورد نیاز در بخش .note.gnu.property. x86-64-baseline نماد "GNU_PROPERTY_X86_ISA_1_BASELINE" را تولید میکند. x86-64-v2 نماد "GNU_PROPERTY_X86_ISA_1_V2" را تولید میکند. x86-64-v3 نماد "GNU_PROPERTY_X86_ISA_1_V3" را تولید میکند. x86-64-v4 نماد "GNU_PROPERTY_X86_ISA_1_V4" را تولید میکند. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- isa-level-report=none
- isa-level-report=all
- isa-level-report=needed
- isa-level-report=used
- تعیین نحوه گزارش سطوح ISA مربوط به x86-64 در پروندههای بازنشانیپذیر ورودی. isa-level-report=none که پیشفرض است، سبب میشود پیونددهنده سطوح ISA مربوط به x86-64 را در پروندههای ورودی گزارش نکند. isa-level-report=all سبب میشود پیونددهنده سطوح ISA مورد نیاز و استفادهشده x86-64 را در پروندههای ورودی گزارش کند. isa-level-report=needed سبب میشود پیونددهنده سطوح ISA مورد نیاز x86-64 را در پروندههای ورودی گزارش کند. isa-level-report=used سبب میشود پیونددهنده سطوح ISA استفادهشده x86-64 را در پروندههای ورودی گزارش کند. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
سایر کلیدواژهها جهت سازگاری با Solaris نادیده گرفته میشوند.
- --gnu-tls-tag
- --no-gnu-tls-tag
- افزودن وابستگی برچسب نسخه "GLIBC_ABI_GNU_TLS" در برنامهها و کتابخانههای مشترک خروجی هنگام پیوند با glibc، چنانچه پروندههای شیء بازنشانیپذیر ورودی "___tls_get_addr" را فراخوانی کنند. خروجی در زمان اجرا در برابر glibc که برچسب نسخه "GLIBC_ABI_GNU_TLS" را تعریف نکرده باشد، بارگیری و اجرا نخواهد شد. مگر آنکه با گزینه پیکربندی --disable-gnu-tls-tag در زمان ساخت پیونددهنده غیرفعال شده باشد، هنگامی که هیچ گزینهای تعیین نشده باشد، اگر ورودیها دارای فراخوانی "___tls_get_addr" باشند و libc.so نیز برچسب نسخه "GLIBC_ABI_GNU_TLS" را تعریف کرده باشد، پیونددهنده وابستگی برچسب نسخه "GLIBC_ABI_GNU_TLS" را خواهد افزود. برای Linux/i386 پشتیبانی میشود.
- --gnu2-tls-tag
- --no-gnu2-tls-tag
- افزودن وابستگی برچسب نسخه "GLIBC_ABI_GNU2_TLS" در برنامهها و کتابخانههای مشترک خروجی هنگام پیوند با glibc، اگر پروندههای شیء بازنشانیپذیر ورودی دارای بازنشانی "R_386_TLS_DESC_CALL" یا "R_X86_64_TLSDESC_CALL" باشند. خروجی در زمان اجرا در برابر glibc که برچسب نسخه "GLIBC_ABI_GNU2_TLS" را تعریف نکرده باشد، بارگیری و اجرا نخواهد شد. مگر آنکه با گزینه پیکربندی --disable-gnu2-tls-tag در زمان ساخت پیونددهنده غیرفعال شده باشد، هنگامی که گزینهای تعیین نشده باشد، چنانچه ورودیها دارای بازنشانی "R_386_TLS_DESC_CALL" یا "R_X86_64_TLSDESC_CALL" باشند و libc.so نیز برچسب نسخه "GLIBC_ABI_GNU2_TLS" را تعریف کرده باشد، پیونددهنده وابستگی برچسب نسخه "GLIBC_ABI_GNU2_TLS" را خواهد افزود. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- -( archives -)
- --start-group archives --end-group
- archives باید
فهرستی از
پروندههای
بایگانی
باشد. این
موارد
میتوانند
نامهای
صریح
پرونده یا
گزینههای
-l باشند.
بایگانیهای تعیینشده بهطور مکرر جستجو میشوند تا زمانی که هیچ ارجاع تعریفنشده جدیدی ایجاد نشود. بهطور معمول، یک بایگانی تنها یک بار و به همان ترتیبی که در خط فرمان تعیین شده است جستجو میشود. اگر به نمادی در آن بایگانی برای حل یک نماد تعریفنشده نیاز باشد که شیئی در یک بایگانی پس از آن در خط فرمان به آن ارجاع داده است، پیونددهنده قادر به حل آن ارجاع نخواهد بود. با گروهبندی بایگانیها، همگی بهطور مکرر مورد جستجو قرار میگیرند تا تمام ارجاعات ممکن حل شوند.
این گزینه درون یک جفت گزینه --start-lib/--end-lib مجاز نیست.
استفاده از این گزینه هزینه کارایی چشمگیری به همراه دارد. بهتر است تنها زمانی استفاده شود که ارجاعات حلقوی گریزناپذیر میان دو یا چند بایگانی وجود داشته باشد.
- --start-lib objects --end-lib
- objects باید
فهرستی از
پروندههای
شیء باشد.
با اشیاء مشخصشده به گونهای رفتار میشود که گویی اعضای یک بایگانی هستند که نام آن در جایگاه --start-lib در خط فرمان قرار گرفته است. تمام خصوصیات معمول پیونددهنده در مدیریت بایگانی و گزینههای خط فرمان برای چنین بایگانی ساختگیای اعمال میگردد.
این گزینه ممکن است چندین بار استفاده شود، که در این حالت با هر مجموعه از اشیاء مشخصشده به عنوان یک بایگانی جداگانه رفتار خواهد شد. با این حال تودرتو کردن این گزینه مجاز نیست.
گزینههایی که بر پردازش بایگانی اثر میگذارند، میان --start-lib و --end-lib مجاز نیستند، چرا که اعمال آنها در میانه رسیدگی به یک بایگانی بیمعنا خواهد بود. این گزینهها شامل موارد زیر هستند: -(/--start-group، -)/--end-group، --whole-archive و --no-whole-archive، و همچنین --pop-state در مواردی که حالت تنظیمات --whole-archive را تغییر دهد.
- --accept-unknown-input-arch
- --no-accept-unknown-input-arch
- به پیونددهنده میگوید فایلهای ورودی که معماری آنها قابل شناسایی نیست را بپذیرد. فرض بر این است که کاربر از کار خود آگاه است و عمداً میخواهد این فایلهای ورودی ناشناخته را پیوند دهد. این رفتار پیشفرض پیونددهنده پیش از نگارش 2.14 بود. رفتار پیشفرض از نگارش 2.14 به بعد رد کردن چنین فایلهای ورودی است، و بنابراین گزینهٔ --accept-unknown-input-arch برای بازگرداندن رفتار پیشین اضافه شده است.
- --as-needed
- --no-as-needed
- این گزینه
بر
برچسبهای
DT_NEEDED در قالب ELF
برای
کتابخانههای
پویای
ذکرشده در
خط فرمان پس
از گزینهٔ
--as-needed اثر
میگذارد.
در حالت
عادی،
پیونددهنده
برای هر
کتابخانهٔ
پویای
ذکرشده در
خط فرمان،
صرفنظر از
اینکه
واقعاً به
آن نیاز هست
یا نه، یک
برچسب DT_NEEDED
اضافه
میکند.
گزینهٔ --as-needed
سبب میشود
برچسب DT_NEEDED
تنها برای
کتابخانهای
درج شود که
در همان
نقطه از
پیوند یک
ارجاع نماد
تعریفنشدهٔ
غیرضعیف (non-weak)
را از یک
فایل شیء
عادی یا، در
صورتی که
کتابخانه
در
فهرستهای
DT_NEEDED دیگر
کتابخانههای
موردنیاز
یافت نشود،
از یک
کتابخانهٔ
پویای
موردنیاز
دیگر
برآورده
سازد.
فایلهای
شیء یا
کتابخانههایی
که در خط
فرمان پس
از
کتابخانهٔ
موردنظر
میآیند
تأثیری بر
موردنیاز
دیده شدن آن
کتابخانه
ندارند. این
قاعده
مشابه
قواعد
استخراج
فایلهای
شیء از
بایگانیها
است. گزینهٔ
--no-as-needed رفتار
پیشفرض را
بازمیگرداند.
نکته: در سامانههای مبتنی بر لینوکس، گزینهٔ --as-needed بر رفتار گزینههای --rpath و --rpath-link نیز اثر دارد. برای جزئیات بیشتر به توضیحات --rpath-link مراجعه کنید.
- --add-needed
- --no-add-needed
- این دو گزینه به دلیل شباهت نامهایشان با گزینههای --as-needed و --no-as-needed منسوخ شدهاند. آنها با --copy-dt-needed-entries و --no-copy-dt-needed-entries جایگزین شدهاند.
- -assert keyword
- این گزینه به منظور سازگاری با SunOS نادیده گرفته میشود.
- -Bdynamic
- -dy
- پیوند در برابر کتابخانههای پویا. این گزینه تنها در بسترهایی که کتابخانههای مشترک در آنها پشتیبانی میشوند معنا دارد. این گزینه معمولاً در چنین بسترهایی پیشفرض است. گونههای مختلف این گزینه برای سازگاری با سامانههای گوناگون است. میتوانید از این گزینه چندین بار در خط فرمان استفاده کنید: این گزینه بر جستجوی کتابخانه برای گزینههای -l که پس از آن میآیند اثر میگذارد.
- -Bgroup
- تنظیم پرچم "DF_1_GROUP" در مدخل "DT_FLAGS_1" در بخش پویا. این امر سبب میشود پیونددهندهٔ زمان اجرا جستجوها را در این شیء و وابستگیهای آن تنها در درون گروه انجام دهد. گزینهٔ --unresolved-symbols=report-all به طور ضمنی اعمال میشود. این گزینه تنها در بسترهای ELF که از کتابخانههای مشترک پشتیبانی میکنند معنا دارد.
- -Bstatic
- -dn
- -static
- عدم پیوند در برابر کتابخانههای مشترک. این گزینه تنها در بسترهایی که کتابخانههای مشترک در آنها پشتیبانی میشوند معنا دارد. گونههای مختلف این گزینه برای سازگاری با سامانههای گوناگون است. میتوانید این گزینه را چندین بار در خط فرمان به کار ببرید: این گزینه بر جستجوی کتابخانه برای گزینههای -l که پس از آن میآیند اثر میگذارد. همچنین این گزینه متضمن --unresolved-symbols=report-all است. این گزینه میتواند همراه با -shared استفاده شود. انجام این کار بدین معناست که یک کتابخانهٔ مشترک در حال ساخته شدن است اما تمام ارجاعات بیرونی کتابخانه باید با کشیدن مدخلها از کتابخانههای ایستا حل شوند.
- -Bsymbolic
- هنگام ساخت یک کتابخانهٔ مشترک، ارجاعات به نمادهای سراسری در صورت وجود به تعریف درون همان کتابخانهٔ مشترک مقید میشوند. به طور معمول، برای برنامهای که در برابر یک کتابخانهٔ مشترک پیوند یافته ممکن است که تعریف درون کتابخانهٔ مشترک را بازنویسی کند. این گزینه تنها در بسترهای ELF که از کتابخانههای مشترک پشتیبانی میکنند معنا دارد.
- -Bsymbolic-functions
- هنگام ساخت یک کتابخانهٔ مشترک، ارجاعات به نمادهای توابع سراسری در صورت وجود به تعریف درون همان کتابخانهٔ مشترک مقید میشوند. این گزینه تنها در بسترهای ELF که از کتابخانههای مشترک پشتیبانی میکنند معنا دارد.
- -Bno-symbolic
- این گزینه میتواند گزینههای مشخصشدهٔ پیشین -Bsymbolic و -Bsymbolic-functions را لغو کند.
- --dynamic-list=dynamic-list-file
- نام یک فایل
فهرست پویا
را به
پیونددهنده
مشخص
میکند. این
گزینه
معمولاً
هنگام ساخت
کتابخانههای
مشترک برای
تعیین
فهرستی از
نمادهای
سراسری که
ارجاعات
آنها
نباید به
تعریف درون
کتابخانهٔ
مشترک مقید
شود، یا
هنگام ساخت
فایلهای
اجرایی با
پیوند پویا
برای تعیین
فهرستی از
نمادها که
باید به
جدول
نمادها در
فایل
اجرایی
اضافه
شوند، به
کار میرود.
این گزینه
تنها در
بسترهای ELF
که از
کتابخانههای
مشترک
پشتیبانی
میکنند
معنا دارد.
قالب فهرست پویا همانند گره نسخه بدون دامنه و نام گره است. برای اطلاعات بیشتر VERSION را ببینید.
- --dynamic-list-data
- گنجاندن همهٔ نمادهای دادهای سراسری در فهرست پویا.
- --dynamic-list-cpp-new
- فراهم کردن فهرست پویای توکار برای عملگرهای new و delete در ++C. این گزینه عمدتاً برای ساخت libstdc++ مشترک کاربرد دارد.
- --dynamic-list-cpp-typeinfo
- فراهم کردن فهرست پویای توکار برای شناسایی نوع زمان اجرای ++C.
- --check-sections
- --no-check-sections
- از پیونددهنده میخواهد که پس از تخصیص نشانیهای بخشها، آنها را بررسی نکند تا همپوشانی احتمالی مشخص نشود. به طور معمول پیونددهنده این بررسی را انجام میدهد، و اگر هرگونه همپوشانی بیابد پیامهای خطای مناسبی تولید خواهد کرد. پیونددهنده دربارهٔ بخشها در روکشها (overlays) آگاه است و تمهیداتی برای آنها در نظر میگیرد. رفتار پیشفرض را میتوان با استفاده از کلید خط فرمانی --check-sections بازگرداند. همپوشانی بخشها معمولاً برای پیوندهای با جابهجاییپذیری (relocatable) بررسی نمیشود. در آن حالت میتوانید با استفاده از گزینهٔ --check-sections بررسی را اجباری کنید.
- --copy-dt-needed-entries
- --no-copy-dt-needed-entries
- این گزینه
بر نحوهٔ
برخورد با
کتابخانههای
پویایی که
برچسبهای
DT_NEEDED درون
کتابخانههای
پویای ELF
ذکرشده در
خط فرمان به
آنها
ارجاع
میدهند
اثر
میگذارد.
به طور
معمول،
پیونددهنده
برای هر
کتابخانهای
که در یک
برچسب DT_NEEDED در
یک
کتابخانهٔ
پویای
ورودی ذکر
شده باشد،
برچسب DT_NEEDED را
به باینری
خروجی
اضافه
نمیکند.
اما با
تعیین --copy-dt-needed-entries
در خط
فرمان،
مدخلهای DT_NEEDED
مربوط به هر
کتابخانهٔ
پویایی که
پس از آن
میآید
افزوده
خواهد شد.
رفتار
پیشفرض را
میتوان با
--no-copy-dt-needed-entries
بازگرداند.
این گزینه همچنین بر حل نمادها در کتابخانههای پویا اثر میگذارد. با --copy-dt-needed-entries، کتابخانههای پویای ذکرشده در خط فرمان به منظور حل نمادهای موردنیاز باینری خروجی، با دنبال کردن برچسبهای DT_NEEDED به دیگر کتابخانهها به صورت بازگشتی جستجو خواهند شد. اما با تنظیمات پیشفرض، جستجوی کتابخانههای پویایی که پس از آن میآیند به همان کتابخانهٔ پویا محدود شده و متوقف خواهد شد. هیچ پیوند DT_NEEDEDای برای حل نمادها پیمایش نخواهد شد.
- --cref
- تولید جدول
ارجاع
متقابل. اگر
فایل نگاشت
پیونددهنده
(map file) در حال
تولید
باشد، جدول
ارجاع
متقابل در
فایل نگاشت
چاپ میشود.
در غیر این
صورت، در
خروجی
استاندارد
چاپ خواهد
شد.
قالب جدول عمداً ساده در نظر گرفته شده تا در صورت نیاز پردازش آن با اسکریپت آسان باشد. نمادها به ترتیب نام چاپ میشوند. برای هر نماد فهرستی از نام فایلها آورده میشود. اگر نماد تعریف شده باشد، نخستین فایل فهرستشده محل تعریف آن است. اگر نماد به صورت یک مقدار مشترک (common value) تعریف شده باشد، هر فایلی که این اتفاق در آن رخ داده در ادامه میآید. در پایان، هر فایلی که به نماد ارجاع داده باشد فهرست میشود.
- --ctf-variables
- --no-ctf-variables
- قالب اطلاعات اشکالزدایی CTF از بخشی پشتیبانی میکند که نامها و انواع متغیرهای یافتشده در برنامه را که در هیچ جدول نمادی ظاهر نمیشوند، کدگذاری میکند. واضح است که این متغیرها توسط اشکالزداهای مرسوم بر اساس نشانی قابل جستجو نیستند، بنابراین فضای بهکاررفته برای انواع و نامهای آنها معمولاً هدر میرود: انواع معمولاً کوچک هستند اما نامها اغلب کوچک نیستند. گزینهٔ --ctf-variables سبب تولید چنین بخشی میشود. رفتار پیشفرض را میتوان با --no-ctf-variables بازگرداند.
- --ctf-share-types=method
- تنظیم روش بهکاررفته برای اشتراکگذاری انواع بین واحدهای ترجمه در CTF.
- تمام انواعی که تعاریف مبهم ندارند را در فرهنگ لغت مشترک قرار میدهد تا اشکالزداها بتوانند به راحتی به آنها دسترسی داشته باشند، حتی اگر تنها در یک واحد ترجمه رخ داده باشند. این حالت پیشفرض است.
- تنها نوعهایی را که در چندین واحد ترجمه رخ میدهند در فرهنگواژه مشترک قرار میدهد: نوعهایی با تنها یک تعریف به فرهنگواژههای اختصاصی هر واحد ترجمه میروند. نوعهایی با تعاریف چندگانه و مبهم در چندین واحد ترجمه همواره در فرهنگواژههای اختصاصی هر واحد ترجمه قرار میگیرند. این تمایل دارد حجم CTF را بزرگتر کند، اما ممکن است مقدار CTF را در فرهنگواژه مشترک کاهش دهد. برای پروژههای بسیار بزرگ، این کار ممکن است سرعت باز کردن CTF را افزایش دهد و در زمان اجرا حافظه مصرفی مصرفکننده CTF را صرفهجویی کند.
- --no-define-common
- این گزینه
از تخصیص
نشانی به
نمادهای
عمومی (Common)
جلوگیری
میکند.
دستور
اسکریپت
"INHIBIT_COMMON_ALLOCATION"
نیز همین
اثر را
دارد.
گزینه --no-define-common امکان جدا کردن تصمیمگیری برای تخصیص نشانی به نمادهای Common را از انتخاب نوع پرونده خروجی فراهم میسازد؛ در غیر این صورت، یک نوع خروجی غیرقابل بازاستقرار (non-Relocatable) تخصیص نشانی به نمادهای Common را اجباری میکند. استفاده از --no-define-common این امکان را میدهد که به نمادهای Common ارجاعشده از یک کتابخانه مشترک، تنها در برنامه اصلی نشانی تخصیص یابد. این کار فضای بلااستفاده تکراری در کتابخانه مشترک را از بین میبرد و همچنین از هرگونه سردرگمی احتمالی ناشی از حل اشتباه به نسخه تکراری نامناسب، هنگامی که پیمانههای پویای متعددی با مسیرهای جستجوی اختصاصی برای حل نماد در زمان اجرا وجود دارند، جلوگیری میکند.
- --force-group-allocation
- این گزینه موجب میشود پیونددهنده اعضای گروه بخش (section group) را مانند بخشهای ورودی عادی قرار دهد و گروههای بخش را حذف کند. این رفتار پیشفرض برای یک پیوند نهایی است، اما میتوان از این گزینه برای تغییر رفتار یک پیوند بازاستقرارپذیر (-r) استفاده کرد. دستور اسکریپت "FORCE_GROUP_ALLOCATION" اثر یکسانی دارد.
- --defsym=symbol=expression
- ایجاد یک
نماد
سراسری در
پرونده
خروجی،
حاوی نشانی
مطلقی که
توسط expression
مشخص شده
است.
میتوانید
از این
گزینه به
تعداد
دفعات مورد
نیاز برای
تعریف
چندین نماد
در خط فرمان
استفاده
کنید. شکل
محدودی از
محاسبات
ریاضی برای
expression در این
زمینه
پشتیبانی
میشود:
میتوانید
یک ثابت
هگزادسیمال
یا نام یک
نماد موجود
را ارائه
دهید، یا از
"+" و
"-" برای
جمع یا
تفریق
ثابتهای
هگزادسیمال
یا نمادها
استفاده
کنید. اگر
به
عبارتهای
پیچیدهتری
نیاز
دارید،
استفاده از
زبان فرمان
پیونددهنده
از طریق یک
اسکریپت را
در نظر
بگیرید.
یادداشت:
نباید هیچ
فاصلهای
بین symbol،
علامت
مساوی ("=") و
expression وجود
داشته باشد.
پیونددهنده آرگومانهای --defsym و -T را به ترتیب پردازش میکند؛ قرار دادن --defsym پیش از -T نماد را پیش از پردازش اسکریپت پیونددهنده حاصل از -T تعریف خواهد کرد، در حالی که قرار دادن --defsym پس از -T نماد را پس از پردازش اسکریپت پیونددهنده تعریف خواهد کرد. این تفاوت برای عبارتهای درون اسکریپت پیونددهنده که از نمادهای --defsym استفاده میکنند پیامدهایی دارد؛ اینکه کدام ترتیب درست است به آنچه میخواهید به آن دست یابید بستگی دارد.
- --demangle[=style]
- --no-demangle
- این گزینهها نمادزدایی (demangle) نام نمادها را در پیامهای خطا و سایر خروجیها واپایش میکنند. هنگامی که به پیونددهنده دستور نمادزدایی داده میشود، تلاش میکند تا نام نمادها را به شیوهای خوانا نمایش دهد: اگر قالب پرونده شیء از زیرخطهای آغازین استفاده کرده باشد، آنها را حذف میکند و نام نمادهای درهمریخته C++ (mangled) را به نامهای خوانا برای کاربر تبدیل میکند. کامپایلرهای گوناگون سبکهای درهمریزی (mangling) متفاوتی دارند. آرگومان اختیاری سبک نمادزدایی میتواند برای انتخاب سبک نمادزدایی مناسب برای کامپایلر شما به کار رود. پیونددهنده به طور پیشفرض نمادزدایی را انجام میدهد مگر اینکه متغیر محیطی COLLECT_NO_DEMANGLE تنظیم شده باشد. این گزینهها ممکن است برای لغو حالت پیشفرض استفاده شوند.
- -Ifile
- --dynamic-linker=file
- تنظیم نام پیونددهنده پویا. این گزینه تنها هنگام تولید پروندههای اجرایی ELF با پیوند پویا معنادار است. پیونددهنده پویای پیشفرض معمولاً درست است؛ از این گزینه استفاده نکنید مگر آنکه بدانید چه کاری انجام میدهید.
- --no-dynamic-linker
- هنگام تولید یک پرونده اجرایی، درخواست برای استفاده از یک پیونددهنده پویا در زمان بارگذاری را حذف میکند. این تنها برای پروندههای اجرایی ELF که حاوی بازاستقرارهای پویا هستند معنادار است، و معمولاً نیازمند کد نقطه ورود است که توانایی پردازش این بازاستقرارها را داشته باشد.
- --embedded-relocs
- این گزینه مشابه گزینه --emit-relocs است با این تفاوت که بازاستقرارها در یک بخش ویژه مقصد ذخیره میشوند. این گزینه تنها توسط مقصدهای BFIN، CR16 و M68K پشتیبانی میشود.
- --disable-multiple-abs-defs
- اجازه تعاریف چندگانه را برای نمادهای گنجانده شده در نام پرونده فراخوانی شده با -R یا --just-symbols نمیدهد.
- --fatal-warnings
- --no-fatal-warnings
- همه هشدارها را به عنوان خطا در نظر میگیرد. رفتار پیشفرض میتواند با گزینه --no-fatal-warnings بازیابی شود.
- -w
- --no-warnings
- هیچ پیام هشدار یا خطایی را نمایش نمیدهد. این گزینه در صورت فعال بودن --fatal-warnings، بر آن تقدم دارد. از این گزینه میتوان زمانی استفاده کرد که مشخص است باینری خروجی کار نخواهد کرد، اما همچنان نیاز به ایجاد آن وجود دارد.
- --force-exe-suffix
- اطمینان
حاصل
میکند که
پرونده
خروجی
پسوند .exe
داشته باشد.
اگر یک پرونده خروجی با پیوند کامل و موفق دارای پسوند ".exe" یا ".dll" نباشد، این گزینه پیونددهنده را مجبور میکند پرونده خروجی را با همان نام و با پسوند ".exe" کپی کند. این گزینه هنگام استفاده از makefileهای تغییرنیافته یونیکس بر روی یک میزبان مایکروسافت ویندوز مفید است، زیرا برخی از نسخههای ویندوز یک ایمیج را اجرا نمیکنند مگر آنکه با پسوند ".exe" خاتمه یابد.
- --gc-sections
- --no-gc-sections
- جمعآوری
زباله
(پاکسازی)
بخشهای
ورودی
بلااستفاده
را فعال
میکند. این
گزینه در
مقصدهایی
که از آن
پشتیبانی
نمیکنند
نادیده
گرفته
میشود.
رفتار
پیشفرض
(انجام
ندادن این
جمعآوری
زباله) را
میتوان با
تعیین --no-gc-sections
در خط فرمان
بازیابی
کرد. توجه
داشته
باشید که
جمعآوری
زباله برای
مقصدهای با
قالب COFF و PE
پشتیبانی
میشود،
اما
پیادهسازی
آن در حال
حاضر
آزمایشی در
نظر گرفته
میشود.
گزینه --gc-sections با بررسی نمادها و بازاستقرارها تصمیم میگیرد کدام بخشهای ورودی استفاده شدهاند. بخشی که حاوی نماد ورود است و تمامی بخشهای حاوی نمادهای تعریفنشده در خط فرمان نگهداشته خواهند شد، همانطور که بخشهای حاوی نمادهای ارجاعشده توسط شیءهای پویا نگهداشته میشوند. توجه داشته باشید که هنگام ساخت کتابخانههای مشترک، پیونددهنده باید فرض کند که به هر نماد قابل مشاهده ارجاع داده شده است. پس از تعیین این مجموعه اولیه از بخشها، پیونددهنده به صورت بازگشتی هر بخشی را که توسط بازاستقرارهای آنها ارجاع داده شده است به عنوان استفادهشده علامتگذاری میکند. --entry، --undefined و --gc-keep-exported را ببینید.
این گزینه را میتوان هنگام انجام یک پیوند جزئی (فعالشده با گزینه -r) تنظیم کرد. در این حالت ریشه نمادهای نگهداشته شده باید صراحتاً توسط یکی از گزینههای --entry، --undefined یا --gc-keep-exported یا توسط یک دستور "ENTRY" در اسکریپت پیونددهنده تعیین شود.
به عنوان یک افزونه GNU، بخشهای ورودی ELF که با پرچم "SHF_GNU_RETAIN" علامتگذاری شدهاند، جمعآوری زباله نخواهند شد.
- --print-gc-sections
- --no-print-gc-sections
- فهرست کردن تمام بخشهای حذفشده توسط جمعآوری زباله. این فهرست در stderr چاپ میشود. این گزینه تنها در صورتی مؤثر است که جمعآوری زباله از طریق گزینه --gc-sections فعال شده باشد. رفتار پیشفرض (فهرست نکردن بخشهای حذفشده) را میتوان با تعیین --no-print-gc-sections در خط فرمان بازیابی کرد.
- --gc-keep-exported
- هنگامی که --gc-sections فعال است، این گزینه از جمعآوری زباله بخشهای ورودی بلااستفاده که حاوی نمادهای سراسری با پدیداری (visibility) پیشفرض یا حفاظتشده هستند جلوگیری میکند. این گزینه برای پروندههای اجرایی در نظر گرفته شده است که در آنها بخشهای فاقد ارجاع، صرفنظر از پدیداری بیرونی نمادهای موجود در آنها، در غیر این صورت جمعآوری زباله میشدند. توجه داشته باشید که این گزینه هنگام پیوند اشیاء مشترک هیچ اثری ندارد زیرا این رفتار پیشفرض آنها است. این گزینه تنها برای مقصدهای قالب ELF پشتیبانی میشود.
- --print-output-format
- چاپ نام قالب خروجی پیشفرض (که احتمالاً تحت تأثیر دیگر گزینههای خط فرمان قرار گرفته است). این همان رشتهای است که در دستور اسکریپت پیونددهنده "OUTPUT_FORMAT" ظاهر میشود.
- --print-memory-usage
- چاپ اندازه
استفادهشده،
اندازه کل و
اندازه
استفادهشده
نواحی
حافظه
ایجادشده
با دستور MEMORY.
این گزینه
در مقصدهای
توکار برای
داشتن
نمایی سریع
از مقدار
حافظه آزاد
سودمند است.
قالب خروجی
دارای یک
سرفصل و یک
خط برای هر
ناحیه است.
این خروجی
هم برای
انسان
خوانا است و
هم به سادگی
توسط
ابزارها
قابل تجزیه
است. در
اینجا
نمونهای
از خروجی
آورده شده
است:
Memory region Used Size Region Size %age Used ROM: 256 KB 1 MB 25.00% RAM: 32 B 2 GB 0.00%یادداشت: اگر میخواهید از میزان مصرف حافظه خود پیونددهنده آگاه شوید، گزینه --stats این کار را انجام خواهد داد.
- --help
- چاپ خلاصهای از گزینههای خط فرمان در خروجی استاندارد و خروج.
- --target-help
- چاپ خلاصهای از تمامی گزینههای ویژهی مقصد (target-specific) در خروجی استاندارد و خروج.
- -Map=mapfile
- چاپ یک
نقشهی
پیوند در
پروندهی
mapfile. شرح
گزینهی -M
در بالا را
ببینید. اگر
mapfile تنها
نویسهی
"-"
باشد،
نقشهی
پیوند در stdout
نوشته
خواهد شد.
مشخص کردن یک شاخه به عنوان mapfile سبب میشود نقشهی پیونددهنده به صورت پروندهای درون آن شاخه نوشته شود. معمولاً نام پرونده درون شاخه به عنوان نام پایهی (basename) پروندهی output به همراه پسوند افزوده شدهی ".map" محاسبه میشود. با این حال، اگر نویسهی ویژهی "%" به کار رود، با مسیر کامل پروندهی خروجی جایگزین خواهد شد. علاوه بر این، اگر هر نویسهای پس از نماد % بیاید، ".map" دیگر افزوده نخواهد شد.
-o foo.exe -Map=bar [Creates ./bar] -o ../dir/foo.exe -Map=bar [Creates ./bar] -o foo.exe -Map=../dir [Creates ../dir/foo.exe.map] -o ../dir2/foo.exe -Map=../dir [Creates ../dir/foo.exe.map] -o foo.exe -Map=% [Creates ./foo.exe.map] -o ../dir/foo.exe -Map=% [Creates ../dir/foo.exe.map] -o foo.exe -Map=%.bar [Creates ./foo.exe.bar] -o ../dir/foo.exe -Map=%.bar [Creates ../dir/foo.exe.bar] -o ../dir2/foo.exe -Map=../dir/% [Creates ../dir/../dir2/foo.exe.map] -o ../dir2/foo.exe -Map=../dir/%.bar [Creates ../dir/../dir2/foo.exe.bar]
مشخص کردن بیش از یک نویسهی "%" خطا است.
اگر پروندهی نقشه از پیش وجود داشته باشد، توسط این عملیات بازنویسی خواهد شد.
- --no-keep-memory
- ld بهطور معمول با کش کردن جدول نمادهای پروندههای ورودی در حافظه، سرعت را بر مصرف حافظه ترجیح میدهد. این گزینه به ld اعلام میکند که در عوض با بازخوانی جدولهای نماد در صورت نیاز، برای مصرف حافظه بهینهسازی کند. این گزینه ممکن است هنگامی که ld در حین پیوند دادن یک پروندهی اجرایی بزرگ با کمبود فضای حافظه روبرو میشود، مورد نیاز باشد.
- --no-undefined
- -z defs
- گزارش
مراجع نماد
حلنشده از
پروندههای
شیء معمولی.
این کار حتی
اگر
پیونددهنده
در حال
ایجاد یک
کتابخانهی
اشتراکی
غیرنمادین
(non-symbolic) باشد نیز
انجام
میشود.
سوئیچ
--[no-]allow-shlib-undefined
رفتار
گزارش
مراجع
حلنشدهی
یافتشده
در
کتابخانههای
اشتراکی
پیوند داده
شده را
واپایش
میکند.
اثرات این گزینه میتواند با استفاده از "-z undefs" بازگردانده شود.
- --allow-multiple-definition
- -z muldefs
- بهطور معمول هنگامی که یک نماد چندین بار تعریف شده باشد، پیونددهنده یک خطای مهلک گزارش میدهد. این گزینهها اجازهی تعاریف چندگانه را میدهند و نخستین تعریف استفاده خواهد شد.
- --allow-shlib-undefined
- --no-allow-shlib-undefined
- اجازه دادن
یا ندادن به
نمادهای
تعریفنشده
در
کتابخانههای
اشتراکی.
این سوئیچ
شبیه به --no-undefined
است، به جز
اینکه
رفتار را
هنگامی
تعیین
میکند که
نمادهای
تعریفنشده
به جای
پروندهی
شیء
معمولی، در
یک
کتابخانهی
اشتراکی
باشند. این
گزینه بر
نحوهی
مدیریت
نمادهای
تعریفنشده
در
پروندههای
شیء معمولی
تأثیری
ندارد.
رفتار پیشفرض این است که اگر پیونددهنده برای ایجاد یک پروندهی اجرایی به کار میرود، خطاهایی برای هر نماد تعریفنشدهی مرجع در کتابخانههای اشتراکی گزارش دهد، اما اگر پیونددهنده برای ایجاد یک کتابخانهی اشتراکی به کار میرود، به آنها اجازه دهد.
دلایل اجازه دادن به مراجع نماد تعریفنشده در کتابخانههای اشتراکی مشخصشده در زمان پیوند این است که:
- یک کتابخانهی اشتراکی مشخصشده در زمان پیوند ممکن است با کتابخانهای که در زمان بارگذاری موجود است یکسان نباشد، بنابراین نماد ممکن است در واقع در زمان بارگذاری قابل حل باشد.
- برخی
سیستمعاملها
مانند BeOS و HPPA
وجود دارند
که در آنها
نمادهای
تعریفنشده
در
کتابخانههای
اشتراکی
عادی است.
برای نمونه، هستهی BeOS کتابخانههای اشتراکی را در زمان بارگذاری وصلهکاری میکند تا هر تابعی را که برای معماری کنونی مناسبتر است انتخاب نماید. این سازوکار به عنوان مثال برای انتخاب پویای یک تابع memset مناسب به کار میرود.
- --error-handling-script=scriptname
- اگر این
گزینه مشخص
شود،
پیونددهنده
هرگاه
خطایی رخ
دهد scriptname را
فراخوانی
میکند. با
این حال، در
حال حاضر
تنها دو نوع
خطا
پشتیبانی
میشوند:
نمادهای
مفقود و
کتابخانههای
مفقود. دو
آرگومان به
اسکریپت
ارسال
خواهد شد:
کلیدواژهی
"undefined-symbol" یا `missing-lib" و
name نماد
تعریفنشده
یا
کتابخانهی
مفقود. هدف
این است که
اسکریپت
پیشنهادهایی
به کاربر
ارائه دهد
مبنی بر
اینکه
نماد یا
کتابخانه
ممکن است در
کجا یافت
شود. پس از
پایان
اجرای
اسکریپت،
پیام خطای
معمول
پیونددهنده
نمایش داده
خواهد شد.
دسترسپذیری این گزینه با یک سوئیچ زمان پیکربندی (configure time switch) واپایش میشود، بنابراین ممکن است در پیادهسازیهای خاص وجود نداشته باشد.
- --no-undefined-version
- بهطور معمول هنگامی که یک نماد دارای نگارش تعریفنشده باشد، پیونددهنده آن را نادیده میگیرد. این گزینه نمادهای دارای نگارش تعریفنشده را منع میکند و در عوض یک خطای مهلک صادر خواهد شد.
- --default-symver
- ایجاد و استفاده از یک نگارش نماد پیشفرض (همان soname) برای نمادهای صادرشدهی بدون نگارش.
- --default-imported-symver
- ایجاد و استفاده از یک نگارش نماد پیشفرض (همان soname) برای نمادهای واردشدهی بدون نگارش.
- --no-warn-mismatch
- بهطور معمول اگر تلاش کنید پروندههای ورودی را که بنا به دلایلی با یکدیگر ناهمخوان هستند (شاید به این دلیل که برای پردازندههای مختلف یا ترتیب بایتهای (endianness) متفاوتی کامپایل شدهاند) به هم پیوند دهید، ld خطا خواهد داد. این گزینه به ld میگوید که باید در سکوت به چنین خطاهای احتمالی اجازه دهد. این گزینه تنها باید با احتیاط به کار رود، در مواردی که اقدام خاصی انجام دادهاید که اطمینان میدهد خطاهای پیونددهنده نابجا هستند.
- --no-warn-search-mismatch
- بهطور معمول اگر ld در هنگام جستجوی کتابخانه یک کتابخانهی ناسازگار بیابد، هشدار خواهد داد. این گزینه این هشدار را خاموش میکند.
- --no-whole-archive
- غیرفعال کردن اثر گزینهی --whole-archive برای پروندههای آرشیو بعدی. درون یک جفتگزینهی --start-lib/--end-lib مجاز نیست.
- --no-link-mapless
- رد کردن آرشیوهایی که فاقد نمایه یا همان نقشهی نماد هستند برای تمامی آرشیوهای بعدی ارجاعشده در خط فرمان. اگر چنین پروندهای مشاهده شود، خطای پیوند رخ میدهد. این رفتار سنتی است.
- --noinhibit-exec
- نگهداشتن پروندهی خروجی اجرایی هر زمان که همچنان قابل استفاده باشد. بهطور معمول، اگر پیونددهنده در طول فرایند پیوند با خطا روبرو شود پروندهی خروجی تولید نخواهد کرد؛ هنگامی که هرگونه خطایی صادر کند، بدون نوشتن پروندهی خروجی خارج میشود.
- -nostdlib
- تنها جستجو در شاخههای کتابخانهای که بهصراحت در خط فرمان مشخص شدهاند. شاخههای کتابخانهای مشخصشده در اسکریپتهای پیونددهنده (از جمله اسکریپتهای پیونددهندهی مشخصشده در خط فرمان) نادیده گرفته میشوند.
- --oformat=output-format
- ld ممکن است به گونهای پیکربندی شده باشد که از بیش از یک نوع پروندهی شیء پشتیبانی کند. اگر ld شما بدین صورت پیکربندی شده باشد، میتوانید از گزینهی --oformat برای تعیین قالب باینری پروندهی شیء خروجی استفاده کنید. حتی هنگامی که ld برای پشتیبانی از قالبهای شیء جایگزین پیکربندی شده باشد، معمولاً نیازی به تعیین این گزینه ندارید، چرا که ld باید پیکربندی شده باشد تا رایجترین قالب را در هر ماشین به عنوان قالب خروجی پیشفرض تولید کند. output-format یک رشتهی متنی است که نام یک قالب ویژه و پشتیبانیشده توسط کتابخانههای BFD را مشخص میکند. (میتوانید قالبهای باینری موجود را با objdump -i فهرست کنید.) دستور اسکریپت "OUTPUT_FORMAT" نیز میتواند قالب خروجی را مشخص کند، اما این گزینه بر آن اولویت دارد.
- --out-implib file
- ایجاد یک کتابخانهی واردات (import library) در file متناظر با پروندهی اجرایی که پیونددهنده در حال تولید آن است (برای نمونه یک برنامه یا DLL در ELF). این کتابخانهی واردات (که برای DLLها باید "*.dll.a" یا "*.a" نامیده شود) ممکن است برای پیوند دادن کلاینتها با پروندهی اجرایی تولیدشده به کار رود؛ این رفتار این امکان را فراهم میسازد که از مرحلهی ایجاد جداگانهی کتابخانهی واردات (مانند "dlltool" برای DLLها) صرفنظر شود. این گزینه تنها برای پورتهای مقصد PE و ELF در پیونددهنده موجود است.
- -pie
- --pic-executable
- ایجاد یک پروندهی اجرایی مستقل از موقعیت (position independent executable). این قابلیت در حال حاضر تنها روی بسترهای ELF پشتیبانی میشود. پروندههای اجرایی مستقل از موقعیت توسط پیونددهندهی پویا به نشانی مجازی که سیستمعامل برای آنها برمیگزیند بازنشانی (relocate) میشوند که میتواند بین فراخوانیها متفاوت باشد. آنها در سرآیند پروندهی ELF با ET_DYN نشانهگذاری میشوند، اما از چند جهت با کتابخانههای اشتراکی تفاوت دارند. به ویژه، نمادهای تعریفشده در یک PIE بهطور پیشفرض نمیتوانند توسط شیء دیگری جایگزین (override) شوند، برخلاف آنچه در کتابخانههای اشتراکی ممکن است.
- -no-pie
- ایجاد یک پروندهی اجرایی وابسته به موقعیت (position dependent executable). این حالت پیشفرض است.
- -qmagic
- این گزینه جهت سازگاری با لینوکس نادیده گرفته میشود.
- -Qy
- این گزینه جهت سازگاری با SVR4 نادیده گرفته میشود.
- --relax
- --no-relax
- گزینهای
با اثرات
وابسته به
ماشین. این
گزینه تنها
روی چند هدف
پشتیبانی
میشود.
در برخی بسترها گزینه --relax بهینهسازیهای سراسری و مختص هدفی را انجام میدهد که پس از حلوفصل آدرسدهی برنامه توسط پیونددهنده ممکن میشوند؛ همچون تعدیل حالتهای آدرسدهی، ترکیب دستورالعملهای جدید، گزینش نسخه کوتاهتر دستورالعملهای فعلی و ادغام مقادیر ثابت.
در برخی بسترها این بهینهسازیهای سراسری زمان پیوند ممکن است اشکالزدایی نمادین فایل اجرایی نهایی را ناممکن سازد. مشخص است که این مورد برای خانواده پردازندههای Matsushita MN10200 و MN10300 رخ میدهد.
در بسترهایی که این ویژگی پشتیبانی میشود، گزینه --no-relax آن را غیرفعال خواهد کرد.
در بسترهایی که این ویژگی پشتیبانی نمیشود، هر دو گزینه --relax و --no-relax پذیرفته میشوند، اما نادیده گرفته خواهند شد.
- --retain-symbols-file=filename
- تنها
نمادهای
فهرستشده
در فایل filename
را نگه
میدارد و
سایر
نمادها را
دور
میریزد. filename
صرفاً یک
فایل متنی
ساده با یک
نام نماد در
هر سطر است.
این گزینه
بهویژه در
محیطهایی
(مانند VxWorks)
سودمند است
که در آنها
جدول
نمادهای
سراسری
بزرگی
بهتدریج
انباشته
میشود، تا
در حافظه
زمان اجرا
صرفهجویی
شود.
گزینه --retain-symbols-file نمادهای تعریفنشده یا نمادهای مورد نیاز برای بازنشانیها را دور نمیاندازد.
شما تنها میتوانید یک بار --retain-symbols-file را در خط فرمان مشخص کنید. این گزینه بر -s و -S اولویت دارد و آنها را لغو میکند.
- -rpath=dir
- افزودن یک
شاخه به
مسیر
جستجوی
کتابخانههای
زمان اجرا.
این مورد
هنگام
پیوند دادن
یک فایل
اجرایی ELF با
اشیاء
اشتراکی
استفاده
میشود.
تمام
آرگومانهای
-rpath به
یکدیگر
متصل شده و
به
پیونددهنده
زمان اجرا
فرستاده
میشوند،
که از آنها
برای یافتن
اشیاء
اشتراکی در
زمان اجرا
بهره
میبرد.
گزینه -rpath همچنین هنگام یافتن اشیاء اشتراکی مورد نیاز اشیاء اشتراکی صریحاً گنجاندهشده در پیوند به کار میرود؛ شرح گزینه -rpath-link را ببینید. جستجوی -rpath به این شیوه تنها توسط پیونددهندههای بومی (native) و پیونددهندههای متقاطع (cross) که با گزینه --with-sysroot پیکربندی شدهاند پشتیبانی میشود.
اگر هنگام پیوند یک فایل اجرایی ELF از -rpath استفاده نشود، محتویات متغیر محیطی "LD_RUN_PATH" در صورت تعریف شدن به کار گرفته خواهد شد.
گزینه -rpath ممکن است در SunOS نیز استفاده شود. به طور پیشفرض، در SunOS، پیونددهنده یک مسیر جستجوی زمان اجرا را از تمام گزینههای -L ارائهشده تشکیل میدهد. اگر یک گزینه -rpath استفاده شود، مسیر جستجوی زمان اجرا منحصراً با استفاده از گزینههای -rpath تشکیل میشود و گزینههای -L نادیده گرفته میشوند. این میتواند هنگام استفاده از gcc مفید باشد، که گزینههای -L متعددی میافزاید که ممکن است روی سامانههای پرونده متصلشده از طریق NFS باشند.
جهت سازگاری با سایر پیونددهندههای ELF، اگر گزینه -R به جای یک نام فایل توسط یک نام شاخه دنبال شود، به عنوان گزینه -rpath رفتار خواهد شد.
- -rpath-link=dir
- هنگام
استفاده از
ELF یا SunOS، یک
کتابخانه
اشتراکی
ممکن است به
کتابخانه
دیگری نیاز
داشته باشد.
این زمانی
رخ میدهد
که پیوند
"ld -shared"
شامل یک
کتابخانه
اشتراکی به
عنوان یکی
از
فایلهای
ورودی باشد.
هنگامی که پیونددهنده در جریان یک پیوند غیراشتراکی و غیرقابلبازنشانی با چنین وابستگیای مواجه میشود، اگر آن کتابخانه اشتراکی صریحاً گنجانده نشده باشد، به طور خودکار تلاش خواهد کرد آن را یافته و در پیوند بگنجاند. در چنین حالتی، چندین شاخه به ترتیبی که در زیر شرح داده شده است جستجو میشوند. گزینه -rpath-link نخستین مجموعه از شاخهها را برای جستجو مشخص میکند. این گزینه میتواند توالیای از نام شاخهها را چه با ارائه فهرستی از نامهای جداشده با دونقطه یا با تکرار چندباره مشخص کند.
نشانههای $ORIGIN و $LIB میتوانند در این شاخههای جستجو ظاهر شوند. در مورد $ORIGIN آنها با مسیر کامل شاخه حاوی برنامه یا شیء اشتراکی جایگزین خواهند شد و در مورد $LIB با lib - برای دودوییهای ۳۲ بیتی - یا lib64 - برای دودوییهای ۶۴ بیتی - جایگزین میشوند.
شکل جایگزین این نشانهها - ${ORIGIN} و ${LIB} نیز میتواند به کار رود. نشانه $PLATFORM پشتیبانی نمیشود.
گزینه --rpath-link باید با احتیاط استفاده شود چرا که مسیر جستجویی را که ممکن است به صورت ثابت در یک کتابخانه اشتراکی کامپایل شده باشد لغو میکند. در چنین حالتی ممکن است ناخواسته مسیر جستجویی متفاوت با آنچه پیونددهنده زمان اجرا استفاده میکرد به کار گرفته شود.
هنگامی که کتابخانههای اشتراکی اضافی مورد نیاز باشند، پیونددهنده شاخهها را به ترتیبی که در زیر فهرست شده است برای یافتن آنها جستجو میکند. توجه داشته باشید که این امر تنها برای کتابخانههای اضافی مورد نیاز برای برآوردن کتابخانههای اشتراکی از پیش گنجاندهشده اعمال میشود. این شامل کتابخانههایی که از طریق گزینه خط فرمان -l گنجانده شدهاند نمیشود. جستجو برای کتابخانههای -l تنها در شاخههای مشخصشده با گزینه -L انجام میگیرد.
- 1.
- هر شاخه مشخصشده توسط گزینههای -rpath-link.
- 2.
- هر شاخه مشخصشده توسط گزینههای -rpath. تفاوت میان -rpath و -rpath-link در این است که شاخههای مشخصشده توسط گزینههای -rpath در فایل اجرایی گنجانده شده و در زمان اجرا به کار میروند، در حالی که گزینه -rpath-link تنها در زمان پیوند اثرگذار است. جستجوی -rpath به این شیوه تنها توسط پیونددهندههای بومی و پیونددهندههای متقاطع که با گزینه --with-sysroot پیکربندی شدهاند پشتیبانی میشود.
- 3.
- در سامانههای ELF، برای پیونددهندههای بومی، اگر از گزینههای -rpath و -rpath-link استفاده نشده باشد، محتویات متغیر محیطی "LD_RUN_PATH" جستجو میشود.
- 4.
- در SunOS، اگر از گزینه -rpath استفاده نشده باشد، هر شاخه مشخصشده با گزینههای -L جستجو میشود.
- 5.
- برای پیونددهنده بومی، محتویات متغیر محیطی "LD_LIBRARY_PATH" جستجو میشود.
- 6.
- برای پیونددهنده بومی ELF، شاخههای موجود در "DT_RUNPATH" یا "DT_RPATH" یک کتابخانه اشتراکی برای کتابخانههای اشتراکی مورد نیازش جستجو میشوند. در صورت وجود ورودیهای "DT_RUNPATH"، ورودیهای "DT_RPATH" نادیده گرفته میشوند.
- 7.
- برای پیونددهنده سامانه لینوکس، اگر فایل /etc/ld.so.conf موجود باشد، فهرست شاخههای موجود در آن فایل. نکته: مسیر این فایل با مقدار "sysroot" (در صورت تعریف شدن) و سپس هر رشته "prefix" در صورتی که پیونددهنده با گزینه --prefix=<path> پیکربندی شده باشد، پیشوندگذاری میشود.
- 8.
- برای پیونددهنده بومی در سامانه FreeBSD، هر شاخه مشخصشده با ماکروی "_PATH_ELF_HINTS" که در فایل سرآیند elf-hints.h تعریف شده است.
- 9.
- هر شاخه مشخصشده با دستور "SEARCH_DIR" در یک دستنوشته پیونددهنده دادهشده در خط فرمان، از جمله دستنوشتههای مشخصشده با -T (اما نه -dT).
- 10.
- شاخههای پیشفرض، معمولاً /lib و /usr/lib.
- 11.
- هر شاخه مشخصشده توسط یک افزونه LDPT_SET_EXTRA_LIBRARY_PATH.
- 12.
- هر شاخه مشخصشده توسط یک دستور "SEARCH_DIR" در دستنوشته پیشفرض پیونددهنده.
با این حال در سامانههای مبتنی بر لینوکس یک نکته دیگر نیز وجود دارد: اگر گزینه --as-needed فعال باشد و کتابخانه اشتراکیای یافت شود که در حالت عادی پاسخگوی جستجو باشد و این کتابخانه برچسب DT_NEEDED برای libc.so نداشته باشد و کتابخانه اشتراکی دیگری در ادامه مجموعه شاخههای جستجو موجود باشد که آن نیز پاسخگوی جستجو باشد و این کتابخانه دوم دارای برچسب DT_NEEDED برای libc.so باشد، آنگاه کتابخانه دوم به جای اولی گزینش خواهد شد.
اگر کتابخانه اشتراکی مورد نیاز یافت نشود، پیونددهنده یک هشدار صادر کرده و به پیونددهی ادامه میدهد.
- --section-ordering-file=script
- این گزینه
برای گسترش
دستنوشته
پیونددهنده
فعلی با
نگاشت
اضافی
بخشهای
ورودی به
بخشهای
خروجی
استفاده
میشود. این
فایل باید
برای
"SECTIONS" از
همان نحوی
استفاده
کند که در
دستنوشتههای
معمولی
پیونددهنده
به کار
میرود،
اما نباید
کاری جز
قرار دادن
بخشهای
ورودی درون
بخشهای
خروجی
انجام دهد.
@pxref{SECTIONS}
محدودیت دوم در دستنوشته ترتیببندی بخشها این است که تنها میتواند به بخشهای خروجیای ارجاع دهد که پیشتر در هر دستنوشته پیونددهندهای که در حال حاضر استفاده میشود تعریف شده باشند. (یعنی دستنوشته پیشفرض پیونددهنده یا دستنوشته مشخصشده در خط فرمان). مزیت دستنوشته ترتیببندی بخشها با این حال در این است که بخشهای ورودی به ابتدای بخشهای خروجی نگاشت میشوند، تا بتوانند ترتیب بخشها را در بخش خروجی تضمین نمایند. برای نمونه، تصور کنید که دستنوشته پیشفرض پیونددهنده اینگونه باشد:
SECTIONS { .text : { *(.text.hot) ; *(.text .text.*) } .data : { *(.data.big) ; *(.data .data.*) } }سپس اگر یک فایل ترتیببندی بخش مانند این به کار رود:
.text : { *(.text.first) ; *(.text.z*) } .data : { foo.o(.data.first) ; *(.data.small) }این معادل یک دستنوشته پیونددهنده به شکل زیر خواهد بود:
SECTIONS { .text : { *(.text.first) ; *(.text.z*) ; *(.text.hot) ; *(.text .text.*) } .data : { foo.o(.data.first) ; *(.data.small) ; *(.data.big) ; *(.data .data.*) } }مزیت فایل ترتیببندی بخشها این است که میتوان از آن برای ترتیببندی بخشهایی که برای کاربر اهمیت دارند استفاده کرد بدون نیاز به نگرانی درباره سایر بخشها، نواحی حافظه، یا هر چیز دیگر.
- یک کتابخانه اشتراکی (shared library) ایجاد میکند. این قابلیت در حال حاضر تنها روی بسترهای ELF، XCOFF و SunOS پشتیبانی میشود. در SunOS، پیونددهنده در صورتی که گزینه -e استفاده نشود و نمادهای تعریفنشدهای در پیوند وجود داشته باشند، بهطور خودکار یک کتابخانه اشتراکی ایجاد خواهد کرد.
- --sort-common
- --sort-common=ascending
- --sort-common=descending
- این گزینه به ld میگوید نمادهای مشترک (common symbols) را هنگام قرار دادن در بخشهای خروجی مربوطه، بر پایه ترازبندی (alignment) به ترتیب صعودی یا نزولی مرتب کند. ترازبندیهای در نظر گرفتهشده برای نمادها عبارتند از شانزدهبایتی یا بزرگتر، هشتبایتی، چهاربایتی، دوبایتی و یکبایتی. این کار برای جلوگیری از ایجاد شکاف میان نمادها به دلیل محدودیتهای ترازبندی است. اگر هیچ ترتیب مرتبسازی مشخص نشود، ترتیب نزولی فرض میشود.
- --sort-section=name
- این گزینه "SORT_BY_NAME" را روی تمام الگوهای عام (wildcard) بخشها در اسکریپت پیونددهنده اعمال میکند.
- --sort-section=alignment
- این گزینه "SORT_BY_ALIGNMENT" را روی تمام الگوهای عام (wildcard) بخشها در اسکریپت پیونددهنده اعمال میکند.
- --spare-dynamic-tags=count
- این گزینه تعداد جایگاههای خالی (slots) را که باید در بخش .dynamic از اشیاء اشتراکی ELF باقی بماند مشخص میکند. ابزارهای پسپردازش مانند پیشپیونددهنده (prelinker) ممکن است به این جایگاههای خالی نیاز داشته باشند. مقدار پیشفرض ۵ است.
- --split-by-file[=size]
- مشابه --split-by-reloc است، اما با رسیدن به size، یک بخش خروجی تازه برای هر فایل ورودی ایجاد میکند. در صورت عدم تعیین، مقدار پیشفرض size برابر ۱ است.
- --split-by-reloc[=count]
- میکوشد بخشهای اضافی در فایل خروجی بسازد تا هیچ بخش خروجی منفردی در فایل شامل بیش از count بازنشانی (relocation) نباشد. این ویژگی هنگام تولید فایلهای بازنشانیپذیر بزرگ جهت بارگیری در برخی هستههای بیدرنگ (real time) با قالب فایل شیء COFF سودمند است؛ زیرا COFF نمیتواند بیش از ۶۵۵۳۵ بازنشانی را در یک بخش واحد نمایش دهد. توجه داشته باشید که این سازوکار با قالبهای فایل شیئی که از بخشهای دلخواه پشتیبانی نمیکنند کار نخواهد کرد. پیونددهنده بخشهای ورودی منفرد را برای توزیع مجدد تکهتکه نخواهد کرد، بنابراین اگر یک بخش ورودی منفرد شامل بیش از count بازنشانی باشد، یک بخش خروجی نیز شامل همان تعداد بازنشانی خواهد بود. مقدار پیشفرض count برابر ۳۲۷۶۸ است.
- --stats[=filename]
- آمار مربوط
به عملکرد
پیونددهنده،
مانند زمان
اجرا و
میزان مصرف
حافظه را
محاسبه و
نمایش
میدهد.
اگر آرگومان اختیاری filename داده نشود، تنها اطلاعات پایهای گزارش شده و به جریان خروجی خطای استاندارد فرستاده میشود. اگر آرگومان filename ارائه شود، اطلاعات تفصیلی در فایل نامبرده نوشته میشود. اگر filename تنها برابر با نماد - قرار گیرد، اطلاعات تفصیلی به جریان خروجی استاندارد فرستاده میشود. اگر filename با + آغاز شود، فایل به جای حالت بازنویسی، در حالت الحاق (append mode) باز میشود.
اگر گزینه -Map فعال شده باشد، اطلاعات در فایل نگاشت (map file) نیز ثبت خواهد شد. نکته: اگر به هر دو گزینه --stats و -Map آرگومانهای filename یکسانی داده شود، اطلاعات تنها یک بار نوشته خواهد شد و نه دو بار.
اگر متغیر محیطی "LD_STATS" تعریف شده باشد، عملکردی همانند گزینه --stats خواهد داشت. اگر مقدار این متغیر یک رشته باشد، به عنوان نام فایلی که اطلاعات باید در آن ثبت شود استفاده خواهد شد. در غیر این صورت اطلاعات به جریان خروجی استاندارد فرستاده میشود. استفاده از متغیر محیطی امکان ثبت آمار را بدون نیاز به دستکاری خط فرمان پیونددهنده فراهم میسازد. نکته: اگر هم متغیر محیطی و هم گزینه --stats به کار روند، گزینه --stats تقدم خواهد داشت.
اطلاعات تفصیلی گزارششده شامل زمان پردازنده (cpu time) مصرفی و، در صورت در دسترس بودن فراخوانی کتابخانه سیستمی getrusage()، حداکثر اندازه مجموعهکاری (resident set size) و زمانهای اجرای کاربر و سیستم نیز میشود. افزون بر این، در صورت در دسترس بودن فراخوانیهای کتابخانه سیستمی mallinfo یا mallinfo2، میزان کل حافظه مصرفی گزارش میشود.
این اطلاعات برای بخشهای جداگانه فرآیند پیوند که با عنوان فازها (phases) نامیده میشوند نمایش داده میشود. توجه داشته باشید که فازهای منفرد میتوانند درون یکدیگر قرار گیرند یا با یکدیگر همپوشانی داشته باشند، بنابراین نباید تصور کرد کل منابع مصرفشده توسط پیونددهنده مجموع منابع مصرفشده توسط فازهای منفرد است.
افزون بر این، اطلاعات برای یک فاز ویژه به نام ALL نیز گزارش میشود که تمام فرآیند پیوند را در بر میگیرد.
هنگامی که اطلاعات تفصیلی گزارش میشود، نسخه پیونددهنده، آرگومانهای خط فرمان و زمان شروع پیونددهنده نیز گنجانده میشوند. این امر مدیریت شرایطی را که در آن چندین پیوند توسط سیستم ساخت فراخوانی میشوند آسانتر میسازد و کمک میکند دقیقاً مشخص شود کدام آرگومانها مسئول تولید آمارهای گزارششده بودهاند.
خروجی تفصیلی شکلی شبیه به این دارد:
Stats: linker version: (GNU Binutils) 2.44.50.20250401 Stats: linker started: Wed Apr 2 09:36:41 2025 Stats: args: ld -z norelro -z nomemory-seal -z no-separate-code -o a.out [...] Stats: phase cpu time rss user time system time memory Stats: name (microsec) (KiB) (seconds) (seconds) (KiB) Stats: ALL 390082 217740 0 0 25219440 Stats: ctf processing 12 0 0 0 0 Stats: string merge 1324 0 0 0 406544 Stats: parsing 349 288 0 0 119792 Stats: plugins 1 0 0 0 0 Stats: processing files 259616 214524 0 0 31569120 Stats: write 116493 0 0 0 48096
- --no-stats
- گزارش آمار مصرف را غیرفعال میکند، در صورتی که این ویژگی از طریق گزینه خط فرمان --stats یا متغیر محیطی LD_STATS فعال شده باشد.
- --sysroot=directory
- از directory به عنوان مکان sysroot استفاده میکند و مقدار پیشفرض زمان پیکربندی (configure-time) را نادیده میگیرد. این گزینه تنها توسط پیونددهندههایی پشتیبانی میشود که با --with-sysroot پیکربندی شده باشند.
- --task-link
- توسط مقصدهای مبتنی بر COFF/PE برای ایجاد فایل شیء task-linked به کار میرود که در آن تمام نمادهای سراسری به نمادهای ایستا (static) تبدیل شدهاند.
- --traditional-format
- برای برخی
مقصدها،
خروجی ld از
جهاتی با
خروجی برخی
پیونددهندههای
موجود
متفاوت است.
این سوییچ
از ld
میخواهد
در عوض از
قالب سنتی
(traditional format)
استفاده
کند.
برای نمونه، در SunOS، برنامه ld مدخلهای تکراری در جدول رشته نمادها را ادغام میکند. این کار میتواند حجم فایل خروجی دارای اطلاعات اشکالزدایی کامل را بیش از ۳۰ درصد کاهش دهد. متأسفانه، برنامه "dbx" در SunOS نمیتواند برنامه حاصل را بخواند (اما "gdb" مشکلی ندارد). سوییچ --traditional-format به ld میگوید مدخلهای تکراری را ادغام نکند.
- --section-start=sectionname=org
- یک بخش را در فایل خروجی در آدرس مطلقی که توسط org مشخص شده قرار میدهد. میتوانید از این گزینه به تعداد دفعات مورد نیاز برای تعیین مکان چند بخش در خط فرمان استفاده کنید. org باید یک عدد صحیح هگزادسیمال منفرد باشد؛ برای سازگاری با سایر پیونددهندهها، میتوانید پیشوند 0x را که معمولاً همراه مقادیر هگزادسیمال است حذف کنید. نکته: نباید هیچ فاصله خالی (white space) میان sectionname، علامت مساوی ("=") و org وجود داشته باشد.
- --image-base=org
- هنگام
استفاده از
ELF، مشابه -Ttext-segment
است و هر دو
گزینه
عملاً آدرس
پایه فایل
اجرایی ELF را
تعیین
میکنند.
هنگام استفاده از PE، از value به عنوان آدرس پایه برنامه یا dll شما استفاده میکند. این پایینترین مکان حافظه است که هنگام بارگیری برنامه یا dll شما استفاده خواهد شد. برای کاهش نیاز به بازنشانی و بهبود کارایی dllهای شما، هر یک باید دارای آدرس پایه یکتا بوده و با هیچ dll دیگری همپوشانی نداشته باشد. مقدار پیشفرض برای فایلهای اجرایی 0x400000 و برای dllها 0x10000000 است.
- -Tbss=org
- -Tdata=org
- -Ttext=org
- مشابه --section-start است، با ".bss"، ".data" یا ".text" به عنوان sectionname.
- -Ttext-segment=org
- هنگام ساخت یک فایل اجرایی ELF، آدرس نخستین بایت از نخستین قطعه را تعیین میکند. توجه داشته باشید هنگامی که -pie همراه با -Ttext-segment=org استفاده شود، فایل اجرایی خروجی با عنوان ET_EXEC علامتگذاری میشود تا آدرس نخستین بایت از قطعه متن در زمان اجرا تضمیناً org باشد.
- -Trodata-segment=org
- هنگام ساخت یک فایل اجرایی ELF یا شیء اشتراکی برای مقصدی که در آن دادههای فقطخواندنی در قطعهای جداگانه و مستقل از متن اجرایی قرار دارند، آدرس نخستین بایت از قطعه دادههای فقطخواندنی را تعیین میکند.
- -Tldata-segment=org
- هنگام ساخت یک فایل اجرایی ELF یا شیء اشتراکی برای مدل حافظه متوسط x86-64، آدرس نخستین بایت از قطعه ldata را تعیین میکند.
- --unresolved-symbols=method
- نحوه برخورد با نمادهای حلنشده را تعیین میکند. چهار مقدار ممکن برای method وجود دارد:
- ignore-all
- هیچ نماد حلنشدهای را گزارش نکن.
- report-all
- تمام نمادهای حلنشده را گزارش کن. این حالت پیشفرض است.
- ignore-in-object-files
- نمادهای حلنشده موجود در کتابخانههای مشترک را گزارش کن، اما اگر از فایلهای شیء معمولی باشند، از آنها چشمپوشی کن.
- ignore-in-shared-libs
- نمادهای حلنشده ناشی از فایلهای شیء معمولی را گزارش کن، اما اگر از کتابخانههای مشترک باشند، از آنها چشمپوشی کن. این گزینه میتواند هنگام ساخت باینری پویا که در آن مشخص است تمام کتابخانههای مشترک مورد ارجاع در خط فرمان پیونددهنده گنجانده شدهاند، مفید باشد.
رفتار پیونددهنده در قبال کتابخانههای مشترک بهتنهایی را میتوان با گزینه --[no-]allow-shlib-undefined نیز کنترل کرد.
بهطور معمول پیونددهنده برای هر نماد حلنشده گزارششده یک پیام خطا تولید میکند، اما گزینه --warn-unresolved-symbols میتواند این خطا را به هشدار تبدیل کند.
- --dll-verbose
- --verbose[=NUMBER]
- شماره نسخه ld را نمایش داده و شبیهسازیهای پشتیبانیشده پیونددهنده را فهرست کن. فایلهای ورودی بازشدنی و بازنشدنی را نمایش بده. اسکریپت پیونددهنده مورد استفاده را نمایش بده. اگر آرگومان اختیاری NUMBER بزرگتر از ۱ باشد، وضعیت نمادهای افزونه (plugin) نیز نمایش داده خواهد شد.
- --version-script=version-scriptfile
- نام یک اسکریپت نگارش (version script) را برای پیونددهنده مشخص کن. این گزینه معمولاً هنگام ساخت کتابخانههای مشترک جهت تعیین اطلاعات تکمیلی درباره سلسلهمراتب نگارش برای کتابخانه در حال ساخت بهکار میرود. این گزینه تنها بر روی سکوهای ELF پشتیبانیکننده از کتابخانههای مشترک بهطور کامل پشتیبانی میشود؛ بخش نگارش (VERSION) را ببینید. بر روی سکوهای PE پشتیبانی جزئی دارد، که میتوانند از اسکریپتهای نگارش برای پالایش دیداریبودن نمادها در حالت برونریزی خودکار (auto-export) استفاده کنند: هر نمادی که در اسکریپت نگارش با برچسب local مشخص شده باشد برونریزی نخواهد شد.
- --warn-common
- هنگامی که
یک نماد
عمومی (common symbol) با
یک نماد
عمومی دیگر
یا با یک
تعریف نماد
ترکیب شود،
هشدار بده.
پیونددهندههای
یونیکس این
شیوه تا حدی
مسامحهآمیز
را مجاز
میدانند،
اما
پیونددهندهها
در برخی
سیستمعاملهای
دیگر چنین
اجازهای
نمیدهند.
این گزینه
به شما
امکان
میدهد
مشکلات
احتمالی
ناشی از
ترکیب
نمادهای
سراسری را
بیابید.
متأسفانه
برخی
کتابخانههای
C از این
شیوه
استفاده
میکنند،
بنابراین
ممکن است
علاوه بر
برنامههای
خود،
هشدارهایی
درباره
نمادهای
درون
کتابخانهها
نیز دریافت
کنید.
سه گونه نماد سراسری وجود دارد که در اینجا با مثالهای زبان C نشان داده شدهاند:
- int i = 1;
- یک تعریف، که در بخش دادههای مقداردهیشده (initialized data) در فایل خروجی قرار میگیرد.
- extern int i;
- یک ارجاع تعریفنشده، که فضایی تخصیص نمیدهد. باید در جایی یا یک تعریف یا یک نماد عمومی برای این متغیر وجود داشته باشد.
- int i;
- یک نماد عمومی. اگر برای یک متغیر تنها نمادهای عمومی (یک یا چند مورد) وجود داشته باشد، در ناحیه دادههای مقداردهینشده (uninitialized data) در فایل خروجی قرار میگیرد. پیونددهنده چندین نماد عمومی برای یک متغیر را در یک نماد ادغام میکند. اگر اندازه متفاوتی داشته باشند، بزرگترین اندازه را برمیگزیند. پیونددهنده در صورت وجود تعریفی از همان متغیر، نماد عمومی را به یک اعلان تبدیل میکند.
گزینه --warn-common میتواند پنج نوع هشدار تولید کند. هر هشدار از یک جفت خط تشکیل شده است: خط نخست نمادی را که بهتازگی با آن برخورد شده توصیف میکند، و خط دوم نماد پیشین همنام را شرح میدهد. یک یا هر دو نماد از نوع نماد عمومی خواهند بود.
- 1.
- تبدیل نماد
عمومی به
ارجاع،
زیرا پیش از
این تعریفی
برای این
نماد وجود
داشته است.
<file>(<section>): warning: common of `<symbol>' overridden by definition <file>(<section>): warning: defined here
- 2.
- تبدیل نماد
عمومی به
ارجاع، به
دلیل
برخورد
بعدی با
تعریفی
برای نماد.
این حالت
همانند
مورد پیشین
است، جز
اینکه
ترتیب
برخورد با
نمادها
متفاوت
بوده است.
<file>(<section>): warning: definition of `<symbol>' overriding common <file>(<section>): warning: common is here
- 3.
- ادغام یک
نماد عمومی
با یک نماد
عمومی
هماندازه
پیشین.
<file>(<section>): warning: multiple common of `<symbol>' <file>(<section>): warning: previous common is here
- 4.
- ادغام یک
نماد عمومی
با یک نماد
عمومی
بزرگتر
پیشین.
<file>(<section>): warning: common of `<symbol>' overridden by larger common <file>(<section>): warning: larger common is here
- 5.
- ادغام یک
نماد عمومی
با یک نماد
عمومی
کوچکتر
پیشین. این
حالت
همانند
مورد قبلی
است، جز
اینکه
ترتیب
برخورد با
نمادها
متفاوت
بوده است.
<file>(<section>): warning: common of `<symbol>' overriding smaller common <file>(<section>): warning: smaller common is here
- --warn-constructors
- در صورت استفاده از سازندههای سراسری (global constructors)، هشدار بده. این تنها برای تعداد اندکی از قالبهای فایل شیء سودمند است. برای قالبهایی چون COFF یا ELF، پیونددهنده قادر به تشخیص استفاده از سازندههای سراسری نیست.
- --warn-execstack
- --warn-execstack-objects
- --no-warn-execstack
- در سکوهای ELF، اگر از پیونددهنده خواسته شود فایل خروجی حاوی پشته اجرایی (executable stack) ایجاد کند، ممکن است پیامهای هشدار صادر نماید. سه حالت ممکن وجود دارد:
- 1.
- هیچ هشداری صادر نشود.
- 2.
- همواره هشدار صادر شود، حتی اگر پشته اجرایی از طریق گزینه خط فرمان -z execstack درخواست شده باشد.
- 3.
- تنها در صورتی هشدار صادر شود که فایل شیء پشته اجرایی را درخواست کند، نه در حالتی که از گزینه -z execstack استفاده شده باشد.
حالت پیشفرض به نحوه پیکربندی پیونددهنده هنگام ساخت بستگی دارد. گزینه --no-warn-execstack همواره پیونددهنده را در حالت بدون هشدار قرار میدهد. گزینه --warn-execstack پیونددهنده را در حالت همواره هشداردهنده میگذارد. گزینه --warn-execstack-objects پیونددهنده را در حالت هشدار فقط برای فایلهای شیء قرار میدهد.
نکته: فایلهای ورودی در قالب ELF میتوانند با داشتن بخشی به نام .note.GNU-stack که بیت اجرایی در پرچمهای بخش آن تنظیم شده است، نیاز خود به پشته اجرایی را مشخص کنند. آنها همچنین میتوانند با داشتن همان بخش بدون فعال بودن بیت پرچم اجرایی، مشخص سازند که نیازی به پشته اجرایی ندارند. اگر یک فایل ورودی دارای بخش .note.GNU-stack نباشد، رفتار پیشفرض وابسته به مقصد (target) خواهد بود. برای برخی مقصدها، فقدان چنین بخشی به این معناست که پشته اجرایی مورد نیاز است. این موضوع معمولاً برای فایلهای دستساز اسمبلی دردسرساز است.
- --error-execstack
- --no-error-execstack
- اگر قرار
باشد
پیونددهنده
پیام
هشداری در
مورد پشته
اجرایی
صادر کند،
گزینه --error-execstack
آن هشدار را
به خطا
تبدیل
میکند.
توجه داشته
باشید که
این گزینه
وضعیت
تولید
هشدار پشته
اجرایی
پیونددهنده
را تغییر
نمیدهد. از
گزینه --warn-execstack
یا --warn-execstack-objects
برای تنظیم
یک وضعیت
هشدار خاص
استفاده
کنید.
گزینه --no-error-execstack رفتار پیشفرض در تولید پیامهای هشدار را بازمیگرداند.
- --warn-multiple-gp
- اگر چندین مقدار اشارهگر سراسری (global pointer) در فایل خروجی مورد نیاز باشد، هشدار بده. این گزینه تنها برای پردازندههای خاصی مانند Alpha معنادار است. بهویژه، برخی پردازندهها ثوابت با مقادیر بزرگ را در بخشی ویژه قرار میدهند. یک ثبات خاص (اشارهگر سراسری یا global pointer) به میانه این بخش اشاره میکند تا بارگذاری ثوابت بهطور کارآمد از طریق حالت آدرسدهی نسبی به ثباتپایه (base-register relative) انجام شود. از آنجا که آفست در حالت نسبی به ثباتپایه ثابت و نسبتاً کوچک است (برای نمونه، ۱۶ بیت)، اندازه بیشینه مخزن ثوابت (constant pool) محدود میشود. از این رو، در برنامههای بزرگ اغلب استفاده از چندین مقدار اشارهگر سراسری جهت آدرسدهی همه ثوابت ممکن ضروری میگردد. این گزینه سبب میشود در صورت وقوع این حالت، هشدار صادر شود.
- --warn-once
- تنها یک بار برای هر نماد تعریفنشده هشدار میدهد، به جای یک بار به ازای هر پودمانی که به آن ارجاع دارد.
- --warn-rwx-segments
- --no-warn-rwx-segments
- هشدار
میدهد اگر
پیونددهنده
یک قطعهٔ
بارگذاریپذیر
با اندازهٔ
غیرصفر
بسازد که هر
سه پرچم
دسترسی
خواندن،
نوشتن و
اجرا در آن
تنظیم شده
باشند. چنین
قطعهای
نشاندهندهٔ
یک
آسیبپذیری
امنیتی
بالقوه است.
افزون بر
این، اگر یک
قطعهٔ
حافظهٔ
محلی رشته (TLS)
با پرچم
دسترسی
اجرا ساخته
شود،
صرفنظر از
اینکه
پرچمهای
خواندن یا
نوشتن
تنظیم شده
باشند یا
نه، هشدار
تولید
خواهد شد.
این هشدارها به طور پیشفرض فعال هستند. میتوان آنها را از طریق گزینهٔ --no-warn-rwx-segments غیرفعال و از طریق گزینهٔ --warn-rwx-segments دوباره فعال کرد.
- --error-rwx-segments
- --no-error-rwx-segments
- اگر قرار
باشد
پیونددهنده
یک پیام
هشدار
دربارهٔ یک
قطعهٔ
قابلاجرا
و
قابلنوشتن،
یا یک قطعهٔ
TLS
قابلاجرا
تولید کند،
گزینهٔ
--error-rwx-segments این
هشدار را به
یک خطا
تبدیل
خواهد کرد.
گزینهٔ
--no-error-rwx-segments رفتار
پیشفرضِ
صرفاً
تولید پیام
هشدار را
بازمیگرداند.
نکته - گزینهٔ --error-rwx-segments به خودیِ خود هشدارهای مربوط به این قطعات را فعال نمیکند. این هشدارها یا در صورت پیکربندی پیونددهنده به صورت پیشفرض فعال هستند، یا از طریق گزینهٔ خط فرمان --warn-rwx-segments فعال میشوند.
- --warn-section-align
- هشدار میدهد اگر نشانی یک بخش خروجی به دلیل ترازسازی تغییر کند. به طور معمول، ترازسازی توسط یک بخش ورودی تعیین میشود. نشانی تنها در صورتی تغییر خواهد کرد که به صراحت مشخص نشده باشد؛ یعنی، اگر دستور "SECTIONS" نشانی آغازی برای بخش مشخص نکرده باشد.
- --warn-textrel
- هشدار میدهد اگر پیونددهنده DT_TEXTREL را به یک فایل اجرایی مستقل از موقعیت یا شیء مشترک بیفزاید.
- --warn-alternate-em
- هشدار میدهد اگر یک شیء دارای کد ماشین ELF جایگزین باشد.
- --warn-unresolved-symbols
- اگر پیونددهنده بخواهد یک نماد حلنشده را گزارش کند (گزینهٔ --unresolved-symbols را ببینید)، به طور معمول یک خطا تولید میکند. این گزینه سبب میشود که به جای آن یک هشدار تولید کند.
- --error-unresolved-symbols
- این گزینه رفتار پیشفرض پیونددهنده در تولید خطا هنگام گزارش نمادهای حلنشده را بازمیگرداند.
- --whole-archive
- برای هر
بایگانی
ذکرشده در
خط فرمان پس
از گزینهٔ
--whole-archive، به جای
جستجوی
بایگانی
برای یافتن
فایلهای
شیء
موردنیاز،
تمام
فایلهای
شیء درون
بایگانی را
در پیوند
میگنجاند.
این گزینه
معمولاً
برای تبدیل
یک فایل
بایگانی به
یک
کتابخانهٔ
مشترک به
کار میرود
و گنجاندن
هر شیء را
در
کتابخانهٔ
مشترک حاصل
اجباری
میکند. این
گزینه ممکن
است بیش از
یک بار
استفاده
شود.
استفاده از این گزینه در یک جفتگزینهٔ --start-lib/--end-lib مجاز نیست.
دو نکته هنگام استفاده از این گزینه از gcc: نخست، gcc از این گزینه آگاهی ندارد، بنابراین باید از -Wl,-whole-archive استفاده کنید. دوم، فراموش نکنید که پس از فهرست بایگانیهای خود از -Wl,-no-whole-archive استفاده نمایید، زیرا gcc فهرست بایگانیهای خود را به پیوند شما میافزاید و ممکن است نخواهید این پرچم بر آنها نیز اثر بگذارد.
- --link-mapless
- بایگانیهای فاقد نمایه (یا همان نگاشت نماد) را برای همهٔ بایگانیهای بعدی که در خط فرمان ذکر شدهاند میپذیرد. در صورت نبود، چنین نمایهای به صورت داخلی و در حین اجرا به بهای کاهش کارایی ساخته میشود. این حالت پیشفرض است.
- --wrap=symbol
- استفاده از
یک تابع
پوشاننده
برای symbol. هر
ارجاع
تعریفنشده
به symbol به
"__wrap_symbol"
حل خواهد
شد. هر
ارجاع
تعریفنشده
به
"__real_symbol"
به symbol حل
خواهد شد.
این قابلیت میتواند برای فراهم کردن یک پوشاننده برای یک تابع سامانهای استفاده شود. تابع پوشاننده باید "__wrap_symbol" نامیده شود. اگر مایل به فراخوانی تابع سامانهای باشد، باید "__real_symbol" را فراخوانی کند.
در اینجا یک مثال ساده آورده شده است:
void * __wrap_malloc (size_t c) { printf ("malloc called with %zu\n", c); return __real_malloc (c); }اگر کدهای دیگر را با استفاده از --wrap malloc با این فایل پیوند دهید، تمام فراخوانیهای "malloc" در عوض تابع "__wrap_malloc" را فراخوانی خواهند کرد. فراخوانی "__real_malloc" در "__wrap_malloc" تابع واقعی "malloc" را فراخوانی خواهد کرد.
ممکن است بخواهید یک تابع "__real_malloc" نیز فراهم کنید، تا پیوندها بدون گزینهٔ --wrap نیز با موفقیت انجام شوند. اگر چنین کنید، نباید تعریف "__real_malloc" را در همان فایلی قرار دهید که "__wrap_malloc" قرار دارد؛ اگر این کار را بکنید، اسمبلر ممکن است فراخوانی را پیش از آنکه پیونددهنده فرصت پوشاندن آن با "malloc" را داشته باشد، حل کند.
تنها ارجاعات تعریفنشده توسط پیونددهنده جایگزین میشوند. بنابراین، ارجاعات درونی واحد ترجمه به symbol به "__wrap_symbol" حل نمیشوند. در مثال بعدی، فراخوانی "f" در "g" به "__wrap_f" حل نمیشود.
int f (void) { return 123; } int g (void) { return f(); } - --eh-frame-hdr
- --no-eh-frame-hdr
- درخواست (--eh-frame-hdr) یا جلوگیری از (--no-eh-frame-hdr) ایجاد بخش ".eh_frame_hdr" و سرآیند قطعهٔ "PT_GNU_EH_FRAME" در ELF.
- --no-ld-generated-unwind-info
- درخواست ایجاد اطلاعات بازپیچی ".eh_frame" برای بخشهای کدِ تولیدشده توسط پیونددهنده مانند PLT. در صورتی که اطلاعات بازپیچی تولیدشده توسط پیونددهنده پشتیبانی شود، این گزینه به طور پیشفرض فعال است.
- --discard-sframe
- دور انداختن اطلاعات ردگیری پشتهٔ ".sframe" از خروجی. این گزینه همچنین مانع از ایجاد دادههای ردگیری پشتهٔ SFrame برای بخشهای کدِ تولیدشده توسط پیونددهنده مانند PLT میشود. این گزینه به طور پیشفرض غیرفعال است.
- --enable-new-dtags
- --disable-new-dtags
- این پیونددهنده میتواند برچسبهای پویای جدید را در ELF بسازد. اما سامانههای قدیمیترِ ELF ممکن است آنها را درک نکنند. اگر --enable-new-dtags را مشخص کنید، برچسبهای پویای جدید در صورت نیاز ساخته شده و برچسبهای پویای قدیمیتر حذف خواهند شد. اگر --disable-new-dtags را مشخص کنید، هیچ برچسب پویای جدیدی ساخته نخواهد شد. به طور پیشفرض، برچسبهای پویای جدید ساخته نمیشوند. توجه داشته باشید که این گزینهها تنها برای سامانههای ELF در دسترس هستند.
- --hash-size=number
- تنظیم اندازهٔ پیشفرض جدولهای درهمسازی پیونددهنده به یک عدد اول نزدیک به number. افزایش این مقدار میتواند مدتزمان انجام وظایف پیونددهنده را به بهای افزایش نیازمندیهای حافظهٔ پیونددهنده کاهش دهد. به همین ترتیب، کاهش این مقدار میتواند نیازمندیهای حافظه را به بهای کاهش سرعت کم کند. مقدار پیشفرض در شرایط عادی 4051 و در صورت استفاده از گزینهٔ خط فرمان --reduce-memory-overheads برابر 1021 است.
- --hash-style=style
- تنظیم نوع جدول(های) درهمسازی پیونددهنده. style میتواند "sysv" برای بخش سنتی ".hash" در ELF، "gnu" برای بخش سبک نوین GNU یعنی ".gnu.hash"، یا "both" برای هر دو جدول درهمسازی سنتی ELF یعنی ".hash" و سبک نوین GNU یعنی ".gnu.hash" باشد. مقدار پیشفرض بستگی به نحوهٔ پیکربندی پیونددهنده دارد، اما برای بیشتر سامانههای مبتنی بر لینوکس "both" خواهد بود.
- --compress-debug-sections=none
- --compress-debug-sections=zlib
- --compress-debug-sections=zlib-gnu
- --compress-debug-sections=zlib-gabi
- --compress-debug-sections=zstd
- در بسترهای
ELF، این
گزینهها
چگونگی
فشردهسازی
بخشهای
اشکالزدایی
DWARF را با
استفاده از
zlib کنترل
میکنند.
گزینهٔ --compress-debug-sections=none بخشهای اشکالزدایی DWARF را فشرده نمیکند. گزینهٔ --compress-debug-sections=zlib-gnu بخشهای اشکالزدایی DWARF را فشرده کرده و نام آنها را به گونهای تغییر میدهد که به جای .debug با .zdebug آغاز شوند. گزینهٔ --compress-debug-sections=zlib-gabi نیز بخشهای اشکالزدایی DWARF را فشرده میکند، اما به جای تغییر نام، پرچم SHF_COMPRESSED را در سرآیند بخشها تنظیم میکند.
گزینهٔ --compress-debug-sections=zlib نام مستعاری برای --compress-debug-sections=zlib-gabi است.
گزینهٔ --compress-debug-sections=zstd بخشهای اشکالزدایی DWARF را با استفاده از zstd فشرده میکند.
توجه داشته باشید که این گزینه هرگونه فشردهسازی در بخشهای اشکالزدایی ورودی را لغو میکند؛ بنابراین اگر برای نمونه یک فایل باینری با --compress-debug-sections=none پیوند داده شود، هرگونه بخش اشکالزدایی فشرده در فایلهای ورودی پیش از رونویسی در باینری خروجی از حالت فشرده خارج خواهد شد.
رفتار پیشفرض فشردهسازی بسته به مقصد مربوطه و گزینههای پیکربندیِ به کار رفته در ساخت زنجیرهابزار تفاوت دارد. مقدار پیشفرض را میتوان با بررسی خروجی گزینهٔ --help پیونددهنده تعیین کرد.
- --reduce-memory-overheads
- این گزینه
نیازمندیهای
حافظه را در
زمان اجرای
ld به بهای
کاهش سرعت
پیوند،
کاهش
میدهد. این
گزینه برای
انتخاب
الگوریتم
قدیمی O(n^2) جهت
تولید
پرونده
نگاشت
پیوند، به
جای
الگوریتم
جدید O(n) که
نزدیک به
۴۰٪ حافظه
بیشتری
برای
ذخیرهسازی
نمادها به
کار
میبرد،
معرفی شد.
اثر دیگر این سوئیچ، تنظیم اندازه پیشفرض جدول درهمسازی روی 1021 است که باز هم به بهای طولانیتر شدن زمان اجرای پیونددهنده، در حافظه صرفهجویی میکند. با این حال، اگر از سوئیچ --hash-size استفاده شده باشد، این عمل انجام نمیگیرد.
سوئیچ --reduce-memory-overheads همچنین ممکن است برای فعالسازی سایر مصالحهها در نگارشهای آینده پیونددهنده به کار گرفته شود.
- --max-cache-size=size
- ld به طور معمول اطلاعات بازآرایی و جدولهای نماد پروندههای ورودی را با اندازه نامحدود در حافظه نهان (cache) نگه میدارد. این گزینه بیشینه اندازه حافظه نهان را روی size تنظیم میکند. توجه داشته باشید - اگر از گزینه خط فرمان --no-keep-memory استفاده شده باشد، پیونددهنده به گونهای عمل میکند که گویی بیشینه اندازه حافظه نهان روی 0 تنظیم شده است - یعنی هیچ چیز نگهداری نمیشود.
- --build-id
- --build-id=style
- درخواست
ایجاد یک
بخش
یادداشت ELF
با نام
".note.gnu.build-id" یا
یک بخش COFF با
نام ".buildid".
محتویات
یادداشت،
بیتهای
یکتایی
هستند که
این پرونده
پیوندخورده
را مشخص
میکنند. style
میتواند
"uuid" برای
استفاده از
۱۲۸ بیت
تصادفی؛
"sha1" برای
استفاده از
درهمساز
۱۶۰ بیتی SHA1؛
"md5" برای
استفاده از
درهمساز
۱۲۸ بیتی MD5؛
یا "xx"
برای
استفاده از
درهمساز
۱۲۸ بیتی XXHASH
روی
بخشهای
هنجارین
محتویات
خروجی
باشد؛ یا
"0xhexstring"
برای
استفاده از
یک رشته بیت
انتخابی که
به صورت
تعداد زوجی
از ارقام
هگزادسیمال
مشخص شده
باشد
(نویسههای
"-" و
":" میان
جفتارقام
نادیده
گرفته
میشوند).
اگر style حذف
شود، "sha1"
به کار
میرود.
سبکهای "md5"، "sha1" و "xx" شناسهای تولید میکنند که در پروندههای خروجی همسان همواره یکسان است، اما تقریباً با قطعیت در میان تمام پروندههای خروجی ناهمسان یکتا خواهد بود. این شناسه برای مقایسه به عنوان مجموع مقابلهای محتویات پرونده در نظر گرفته نشده است. پرونده پیوندخورده ممکن است بعداً توسط ابزارهای دیگر تغییر یابد، اما رشته بیت شناسه ساخت که پرونده پیوندخورده نخستین را مشخص میکند تغییر نمیکند.
دادن مقدار "none" برای style، این تنظیم را از هر کدام از گزینههای "--build-id" پیشین در خط فرمان، غیرفعال میکند.
- --package-metadata=JSON
- درخواست ایجاد یک بخش یادداشت ELF با نام ".note.package". محتویات این یادداشت طبق مشخصات فراداده بسته، در قالب JSON است. برای اطلاعات بیشتر ببینید: https://systemd.io/ELF_PACKAGE_METADATA/ آرگومان JSON از کدگذاری درصدی و کدگذاری %[string] پسآمده (که در آن string به نام موجود در مراجع نویسه نامگذاریشده در HTML اشاره دارد) پشتیبانی میکند: %[comma] برای ,، %[lbrace] برای {، %[quot] برای "، %[rbrace] برای }، و %[space] برای نویسه فاصله. اگر آرگومان JSON داده نشده باشد یا خالی باشد، در صورتی که ایجاد یادداشت فراداده توسط رخداد پیشین گزینه --package-metadata فعال شده باشد، آن را غیرفعال خواهد کرد. اگر پیونددهنده همراه با libjansson ساخته شده باشد، رشته JSON اعتبارسنجی خواهد شد.
پیونددهنده PE از گزینه -shared پشتیبانی میکند که سبب میشود خروجی به جای یک پرونده اجرایی معمولی، یک کتابخانه با پیوند پویا (DLL) باشد. هنگام استفاده از این گزینه، باید نام خروجی را "*.dll" بگذارید. علاوه بر این، پیونددهنده به طور کامل از پروندههای استاندارد "*.def" پشتیبانی میکند که میتوانند در خط فرمان پیونددهنده مانند یک پرونده شیء تعیین شوند (در واقع، باید پیش از آرشیوهایی که نمادها را از آنها برونریزی میکند قرار گیرد تا اطمینان حاصل شود که همانند یک پرونده شیء معمولی پیوند میخورند).
علاوه بر گزینههای مشترک میان تمام هدفها، پیونددهنده PE از گزینههای خط فرمان دیگری نیز پشتیبانی میکند که ویژه هدف PE هستند. گزینههایی که مقدار میپذیرند میتوانند با یک فاصله یا یک علامت مساوی از مقدار خود جدا شوند.
- --add-stdcall-alias
- در صورت تعیین، نمادهای دارای پسوند stdcall (@nn) به همان صورت موجود و همچنین با پسوند برداشتهشده برونریزی خواهند شد. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --base-file file
- استفاده از file به عنوان نام پروندهای که نشانیهای پایه تمام بازآراییهای لازم برای تولید DLLها با dlltool در آن ذخیره شوند. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --dll
- ساخت یک DLL به جای یک پرونده اجرایی معمولی. همچنین میتوانید از -shared استفاده کنید یا یک "LIBRARY" در پرونده ".def" دادهشده مشخص نمایید. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --enable-long-section-names
- --disable-long-section-names
- گونههای PE از قالب شیء COFF، افزونهای میافزایند که اجازه استفاده از نامهای بخش طولانیتر از هشت نویسه (حد عادی برای COFF) را میدهد. به طور پیشفرض، این نامها تنها در پروندههای شیء مجاز هستند، زیرا تصویرهای اجرایی کاملاً پیوندخورده جدول رشتههای COFF مورد نیاز برای پشتیبانی از نامهای طولانیتر را با خود حمل نمیکنند. به عنوان یک افزونه گنو، میتوان با استفاده از این دو گزینه، کاربرد آنها را در تصویرهای اجرایی نیز مجاز کرد، یا (احتمالاً بدون فایده!) در پروندههای شیء نامجاز نمود. تصویرهای اجرایی تولیدشده با این نامهای بخش طولانی تا حدی غیراستاندارد هستند، چرا که جدول رشتهها را به همراه دارند، و ممکن است هنگام بررسی با ابزارهای ناآگاه از گنو اما آگاه از PE، مانند نمایشگرها و تخلیهکنندههای پرونده (dumpers)، خروجی گیجکنندهای ایجاد نمایند. با این حال، GDB برای یافتن بخشهای اطلاعات اشکالزدایی Dwarf-2 در یک تصویر اجرایی در زمان اجرا، به استفاده از نامهای بخش طولانی PE متکی است؛ از این رو اگر هیچکدام از این دو گزینه در خط فرمان تعیین نشده باشد، ld در صورتی که هنگام پیوند دادن یک تصویر اجرایی و بدون حذف نمادها، وجود اطلاعات اشکالزدایی را تشخیص دهد، با نادیده گرفتن رفتار پیشفرض و از نظر فنی درست، نامهای بخش طولانی را فعال خواهد کرد. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --enable-stdcall-fixup
- --disable-stdcall-fixup
- اگر پیوند به نمادی برخورد کند که نتواند آن را حل کند، تلاش میکند با جستجوی نماد تعریفشده دیگری که تنها در قالب نام نماد تفاوت دارد (cdecl در برابر stdcall) «پیوند فازی» (fuzzy linking) انجام دهد و آن نماد را با پیوند زدن به نماد مطابق برطرف سازد. برای نمونه، نماد تعریفنشده "_foo" ممکن است به تابع "_foo@12" پیوند بخورد، یا نماد تعریفنشده "_bar@16" ممکن است به تابع "_bar" پیوند داده شود. هنگامی که پیونددهنده چنین میکند، هشداری چاپ میکند؛ زیرا معمولاً پیوند باید ناموفق میبود، اما گاهی کتابخانههای وارداتی تولیدشده از dllهای شخص ثالث برای قابل استفاده بودن ممکن است به این ویژگی نیاز داشته باشند. اگر --enable-stdcall-fixup را تعیین کنید، این ویژگی به طور کامل فعال شده و هشداری چاپ نمیشود. اگر --disable-stdcall-fixup را تعیین کنید، این ویژگی غیرفعال شده و چنین ناهماهنگیهایی به عنوان خطا تلقی میشوند. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --leading-underscore
- --no-leading-underscore
- برای بیشتر هدفها، پیشوند پیشفرض نماد یک زیرخط (_) است و در شرح هدف تعریف شده است. با این گزینه میتوان پیشوند نماد زیرخط پیشفرض را غیرفعال/فعال کرد. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --export-all-symbols
- در صورت تعیین، تمام نمادهای سراسری موجود در اشیاء به کار رفته برای ساخت یک DLL، توسط آن DLL برونریزی خواهند شد. توجه داشته باشید اگر در غیر این صورت هیچ نماد برونریزیشدهای وجود نداشت، این حالت پیشفرض است. هنگامی که نمادها صریحاً از طریق پروندههای DEF برونریزی میشوند یا به طور ضمنی از طریق ویژگیهای تابع برونریزی میگردند، پیشفرض این است که هیچ چیز دیگری برونریزی نشود مگر آنکه این گزینه داده شود. توجه کنید که نمادهای "DllMain@12"، "DllEntryPoint@0"، "DllMainCRTStartup@12" و "impure_ptr" به طور خودکار برونریزی نخواهند شد. همچنین نمادهای واردشده از سایر DLLها بازبرونریزی نخواهند شد، و نه نمادهایی که چیدمان درونی DLL را مشخص میکنند، مانند آنهایی که با "_head_" آغاز میشوند یا به "_iname" پایان مییابند. علاوه بر این، هیچ نمادی از "libgcc"، "libstd++"، "libmingw32" یا "crtX.o" برونریزی نخواهد شد. نمادهایی که نامشان با "__rtti_" یا "__builtin_" آغاز میشود، جهت کمک به DLLهای ++C برونریزی نخواهند شد. در نهایت، فهرست گستردهای از نمادهای خصوصی cygwin وجود دارد که برونریزی نمیشوند (بدیهی است که این تنها هنگام ساخت DLL برای هدفهای cygwin اعمال میشود). این استثناهای cygwin عبارتند از: "_cygwin_dll_entry@12"، "_cygwin_crt0_common@8"، "_cygwin_noncygwin_dll_entry@12"، "_fmode"، "_impure_ptr"، "cygwin_attach_dll"، "cygwin_premain0"، "cygwin_premain1"، "cygwin_premain2"، "cygwin_premain3" و "environ". [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --exclude-symbols symbol,symbol,...
- فهرستی از نمادها را تعیین میکند که نباید به طور خودکار برونریزی شوند. نامهای نمادها میتوانند با کاما یا دونقطه جدا شوند. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --exclude-all-symbols
- مشخص میکند که هیچ نمادی نباید به طور خودکار برونریزی شود. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --file-alignment
- همترازی پرونده را تعیین میکند. بخشها در پرونده همواره در آفستهایی از پرونده آغاز میشوند که مضربی از این عدد باشند. پیشفرض ۵۱۲ است. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --heap reserve
- --heap reserve,commit
- تعداد بایتهای حافظه را برای رزرو (و در صورت تمایل، تعهد / commit) جهت استفاده به عنوان هیپ برای این برنامه تعیین میکند. پیشفرض 1MB رزروشده و 4K متعهدشده (تخصیصیافته) است. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --kill-at
- در صورت تعیین، پسوندهای stdcall (@nn) پیش از برونریزی نمادها از آنها برداشته خواهند شد. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --large-address-aware
- در صورت تعیین، بیت مربوطه در فیلد «Characteristics» از سرآیند COFF تنظیم میشود تا نشان دهد این فایل اجرایی از نشانیهای مجازی بزرگتر از ۲ گیگابایت پشتیبانی میکند. این گزینه باید همراه با سوییچ /3GB یا /USERVA=value مگابایت در بخش «[operating systems]» از فایل BOOT.INI استفاده شود. در غیر این صورت، این بیت هیچ اثری ندارد. [این گزینه ویژه پورت پیونددهنده با هدف i386 PE است]
- --disable-large-address-aware
- اثر گزینهٔ پیشین --large-address-aware را بازمیگرداند. این گزینه زمانی کاربرد دارد که --large-address-aware همواره توسط گردانندهٔ کامپایلر (مانند Cygwin gcc) تنظیم شده باشد و فایل اجرایی از نشانیهای مجازی بزرگتر از ۲ گیگابایت پشتیبانی نکند. [این گزینه ویژه پورت پیونددهنده با هدف i386 PE است]
- --major-image-version value
- شمارهٔ اصلی «image version» را تعیین میکند. مقدار پیشفرض ۱ است. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --major-os-version value
- شمارهٔ اصلی «os version» را تعیین میکند. مقدار پیشفرض ۴ است. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --major-subsystem-version value
- شمارهٔ اصلی «subsystem version» را تعیین میکند. مقدار پیشفرض ۴ است. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --minor-image-version value
- شمارهٔ فرعی «image version» را تعیین میکند. مقدار پیشفرض ۰ است. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --minor-os-version value
- شمارهٔ فرعی «os version» را تعیین میکند. مقدار پیشفرض ۰ است. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --minor-subsystem-version value
- شمارهٔ فرعی «subsystem version» را تعیین میکند. مقدار پیشفرض ۰ است. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --output-def file
- پیونددهنده فایل file را ایجاد خواهد کرد که حاوی یک فایل DEF متناظر با DLL در حال تولید توسط پیونددهنده است. این فایل DEF (که باید "*.def" نامیده شود) ممکن است برای ایجاد یک کتابخانهٔ وارداتی با "dlltool" به کار رود یا به عنوان مرجعی برای نمادهای برونریزیشدهٔ خودکار یا ضمنی استفاده شود. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --enable-auto-image-base
- --enable-auto-image-base=value
- به طور خودکار پایهٔ تصویر را برای DLLها انتخاب میکند، و در صورت تمایل از مقدار پایهٔ value شروع میکند، مگر اینکه با آرگومان "--image-base" مقداری مشخص شده باشد. با استفاده از یک درهمسازی (هش) تولیدشده از dllname برای ساخت پایههای تصویر یکتا برای هر DLL، از تداخلها و بازتخصیصهای درونحافظهای که میتوانند اجرای برنامه را به تأخیر بیندازند جلوگیری میشود. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --disable-auto-image-base
- پایهٔ تصویر یکتا را به طور خودکار تولید نمیکند. اگر پایهٔ تصویری توسط کاربر مشخص نشده باشد ("--image-base")، از مقدار پیشفرض بستر استفاده میشود. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --dll-search-prefix string
- هنگام پیوند پویا به یک dll بدون کتابخانهٔ وارداتی، به جای "lib<basename>.dll" در اولویت به جستجوی "<string><basename>.dll" میپردازد. این رفتار امکان تمایز آسان بین DLLهای ساختهشده برای انواع «زیربسترها» را فراهم میآورد: native، cygwin، uwin، pw و غیره. برای نمونه، DLLهای cygwin معمولاً از "--dll-search-prefix=cyg" استفاده میکنند. [این گزینه ویژه پورتهای پیونددهنده با هدف PE است]
- --enable-auto-import
- پیوند
پیشرفتهٔ
"_symbol" به
"__imp__symbol" را
برای
واردات DATA از
DLLها انجام
میدهد، و
در نتیجه
دور زدن
سازوکار dllimport
را در سمت
کاربر و
ارجاع به
نامهای
نماد
تغییرنیافته
(unmangled) ممکن
میسازد.
[این گزینه
ویژه
پورتهای
پیونددهنده
با هدف PE است]
ملاحظات زیر مربوط به پیادهسازی اولیهٔ این ویژگی است و امروزه برای مقصدهای Cygwin و MinGW منسوخ شده است.
نکته: استفاده از پسوند 'auto-import' باعث میشود بخش text در فایل تصویر قابل نوشتن شود. این با مشخصات قالب PE-COFF منتشرشده توسط مایکروسافت مطابقت ندارد.
نکته - استفاده از پسوند 'auto-import' همچنین باعث میشود دادههای فقطخواندنی که معمولاً در بخش .rdata قرار میگیرند، در عوض در بخش .data قرار گیرند. این کار برای دور زدن مشکلی با constها است که در اینجا شرح داده شده است: http://www.cygwin.com/ml/cygwin/2004-09/msg01101.html
استفاده از 'auto-import' معمولاً به درستی کار میکند -- اما گاهی اوقات ممکن است این پیام را ببینید:
"variable '<var>' can't be auto-imported. Please read the documentation for ld's "--enable-auto-import" for details."
این پیام زمانی رخ میدهد که یک (زیر)عبارت به نشانیای دسترسی پیدا میکند که در نهایت از مجموع دو ثابت حاصل شده است (جدولهای واردات Win32 تنها یکی را مجاز میدانند). مواردی که این وضعیت ممکن است رخ دهد شامل دسترسی به فیلدهای عضو متغیرهای struct واردشده از یک DLL، و همچنین استفاده از یک اندیس ثابت در یک متغیر آرایهای واردشده از یک DLL است. هر متغیر چندکلمهای (آرایهها، structها، long long و غیره) ممکن است این شرایط خطا را برانگیزد. با این حال، صرفنظر از نوع دادهای دقیق متغیر صادرشدهٔ خاطی، ld همواره آن را تشخیص داده، هشدار صادر میکند و خارج میشود.
چندین راه برای برطرف کردن این دشواری، صرفنظر از نوع دادهای متغیر صادرشده، وجود دارد:
یک راه استفاده از سوییچ --enable-runtime-pseudo-reloc است. این کار وظیفهٔ تنظیم ارجاعات در کد کارخواه شما را به محیط زمان اجرا واگذار میکند، بنابراین این روش تنها زمانی کار میکند که محیط زمان اجرا از این ویژگی پشتیبانی کند.
راهکار دوم این است که یکی از «ثابتها» اجباراً یک متغیر باشد -- یعنی در زمان کامپایل ناشناخته و غیرقابل بهینهسازی باشد. برای آرایهها، دو احتمال وجود دارد: الف) متغیر کردن نشانی آرایه (indexee)، یا ب) متغیر کردن اندیس «ثابت». بنابراین:
extern type extern_array[]; extern_array[1] --> { volatile type *t=extern_array; t[1] }یا
extern type extern_array[]; extern_array[1] --> { volatile int t=1; extern_array[t] }برای structها (و بیشتر دیگر انواع دادهای چندکلمهای) تنها گزینه این است که خود struct (یا long long یا ...) متغیر شود:
extern struct s extern_struct; extern_struct.field --> { volatile struct s *t=&extern_struct; t->field }یا
extern long long extern_ll; extern_ll --> { volatile long long * local_ll=&extern_ll; *local_ll }روش سوم برای مواجهه با این دشواری، رها کردن 'auto-import' برای نماد خاطی و علامتگذاری آن با "__declspec(dllimport)" است. با این حال، در عمل این کار نیازمند استفاده از #defineهای زمان کامپایل است تا مشخص شود که آیا در حال ساخت یک DLL هستید، یا ساخت کد کارخواهی که به DLL پیوند مییابد، یا صرفاً ساخت/پیوند به یک کتابخانهٔ ایستا. در گزینش میان روشهای گوناگون برطرف کردن مسئلهٔ «نشانی مستقیم با آفست ثابت»، باید کاربردهای معمول در دنیای واقعی را در نظر بگیرید:
اصلی:
--foo.h extern int arr[]; --foo.c #include "foo.h" void main(int argc, char **argv){ printf("%d\n",arr[1]); }راهکار ۱:
--foo.h extern int arr[]; --foo.c #include "foo.h" void main(int argc, char **argv){ /* This workaround is for win32 and cygwin; do not "optimize" */ volatile int *parr = arr; printf("%d\n",parr[1]); }راهکار ۲:
--foo.h /* Note: auto-export is assumed (no __declspec(dllexport)) */ #if (defined(_WIN32) || defined(__CYGWIN__)) && \ !(defined(FOO_BUILD_DLL) || defined(FOO_STATIC)) #define FOO_IMPORT __declspec(dllimport) #else #define FOO_IMPORT #endif extern FOO_IMPORT int arr[]; --foo.c #include "foo.h" void main(int argc, char **argv){ printf("%d\n",arr[1]); }راه چهارم برای اجتناب از این مشکل، بازنویسی کد کتابخانه به منظور استفاده از یک رابط تابعی به جای رابط دادهای برای متغیرهای خاطی است (مانند توابع دسترسی set_foo() و get_foo()).
- --disable-auto-import
- از تلاش برای پیوند پیچیدهٔ "_symbol" به "__imp__symbol" جهت واردات داده (DATA) از DLLها خودداری میکند. [این گزینه ویژه درگاههای با هدف PE در پیونددهنده است]
- --enable-runtime-pseudo-reloc
- اگر کد شما حاوی عبارتهای توصیفشده در بخش --enable-auto-import باشد، یعنی واردات داده (DATA) از DLL با آفست غیرصفر، این سوئیچ برداری از 'شبهبازنشانیهای زمان اجرا' (runtime pseudo relocations) ایجاد میکند که میتواند توسط محیط زمان اجرا برای تنظیم ارجاعات به چنین دادههایی در کد کلاینت شما به کار رود. [این گزینه ویژه درگاههای با هدف PE در پیونددهنده است]
- --disable-runtime-pseudo-reloc
- شبهبازنشانیها را برای واردات داده (DATA) با آفست غیرصفر از DLLها ایجاد نمیکند. [این گزینه ویژه درگاههای با هدف PE در پیونددهنده است]
- --enable-extra-pe-debug
- اطلاعات اشکالزدایی اضافی مربوط به تبدیل پیوندی نمادهای واردات خودکار (auto-import symbol thunking) را نمایش میدهد. [این گزینه ویژه درگاههای با هدف PE در پیونددهنده است]
- --section-alignment
- ترازبندی بخشها را تعیین میکند. بخشها در حافظه همواره در نشانیهایی آغاز میشوند که مضربی از این عدد باشند. مقدار پیشفرض 0x1000 است. [این گزینه ویژه درگاههای با هدف PE در پیونددهنده است]
- --stack reserve
- --stack reserve,commit
- تعداد بایتهای حافظه را برای رزرو (و به طور اختیاری تخصیص یا commit) جهت استفاده به عنوان پشته (stack) برای این برنامه مشخص میکند. مقدار پیشفرض ۲ مگابایت رزروشده و ۴ کیلوبایت تخصیصیافته است. [این گزینه ویژه درگاههای با هدف PE در پیونددهنده است]
- --subsystem which
- --subsystem which:major
- --subsystem which:major.minor
- زیرسیستمی
را که
برنامه شما
تحت آن اجرا
خواهد شد
مشخص
میکند.
مقادیر
مجاز برای
which عبارتند
از "native"،
"windows"،
"console"،
"posix" و
"xbox".
همچنین
میتوانید
به صورت
اختیاری
نسخه
زیرسیستم
را تعیین
کنید.
مقادیر
عددی نیز
برای which
پذیرفته
میشوند.
[این گزینه
ویژه
درگاههای
با هدف PE در
پیونددهنده
است]
گزینههای زیر پرچمهایی را در فیلد "DllCharacteristics" سربرگ فایل PE تنظیم میکنند: [این گزینهها ویژه درگاههای با هدف PE در پیونددهنده هستند]
- --high-entropy-va
- --disable-high-entropy-va
- تصویر با
تصادفیسازی
چیدمان
فضای نشانی
۶۴بیتی (ASLR)
سازگار است.
این گزینه
به طور
پیشفرض
برای
تصاویر PE
۶۴بیتی در
اهداف MinGW
فعال است.
این گزینه همچنین مستلزم --dynamicbase و --enable-reloc-section است. [این گزینه ویژه درگاههای با هدف PE ۶۴بیتی در پیونددهنده است]
- --dynamicbase
- --disable-dynamicbase
- نشانی پایه تصویر ممکن است با استفاده از تصادفیسازی چیدمان فضای نشانی (ASLR) بازنشانی شود. این ویژگی با MS Windows Vista معرفی شد. این گزینه به طور پیشفرض برای اهداف MinGW فعال است اما میتواند از طریق گزینه --disable-dynamicbase غیرفعال شود. این گزینه همچنین مستلزم --enable-reloc-section است.
- --forceinteg
- --disable-forceinteg
- بررسیهای یکپارچگی کد اجباری میشوند. این گزینه به طور پیشفرض غیرفعال است.
- --nxcompat
- --disable-nxcompat
- تصویر با سازوکار جلوگیری از اجرای داده (Data Execution Prevention) سازگار است. این ویژگی با MS Windows XP SP2 معرفی شد. این گزینه به طور پیشفرض برای اهداف MinGW فعال است.
- --no-isolation
- --disable-no-isolation
- هرچند تصویر مفهوم جداسازی را میشناسد، اما تصویر را جداسازی نکن. این گزینه به طور پیشفرض غیرفعال است.
- --no-seh
- --disable-no-seh
- تصویر از SEH استفاده نمیکند. هیچ گرداننده SE نباید از این تصویر فراخوانی شود. این گزینه به طور پیشفرض غیرفعال است.
- --no-bind
- --disable-no-bind
- این تصویر را مقید (bind) نکن. این گزینه به طور پیشفرض غیرفعال است.
- --wdmdriver
- --disable-wdmdriver
- درایور از مدل راهانداز MS Windows Driver Model استفاده میکند. این گزینه به طور پیشفرض غیرفعال است.
- --tsaware
- --disable-tsaware
- تصویر با سرور ترمینال (Terminal Server) سازگار است. این گزینه به طور پیشفرض غیرفعال است.
- --insert-timestamp
- --no-insert-timestamp
- یک برچسب
زمانی
واقعی درون
تصویر درج
میکند. این
رفتار
پیشفرض
است زیرا با
کدهای
موروثی
مطابقت
دارد و بدین
معناست که
تصویر با
سایر
ابزارهای
اختصاصی
کار خواهد
کرد. مشکل
این رفتار
پیشفرض
این است که
هر بار با
پیوند دادن
همان
سورسها،
تصاویری با
تفاوتهای
اندک تولید
میشوند.
گزینه --no-insert-timestamp
میتواند
برای درج
مقدار صفر
به عنوان
برچسب
زمانی به
کار رود، که
این امر
اطمینان
میدهد
باینریهای
تولیدشده
از
سورسهای
همسان،
مقایسهای
کاملاً
یکسان
داشته
باشند.
اگر --insert-timestamp فعال باشد، زمان درجشده یا زمانی است که پیوند انجام میگیرد یا، در صورتی که متغیر محیطی "SOURCE_DATE_EPOCH" تعریف شده باشد، تعداد ثانیههای سپریشده از مبدا یونیکس (Unix epoch) طبق مقدار تعیینشده در آن متغیر خواهد بود.
- --enable-reloc-section
- --disable-reloc-section
- جدول بازنشانی پایه را ایجاد میکند، که چنانچه تصویر در نشانی پایهای متفاوت از آنچه در سربرگ PE مشخص شده بارگیری شود، ضروری است. این گزینه به طور پیشفرض فعال است.
هدف C6X uClinux از یک قالب باینری به نام DSBT برای پشتیبانی از کتابخانههای اشتراکی استفاده میکند. هر کتابخانه اشتراکی در سیستم باید دارای یک نمایه یکتا باشد؛ تمام فایلهای اجرایی از نمایه 0 استفاده میکنند.
- --dsbt-size size
- این گزینه تعداد مدخلهای DSBT فایل اجرایی یا کتابخانه اشتراکی جاری را برابر با size تعیین میکند. پیشفرض، ساخت جدولی با ۶۴ مدخل است.
- --dsbt-index index
- این گزینه
نمایه DSBT
فایل
اجرایی یا
کتابخانه
اشتراکی
جاری را
برابر با index
قرار
میدهد.
پیشفرض 0
است، که
برای تولید
فایلهای
اجرایی
مناسب است.
اگر یک
کتابخانه
اشتراکی با
نمایه DSBT
برابر با 0
تولید شود،
بازنشانیهای
"R_C6000_DSBT_INDEX"
درون فایل
خروجی
رونویسی
میشوند.
سوئیچ --no-merge-exidx-entries ادغام مدخلهای مجاور exidx را در اطلاعات بازپیچی فریم (frame unwind info) غیرفعال میکند.
- --branch-stub
- این گزینه با درج بخشهای تکهکد انشعاب (branch stub) در صورت نیاز جهت گسترش دامنه انشعابها، تعدیل انشعاب (branch relaxation) در پیونددهنده را فعال میکند. این گزینه معمولاً مورد نیاز نیست زیرا C-SKY از دستورهای انشعاب و فراخوانی با قابلیت دسترسی به کل دامنه حافظه پشتیبانی میکند و تعدیل انشعاب به طور معمول توسط کامپایلر یا اسمبلر مدیریت میشود.
- --stub-group-size=N
- این گزینه امکان مهار دقیقتر ایجاد تکهکد انشعاب توسط پیونددهنده را فراهم میسازد. این سوئیچ حداکثر اندازه گروهی از بخشهای ورودی را که میتواند توسط یک بخش تکهکد اداره شود تعیین میکند. مقدار منفی برای N، بخشهای تکهکد را پس از انشعابهای آنها قرار میدهد، در حالی که مقدار مثبت اجازه میدهد بخشهای تکهکد پیش یا پس از انشعابها پدیدار شوند. مقادیر 1 یا -1 نشان میدهند که پیونددهنده باید پیشفرضهای مناسب را برگزیند.
پیونددهندههای 68HC11 و 68HC12 از گزینههای خاصی برای مهار نگاشت تعویض بانک حافظه و تولید کد ترامپولین (trampoline) پشتیبانی میکنند.
- --no-trampoline
- این گزینه تولید ترامپولین را غیرفعال میکند. به طور پیشفرض برای هر تابع دور که با دستور "jsr" فراخوانی شود (زمانی که اشارهگری به یک تابع دور گرفته شود)، یک ترامپولین تولید میشود.
- --bank-window name
- این گزینه نام ناحیه حافظه در مشخصات MEMORY را که پنجره بانک حافظه را توصیف میکند به پیونددهنده نشان میدهد. تعریف چنین ناحیهای سپس توسط پیونددهنده برای محاسبه صفحهبندی و نشانیها درون پنجره حافظه به کار میرود.
گزینههای زیر برای واپایش مدیریت تولید GOT هنگام پیوند برای اهداف 68K پشتیبانی میشوند.
- --got=type
- این گزینه به پیونددهنده میگوید از کدام طرح تولید GOT استفاده کند. type باید یکی از single، negative، multigot یا target باشد. برای اطلاعات بیشتر به مدخل Info برای ld مراجعه کنید.
گزینههای زیر برای مهار تولید دستورالعمل microMIPS و بررسیهای بازنشانی شاخه برای گذارهای حالت ISA هنگام پیوند برای اهداف MIPS پشتیبانی میشوند.
- --insn32
- --no-insn32
- این گزینهها انتخاب دستورالعملهای microMIPS بهکاررفته در کد تولیدشده توسط پیونددهنده، مانند کد موجود در PLT یا خردبرنامههای پیوند دیرهنگام (lazy binding stubs)، یا در کاهش طول دستورالعمل (relaxation) را واپایش میکنند. اگر --insn32 به کار رود، پیونددهنده تنها از کدگذاریهای دستورالعمل ۳۲-بیتی بهره میگیرد. بهطور پیشفرض یا در صورت استفاده از --no-insn32، همه کدگذاریهای دستورالعمل، از جمله موارد ۱۶-بیتی در صورت امکان، به کار میروند.
- --ignore-branch-isa
- --no-ignore-branch-isa
- این گزینهها بررسیهای بازنشانی شاخه برای گذارهای نامعتبر حالت ISA را واپایش میکنند. اگر --ignore-branch-isa استفاده شود، پیونددهنده هرگونه بازنشانی شاخه را میپذیرد و هر گذار حالت ISA مورد نیاز در محاسبه بازنشانی از دست میرود، به جز مواردی از دستورالعملهای "BAL" که شرایط بهینهسازی (relaxation) را دارند و همزمان با محاسبه بازنشانی وابسته به دستورالعملهای معادل "JALX" تبدیل میشوند. بهطور پیشفرض یا اگر --no-ignore-branch-isa استفاده شود، بررسی انجام میگیرد که باعث میشود از دست رفتن گذار حالت ISA خطا تولید کند.
- --compact-branches
- --no-compact-branches
- این گزینهها تولید دستورالعملهای فشرده (compact instructions) توسط پیونددهنده را در مدخلهای PLT برای MIPS R6 واپایش میکنند.
برای هدف pdp11-aout، سه گونه از قالب خروجی با گزینههای زیر قابل تولید است. گونه پیشفرض برای pdp11-aout گزینه --omagic است، در حالی که برای اهداف دیگر --nmagic پیشفرض است. گزینه --imagic تنها برای هدف pdp11-aout تعریف شده است، در حالی که موارد دیگر در اینجا به گونهای که برای هدف pdp11-aout اعمال میشوند شرح داده شدهاند.
- -N
- --omagic
- خروجی را در سرایند a.out با عنوان "OMAGIC" (0407) نشانهگذاری کن تا بیانگر این باشد که قطعه متن (text segment) نباید حفاظتشده در برابر نوشتن و اشتراکی باشد. از آنجا که بخشهای متن و داده هر دو خواندنی و نوشتنی هستند، بخش داده بلافاصله و بهصورت پیوسته پس از قطعه متن تخصیص مییابد. این کهنترین قالب برای برنامههای اجرایی PDP11 است و از آغاز تا 2.11BSD پیشفرض ld روی سیستمهای یونیکس PDP11 بوده است.
- -n
- --nmagic
- خروجی را در سرایند a.out با عنوان "NMAGIC" (0410) نشانهگذاری کن تا بیانگر این باشد که هنگام اجرای فایل خروجی، بخش متن فقطخواندنی و بین همه فرایندهای در حال اجرای همان فایل همرسانیپذیر (shareable) خواهد بود. این کار نیازمند جابجایی نواحی داده تا نخستین مرز صفحه ۸ کیلوبایتی ممکن پس از پایان متن است. این گزینه قالبی از نوع اجرایی ناب (pure executable) میآفریند.
- -z
- --imagic
- خروجی را در سرایند a.out با عنوان "IMAGIC" (0411) نشانهگذاری کن تا نشان دهد هنگام اجرای فایل خروجی، نواحی متن و داده برنامه با بهرهگیری از ویژگی تفکیک فضای دستورالعمل و داده در واحد مدیریت حافظه (MMU) در مدلهای بزرگتر PDP11، در فضاهای نشانی جداگانهای بارگذاری خواهند شد. این کار فضای نشانی در دسترس برنامه را دوبرابر میکند. قطعه متن دوباره ناب، حفاظتشده در برابر نوشتن، و اشتراکپذیر است. تنها ناهمسانی در قالب خروجی میان این گزینه و گزینههای دیگر، جدای از شماره جادویی (magic number)، این است که هر دو بخش متن و داده از نشانی ۰ آغاز میشوند. گزینه -z این قالب را در 2.11BSD برمیگزید. این گزینه قالبی از نوع اجرایی تفکیکشده (separate executable) پدید میآورد.
- --no-omagic
- همارز --nmagic برای pdp11-aout.
متغیرهای محیطی (ENVIRONMENT)
میتوان رفتار ld را با متغیرهای محیطی "GNUTARGET"، "LDEMULATION" و "COLLECT_NO_DEMANGLE" دگرگون کرد.
متغیر محیطی "GNUTARGET" اگر از -b (یا همارز آن --format) استفاده نکنید، قالب شیء فایل ورودی را تعیین میکند. مقدار آن باید یکی از نامهای BFD برای یک قالب ورودی باشد. اگر متغیر "GNUTARGET" در محیط وجود نداشته باشد، ld از قالب طبیعی هدف استفاده میکند. اگر "GNUTARGET" روی "default" تنظیم شده باشد، BFD با بررسی فایلهای ورودی باینری میکوشد قالب ورودی را شناسایی کند؛ این شیوه اغلب کارساز است، ولی ابهامهای بالقوهای به همراه دارد، چون روشی برای تضمین یکتایی شماره جادویی بهکاررفته برای تعیین قالبهای فایل شیء وجود ندارد. با این همه، روند پیکربندی BFD روی هر سیستم، قالب قراردادی آن سیستم را در آغاز فهرست جستجو قرار میدهد، بنابراین ابهامها به سود شیوه قراردادی برطرف میشوند.
متغیر محیطی "LDEMULATION" چنانچه از گزینه -m استفاده نشود، شبیهسازی پیشفرض را مشخص میکند. این شبیهسازی میتواند بر جنبههای گوناگون رفتار پیونددهنده، بهویژه اسکریپت پیشفرض پیونددهنده اثر بگذارد. میتوان شبیهسازیهای دردسترس را با گزینههای --verbose یا -V فهرست کرد. اگر گزینه -m به کار نرود و متغیر محیطی "LDEMULATION" تعریف نشده باشد، شبیهسازی پیشفرض به شیوه پیکربندی پیونددهنده وابسته است.
بهطور معمول، حالت پیشفرض پیونددهنده نامگشایی نمادها (demangling) است. با این حال، چنانچه "COLLECT_NO_DEMANGLE" در محیط تنظیم شده باشد، حالت پیشفرض نامگشایی نکردن نمادها خواهد بود. این متغیر محیطی به شیوهای مشابه توسط برنامه پوششدهنده پیونددهنده "gcc" به کار میرود. حالت پیشفرض را میتوان با گزینههای --demangle و --no-demangle دگرگون ساخت.
اگر گزینه وابسته به PE/COFF یعنی --insert-timestamp فعال باشد و متغیر محیطی SOURCE_DATE_EPOCH تعریف شده باشد، مقدار برچسب زمان در این متغیر به جای زمان کنونی درون سرایند COFF گنجانده خواهد شد.
اگر متغیر محیطی "LD_STATS" تعریف شده باشد، اطلاعات بهرهگیری پیونددهنده از منابع ثبت میشود، درست همانند حالتی که از گزینه --stats استفاده شده باشد. اگر متغیر "LD_STATS" دارای مقداری رشتهای باشد، از آن به عنوان نام فایلی که اطلاعات باید در آن اندوخته شود بهره گرفته میشود. در غیر این صورت، اطلاعات به جریان خروجی استاندارد فرستاده خواهد شد.
همچنین ببینید (SEE ALSO)
ar(1)، nm(1)، objcopy(1)، objdump(1)، readelf(1) و مدخلهای Info برای binutils و ld.
حق نشر (COPYRIGHT)
Copyright (c) 1991-2026 Free Software Foundation, Inc.
اجازه نسخهبرداری، توزیع و/یا تغییر این سند تحت شرایط «مجوز مستندات آزاد گنو» (GNU Free Documentation License)، نسخه ۱.۳ یا هر نسخه جدیدتر منتشرشده توسط بنیاد نرمافزارهای آزاد اعطا میشود؛ بدون بخشهای تغییرناپذیر، بدون متنهای روی جلد و بدون متنهای پشت جلد. نسخهای از مجوز در بخشی تحت عنوان «GNU Free Documentation License» گنجانده شده است.
| 2026-07-26 | binutils-2.47 |