| LD(1) | GNU Development Tools | LD(1) |
نام (NAME)
ld - پیونددهنده گنو
خلاصه دستور (SYNOPSIS)
ld [گزینهها] objfile ...
توضیحات (DESCRIPTION)
دستور ld چندین فایل شیء (object) و آرشیو را ترکیب کرده، دادههای آنها را بازنشانی (relocate) میکند و ارجاعات نمادها را به هم پیوند میدهد. معمولاً آخرین مرحله در کامپایل یک برنامه، اجرای 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، موجب میشوند فایل در همان نقطهای که گزینه در خط فرمان ظاهر شده است، نسبت به فایلهای شیء و سایر گزینههای فایلی خوانده شود. تکرار گزینههای غیرفایلی با یک آرگومان متفاوت، یا تأثیر بیشتری نخواهد داشت یا موارد پیشین آن گزینه (مواردی که در خط فرمان سمت چپتر قرار دارند) را باطل (override) میکند. گزینههایی که مشخص کردن بیش از یکبار آنها معنادار است، در توضیحات زیر ذکر شدهاند.
آرگومانهای غیرگزینهای، فایلهای شیء یا آرشیوهایی هستند که باید به یکدیگر پیوند داده شوند. آنها میتوانند پس از گزینههای خط فرمان، پیش از آنها یا در میان آنها قرار گیرند، با این استثنا که یک آرگومان فایل شیء نباید بین یک گزینه و آرگومان مربوط به آن قرار داده شود.
معمولاً پیونددهنده با حداقل یک فایل شیء فراخوانی میشود، اما میتوانید اشکال دیگر فایلهای ورودی دودویی (binary) را با استفاده از -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 دیگری باشد؛ تمام این گزینهها به صورت بازگشتی پردازش خواهند شد..IP "-a keyword" 4 این گزینه برای سازگاری با HP/UX پشتیبانی میشود. آرگومان keyword باید یکی از رشتههای archive، shared یا default باشد. مقدار -aarchive از نظر عملکردی معادل -Bstatic است، و دو کلیدواژه دیگر از نظر عملکرد معادل -Bdynamic هستند. از این گزینه میتوان به هر تعداد دفعات استفاده کرد.
- --audit AUDITLIB
- مقدار AUDITLIB را به مدخل "DT_AUDIT" در بخش پویا (dynamic section) میافزاید. وجود AUDITLIB بررسی نمیشود، و همچنین از DT_SONAME مشخصشده در کتابخانه استفاده نخواهد کرد. اگر چندین بار مشخص شود "DT_AUDIT" شامل فهرستی جداشده با دونقطه از رابطهای بازرسی (audit interfaces) برای استفاده خواهد بود. اگر پیونددهنده هنگام جستجوی کتابخانههای اشتراکی شیئی را با یک مدخل audit پیدا کند، یک مدخل متناظر "DT_DEPAUDIT" را در فایل خروجی اضافه میکند. این گزینه فقط در بسترهای ELF که از رابط rtld-audit پشتیبانی میکنند معنی دارد.
- -b input-format
- --format=input-format
- میتوان ld
را طوری
پیکربندی
کرد که از
بیش از یک
نوع فایل
شیء
پشتیبانی
کند. اگر ld
شما بدین
صورت
پیکربندی
شده باشد،
میتوانید
از گزینه -b
برای تعیین
قالب
باینری
فایلهای
شیء ورودی
که پس از
این گزینه
در خط فرمان
میآیند
استفاده
کنید. حتی
وقتی ld
برای
پشتیبانی
از
قالبهای
شیء
جایگزین
پیکربندی
شده است،
معمولاً
نیازی به
مشخص کردن
این گزینه
ندارید،
زیرا ld
باید طوری
پیکربندی
شده باشد که
رایجترین
قالب را روی
هر ماشین به
عنوان قالب
ورودی
پیشفرض در
نظر بگیرد.
input-format یک رشته
متنی است؛
نام قالبی
مشخص که
توسط
کتابخانههای
BFD پشتیبانی
میشود.
(میتوانید
قالبهای
باینری
موجود را با
objdump -i فهرست
کنید.)
ممکن است بخواهید هنگام پیوند دادن فایلهایی با یک قالب باینری غیرمعمول از این گزینه استفاده کنید. همچنین میتوانید با قرار دادن -b input-format پیش از هر گروه از فایلهای شیء با یک قالب خاص، از -b برای تعویض صریح قالبها (هنگام پیوند دادن فایلهای شیء با قالبهای متفاوت) استفاده کنید.
قالب پیشفرض از متغیر محیطی "GNUTARGET" گرفته میشود.
همچنین میتوانید قالب ورودی را از طریق یک اسکریپت و با استفاده از دستور "TARGET" تعریف کنید؛
- -c MRI-commandfile
- --mri-script=MRI-commandfile
- برای سازگاری با پیونددهندههای تولیدشده توسط MRI، برنامه ld فایلهای اسکریپت نوشتهشده به یک زبان دستور جایگزین و محدود را میپذیرد که در بخش MRI Compatible Script Files در مستندات GNU ld شرح داده شده است. فایلهای اسکریپت MRI را با گزینه -c معرفی کنید؛ برای اجرای اسکریپتهای پیونددهندهای که با زبان اسکریپتنویسی همهمنظوره ld نوشته شدهاند از گزینه -T استفاده نمایید. اگر MRI-cmdfile وجود نداشته باشد، ld در دایرکتوریهای مشخصشده توسط هر یک از گزینههای -L به دنبال آن میگردد.
- -d
- -dc
- -dp
- این سه گزینه معادل یکدیگرند؛ شکلهای متعددی برای سازگاری با سایر پیونددهندهها پشتیبانی میشوند. آنها فضا را به نمادهای عمومی (common symbols) اختصاص میدهند، حتی اگر یک فایل خروجی جابهجاشونده (با -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 میتواند همچنین نام تابع اصلی باشد (بدون خط زیرین ابتدایی و/یا @number پایانی مربوط به stdcall در صورت لزوم).
- --exclude-libs lib,lib,...
- فهرستی از کتابخانههای آرشیو را مشخص میکند که نمادهای آنها نباید بهطور خودکار برونریزی شوند. نامهای کتابخانهها میتوانند با کاما یا دونقطه از هم جدا شوند. مشخص کردن "--exclude-libs ALL" نمادهای موجود در تمام کتابخانههای آرشیو را از برونریزی خودکار مستثنی میکند. این گزینه فقط برای پورت پیونددهنده با مقصد i386 PE و برای پورتهای با مقصد ELF در دسترس است. برای i386 PE، نمادهایی که صراحتاً در یک فایل .def فهرست شدهاند، صرفنظر از این گزینه، همچنان برونریزی میشوند. برای پورتهای با مقصد ELF، با نمادهای تحت تأثیر این گزینه به صورت پنهان رفتار خواهد شد.
- --exclude-modules-for-implib module,module,...
- فهرستی از فایلهای شیء یا اعضای آرشیو را مشخص میکند که نمادهای آنها نباید بهطور خودکار برونریزی شوند، بلکه باید بهطور یکپارچه در کتابخانه واردات در حال تولید حین پیوند، رونوشت شوند. نامهای ماژولها میتوانند با کاما یا دونقطه جدا شوند، و باید دقیقاً با نام فایلهایی که توسط ld برای باز کردن فایلها استفاده شده مطابقت داشته باشند؛ برای اعضای آرشیو، این صرفاً نام عضو است، اما برای فایلهای شیء، نام فهرستشده باید شامل هر مسیری باشد که برای تعیین فایل ورودی در خط فرمان پیونددهنده استفاده شده است و دقیقاً با آن مطابقت کند. این گزینه تنها برای پورت پیونددهنده با مقصد i386 PE در دسترس است. نمادهایی که به صراحت در یک فایل .def فهرست شدهاند، صرفنظر از این گزینه، همچنان برونریزی میشوند.
- -E
- --export-dynamic
- --no-export-dynamic
- هنگام
ایجاد یک
فایل
اجرایی با
پیوند
پویا،
استفاده از
گزینه -E یا
گزینه --export-dynamic
باعث
میشود
پیونددهنده
تمام
نمادها را
به جدول
نمادهای
پویا اضافه
کند. جدول
نمادهای
پویا
مجموعهای
از نمادها
است که در
زمان اجرا
از اشیاء
پویا قابل
مشاهده
هستند.
اگر از هیچیک از این گزینهها استفاده نکنید (یا از گزینه --no-export-dynamic برای بازگرداندن رفتار پیشفرض استفاده کنید)، جدول نمادهای پویا معمولاً فقط شامل آن نمادهایی خواهد بود که توسط یک شیء پویای ذکرشده در فرایند پیوند، به آنها ارجاع داده شده است.
اگر از "dlopen" برای بارگذاری یک شیء پویا استفاده میکنید که باید به نمادهای تعریفشده توسط برنامه (و نه یک شیء پویای دیگر) ارجاع دهد، احتمالاً هنگام پیوند دادن خود برنامه باید از این گزینه استفاده کنید.
همچنین میتوانید در صورت پشتیبانی قالب خروجی، از فهرست پویا (dynamic list) برای واپایش اینکه چه نمادهایی باید به جدول نمادهای پویا اضافه شوند استفاده کنید. توضیحات مربوط به --dynamic-list را ببینید.
توجه داشته باشید که این گزینه مختص پورتهای با مقصد ELF است. مقصدهای PE از عملکرد مشابهی برای برونریزی تمام نمادها از یک DLL یا EXE پشتیبانی میکنند؛ توضیحات --export-all-symbols را در زیر ببینید..IP --export-dynamic-symbol=glob 4 هنگام ایجاد یک فایل اجرایی با پیوند پویا، نمادهایی که با glob مطابقت داشته باشند به جدول نمادهای پویا اضافه خواهند شد. هنگام ایجاد یک کتابخانهٔ اشتراکی، ارجاعات به نمادهای منطبق بر glob به تعاریف درون کتابخانهٔ اشتراکی مقید نخواهند شد. این گزینه هنگام ایجاد یک کتابخانهٔ اشتراکی، در صورتی که -Bsymbolic یا --dynamic-list مشخص نشده باشند، بیاثر است. این گزینه تنها روی بسترهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنا دارد.
- --export-dynamic-symbol-list=file
- برای هر الگو در فایل یک --export-dynamic-symbol مشخص میکند. قالب فایل مانند گرهٔ نگارش (version node) بدون دامنه و نام گره است. برای اطلاعات بیشتر 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 گزینهٔ -F را هنگامی که شیء اشتراکی ELF ایجاد نمیکند نادیده خواهد گرفت.
- -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
- یک پیوند افزایشی انجام میدهد (مشابه گزینهٔ -r).
- -init=name
- هنگام ایجاد یک فایل اجرایی یا شیء اشتراکی ELF، با تنظیم DT_INIT روی آدرس تابع، هنگام بارگذاری فایل اجرایی یا شیء اشتراکی، NAME را فراخوانی میکند. به طور پیشفرض، پیونددهنده از "_init" به عنوان تابع فراخوانی استفاده میکند.
- -l namespec
- --library=namespec
- فایل آرشیو
یا شیء
مشخصشده
توسط namespec را
به فهرست
فایلهای
پیوند
اضافه
میکند. این
گزینه را
میتوان هر
تعداد بار
استفاده
کرد. اگر namespec
به شکل :filename
باشد، ld
مسیر
کتابخانه
را برای
فایلی به
نام filename
جستجو
میکند، در
غیر این
صورت مسیر
کتابخانه
را برای
فایلی به
نام libnamespec.a
جستجو
خواهد کرد.
در سیستمهایی که از کتابخانههای اشتراکی پشتیبانی میکنند، ممکن است ld فایلهایی غیر از libnamespec.a را نیز جستجو کند. به ویژه در سیستمهای ELF و SunOS، پیش از جستجو برای فایلی به نام libnamespec.a، دستور ld یک دایرکتوری را برای کتابخانهای به نام 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 فعال باشند، فهرست بازنگاشت در خروجی نگاشت گنجانده خواهد شد..IP -M 4
- --print-map
- یک نقشه پیوند (link map) را در خروجی استاندارد چاپ میکند. یک نقشه پیوند اطلاعاتی درباره پیوند ارائه میدهد، شامل موارد زیر:
- محل نگاشت فایلهای شیء (object files) در حافظه.
- نحوه تخصیص نمادهای عمومی (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
- فهرست بخشهای کنار گذاشتهشده و زبالهروبیشده (garbage collected) در نقشه پیوند را چاپ میکند (یا چاپ نمیکند). بهطور پیشفرض فعال است.
- --print-map-locals
- --no-print-map-locals
- نمادهای محلی را در نقشه پیوند چاپ میکند (یا چاپ نمیکند). نمادهای محلی متن (local) را پیش از نام خود خواهند داشت و پس از تمام نمادهای سراسری در یک بخش مشخص فهرست میشوند. نمادهای محلی موقت (معمولاً آنهایی که با .L شروع میشوند) در خروجی گنجانده نخواهند شد. بهطور پیشفرض غیرفعال است.
- -n
- --nmagic
- همترازی صفحهای بخشها را خاموش کرده، و پیوند با کتابخانههای مشترک را غیرفعال میکند. اگر قالب خروجی از اعداد جادویی به سبک Unix پشتیبانی کند، خروجی را به عنوان "NMAGIC" علامتگذاری میکند.
- -N
- --omagic
- بخشهای text و data را به صورت قابلخواندن و قابلنوشتن تنظیم میکند. همچنین، قطعه داده (data segment) را همتراز صفحه نمیکند، و پیوند با کتابخانههای مشترک را غیرفعال میسازد. اگر قالب خروجی از اعداد جادویی به سبک Unix پشتیبانی کند، خروجی را با عنوان "OMAGIC" علامتگذاری میکند. نکته: اگرچه بخش text قابلنوشتن برای مقصدهای PE-COFF مجاز است، اما با مشخصات قالبی که توسط مایکروسافت منتشر شده سازگار نیست.
- --no-omagic
- این گزینه بیشتر اثرات گزینه -N را خنثی میکند. این گزینه بخش text را فقطخواندنی کرده و قطعه data را مجبور به همترازی صفحهای میکند. نکته - این گزینه پیوند با کتابخانههای مشترک را فعال نمیکند. برای این منظور از -Bdynamic استفاده کنید.
- -o output
- --output=output
- از output به
عنوان نام
برنامه
تولیدشده
توسط ld
استفاده
میکند؛
اگر این
گزینه مشخص
نشده باشد،
به صورت
پیشفرض از
نام a.out
استفاده
میشود.
دستور
اسکریپت
"OUTPUT" نیز
میتواند
نام فایل
خروجی را
مشخص کند.
نکته - پیونددهنده پیش از شروع به نوشتن درون فایل خروجی، آن را حذف خواهد کرد. این کار حتی در صورتی که مشخص شود پیوند به دلیل خطاها نمیتواند کامل شود نیز انجام خواهد شد.
نکته - پیونددهنده بررسی خواهد کرد تا مطمئن شود نام فایل خروجی با نام هیچیک از فایلهای ورودی مطابقت نداشته باشد، اما فقط همین. بهویژه در صورتی که فایل خروجی ممکن است یک فایل کد منبع یا فایل مهم دیگری را بازنویسی کند، اعتراضی نخواهد کرد. بنابراین در سامانههای ساخت توصیه میشود که از گزینه -o به عنوان آخرین گزینه در خط فرمان پیونددهنده استفاده شود. برای مثال در نظر بگیرید:
ld -o $(EXE) $(OBJS) ld $(OBJS) -o $(EXE)
اگر متغیر EXE به هر دلیلی تعریف نشده باشد، نگارش اول دستور پیونددهنده میتواند در نهایت به حذف یکی از فایلهای شیء (اولین مورد در فهرست OBJS) منجر شود، در حالی که نگارش دوم دستور پیونددهنده یک پیام خطا تولید کرده و چیزی را حذف نخواهد کرد.
- --dependency-file=depfile
- یک فایل وابستگی را درون depfile مینویسد. این فایل شامل قاعدهای مناسب برای "make" است که فایل خروجی و تمام فایلهای ورودی خواندهشده برای تولید آن را توصیف میکند. این خروجی مشابه خروجی کامپایلر با -M -MP است. توجه داشته باشید که گزینهای مانند -MM در کامپایلر برای مستثنی کردن «فایلهای سیستم» وجود ندارد (که بر خلاف «سرفصلهای سیستم» در کامپایلر، در پیونددهنده مفهوم مشخص و دقیقی نیست). بنابراین خروجی حاصل از --dependency-file همیشه مختص به وضعیت دقیق نصبی است که در آن تولید شده است و نباید بدون ویرایش دقیق در makefileهای توزیعشده کپی شود.
- -O level
- اگر level یک مقدار عددی بزرگتر از صفر باشد، ld خروجی را بهینهسازی میکند. این کار ممکن است زمان بسیار بیشتری ببرد و بنابراین احتمالاً باید تنها برای باینری نهایی فعال شود. در حال حاضر این گزینه فقط بر تولید کتابخانه مشترک ELF تأثیر میگذارد. نگارشهای آینده پیونددهنده ممکن است از این گزینه استفاده بیشتری ببرند. همچنین در حال حاضر تفاوتی در رفتار پیونددهنده برای مقادیر غیرصفر مختلف این گزینه وجود ندارد. این مورد نیز ممکن است در نگارشهای آینده تغییر کند.
- -plugin name
- یک افزونه
را در
فرایند
پیوند دخیل
میکند.
پارامتر name
نام فایل
مطلق
افزونه است.
معمولاً
این
پارامتر
هنگام
استفاده از
بهینهسازی
زمان پیوند
(link time optimization) به طور
خودکار
توسط
کامپایلر
اضافه
میشود،
اما
کاربران در
صورت تمایل
میتوانند
افزونههای
خود را نیز
اضافه کنند.
توجه داشته باشید که محل افزونههای با منشأ کامپایلر با محلی که برنامههای 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، -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 اثر --push-state را باطل کرده و مقادیر پیشین پرچمهای ناظر بر مدیریت فایل ورودی را بازمیگرداند.
- -q
- --emit-relocs
-
بخشها و محتوای بازآرایی (relocation) را در فایلهای اجرایی کاملاً پیوندیافته باقی میگذارد. ابزارهای تحلیل و بهینهسازی پس از پیوند ممکن است برای انجام اصلاحات صحیح بر روی فایلهای اجرایی به این اطلاعات نیاز داشته باشند. این کار منجر به فایلهای اجرایی بزرگتر میشود. این گزینه در حال حاضر تنها روی بسترهای ELF پشتیبانی میشود.
- --force-dynamic
-
فایل خروجی را وادار میکند تا دارای بخشهای پویا (dynamic sections) باشد. این گزینه مختص مقصدهای VxWorks است.
- -r
- --relocatable
-
تولید خروجی با قابلیت بازآرایی---یعنی، تولید فایل خروجی که به نوبهٔ خود میتواند به عنوان ورودی برای ld عمل کند. این کار اغلب پیوند جزئی (partial linking) نامیده میشود. به عنوان یک اثر جانبی، در محیطهایی که از شمارههای جادویی استاندارد یونیکس پشتیبانی میکنند، این گزینه همچنین شمارهٔ جادویی فایل خروجی را روی "OMAGIC" قرار میدهد. اگر این گزینه مشخص نشود، یک فایل مطلق (غیرقابل بازآرایی) تولید میشود. هنگام پیوند برنامههای ++C، این گزینه ارجاعات به سازندهها (constructors) را حل نخواهد کرد؛ برای انجام آن، از -Ur استفاده کنید. هنگامی که قالب یک فایل ورودی با قالب فایل خروجی یکسان نیست، پیوند جزئی تنها در صورتی پشتیبانی میشود که آن فایل ورودی حاوی هیچ بازآرایی نباشد. قالبهای خروجی متفاوت میتوانند محدودیتهای بیشتری داشته باشند؛ برای نمونه برخی قالبهای مبتنی بر "a.out" اصلاً از پیوند جزئی با فایلهای ورودی در قالبهای دیگر پشتیبانی نمیکنند. هنگامی که خروجی با قابلیت بازآرایی هم حاوی محتوایی باشد که نیازمند بهینهسازی زمان پیوند (LTO) است و هم محتوایی که به LTO نیازی ندارد، یک بخش .gnu_object_only برای نگهداری یک فایل شیء با قابلیت بازآرایی ایجاد خواهد شد، گویی -r بر روی تمام ورودیهای با قابلیت بازآرایی که نیازی به LTO ندارند اعمال شده است. هنگام پردازش یک ورودی با قابلیت بازآرایی دارای بخش توجه داشته باشید از آنجا که -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
-
نمادهای سراسری تعریفشده در بخشهای کنارگذاشتهشده (discarded sections) را حذف میکند (یا حذف نمیکند). به طور پیشفرض فعال است.
- -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
-
برای برنامههایی که از سازندهها یا ویرانگرها (destructors) استفاده نمیکنند، یا برای سیستمهای مبتنی بر ELF، این گزینه معادل -r است: خروجی با قابلیت بازآرایی تولید میکند---یعنی، یک فایل خروجی که به نوبهٔ خود میتواند به عنوان ورودی برای ld عمل کند. با این حال برای سایر فایلهای باینری، گزینهٔ -Ur مشابه -r است اما ارجاعات به سازندهها و ویرانگرها را نیز حل میکند. برای آن سیستمهایی که در آنها -r و -Ur رفتار متفاوتی دارند، استفاده از -Ur روی فایلهایی که خودشان پیشتر با -Ur پیوند یافتهاند کار نمیکند؛ هنگامی که جدول سازندهها ساخته شد، دیگر نمیتوان چیزی به آن افزود. از -Ur تنها برای آخرین پیوند جزئی، و از -r برای بقیه استفاده کنید..IP --orphan-handling=MODE 4 نحوهٔ مدیریت بخشهای یتیم (orphan sections) را کنترل میکند. یک بخش یتیم بخشی است که صراحتاً در یک اسکریپت پیونددهنده ذکر نشده باشد. MODE میتواند هر یک از مقادیر زیر را داشته باشد:
- "place"
-
بخشهای یتیم با پیروی از راهبرد شرحدادهشده در Orphan Sections در یک بخش خروجی مناسب قرار میگیرند. گزینهٔ --unique نیز بر نحوهٔ قرارگیری بخشها تأثیر میگذارد.
- "discard"
-
تمام بخشهای یتیم با قرار گرفتن در بخش /DISCARD/ دور ریخته میشوند.
- "warn"
-
پیونددهنده بخش یتیم را همانند "place" قرار داده و همچنین یک هشدار صادر میکند. - "error"
-
در صورت یافتن هرگونه بخش یتیم، پیونددهنده با یک خطا خارج میشود.
مقدار پیشفرض در صورت مشخص نشدن --orphan-handling برابر "place" است.
- --unique[=SECTION]
-
برای هر بخش ورودی منطبق با SECTION، یا در صورت مشخص نشدن آرگومان اختیاری نویسهٔ عمومی (wildcard) 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 تولید میکند تا نشان دهد فایل شیء به اشارهگرهای تابع متعارف نیاز دارد و نمیتواند با بازآرایی رونوشت (copy relocation) استفاده شود. این گزینه همچنین مستلزم noextern-protected-data و nocopyreloc است. در i386 و x86-64 پشتیبانی میشود. noindirect-extern-access ویژگی GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS را از بخش .note.gnu.property حذف میکند..IP initfirst 4 این گزینه تنها هنگام ساخت یک شیء اشتراکی معنا دارد. شیء را بهگونهای علامتگذاری میکند که مقداردهی اولیه زمان اجرای آن پیش از مقداردهی اولیه زمان اجرای هر شیء دیگری که همزمان به فرآیند وارد شده است رخ دهد. به همین ترتیب، پایانبخشی زمان اجرای این شیء پس از پایانبخشی زمان اجرای تمامی اشیای دیگر انجام خواهد شد.
- interpose
-
مشخص میکند که بارگذار پویا باید ترتیب جستجوی نمادها را بهگونهای تغییر دهد که نمادهای درون این کتابخانه اشتراکی جایگزین نمادهای تمام کتابخانههای اشتراکی دیگری شوند که بدین صورت علامتگذاری نشدهاند.
- unique
- nounique
-
هنگام تولید یک کتابخانه اشتراکی یا سایر اشیای ELF با قابلیت بارگذاری پویا، آن را طوری علامتگذاری میکند که (بهطور پیشفرض) تنها یکبار و فقط در فضای نام اصلی (هنگام استفاده از "dlmopen") بارگذاری شود. این گزینه عمدتاً برای علامتگذاری کتابخانههای بنیادینی مانند libc و libpthread و غیره بهکار میرود که معمولاً تا زمانی که تنها نمونه از خودشان نباشند بهدرستی عمل نمیکنند. این رفتار میتواند توسط فراخواننده "dlmopen" لغو شود و برای سازوکارهای بارگذاری خاص (مانند کتابخانههای audit) اعمال نمیگردد.
- 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 ذخیره میکند، فایلهای اجرایی و کتابخانههای اشتراکی حاصل با پیونددهندههای پویایی که فیلد r_addend در بازنشانیهای R_X86_64_JUMP_SLOT را نادیده نمیگیرند (مانند نسخههای قدیمیتر glibc بدون تغییر نادیده گرفتن r_addend در بازنشانیهای R_X86_64_GLOB_DAT و R_X86_64_JUMP_SLOT) ناسازگار خواهند بود. برای x86_64 پشتیبانی میشود.
- muldefs
-
تعریفهای چندگانه را مجاز میشمارد.
- nocopyreloc
-
متغیرهای .dynbss تولیدشده توسط پیونددهنده را که به جای متغیرهای تعریفشده در کتابخانههای اشتراکی استفاده میشوند، غیرفعال میکند. ممکن است منجر به بازنشانیهای متن پویای متن (dynamic text relocations) شود.
- nodefaultlib
-
مشخص میکند که جستجوی بارگذار پویا برای وابستگیهای این شیء باید از هرگونه مسیر پیشفرض جستجوی کتابخانه چشمپوشی کند.
- nodelete
-
مشخص میکند که شیء نباید در زمان اجرا از حافظه خارج شود.
- nodlopen
-
مشخص میکند که شیء برای "dlopen" در دسترس نیست. - nodump
-
مشخص میکند که شیء نمیتواند توسط "dldump" دامپ شود. - noexecstack
-
شیء را به عنوان عدم نیاز به پشته قابل اجرا علامتگذاری میکند.
- noextern-protected-data
-
هنگام ساخت یک کتابخانه اشتراکی، با نمادهای دادهای محافظتشده به عنوان خارجی رفتار نمیکند. این گزینه پیشفرض بخش پشتی پیونددهنده را لغو میکند. میتواند برای دور زدن بازنشانیهای نادرست تولیدشده توسط کامپایلر روی نمادهای دادهای محافظتشده استفاده شود. بهروزرسانیهای انجامشده روی نمادهای دادهای محافظتشده توسط یک ماژول دیگر، برای کتابخانه اشتراکی حاصل قابل مشاهده نخواهد بود. برای i386 و x86-64 پشتیبانی میشود.
- noreloc-overflow
-
بررسی سرریز بازنشانی را غیرفعال میکند. این گزینه زمانی میتواند برای غیرفعال کردن بررسی سرریز بازنشانی به کار رود که در زمان اجرا هیچ سرریز بازنشانی پویایی رخ ندهد. برای x86_64 پشتیبانی میشود.
- memory-seal
- nomemory-seal
-
به فایل اجرایی یا کتابخانه اشتراکی دستور میدهد که تمامی سگمنتهای PT_LOAD باید مهروموم شوند تا از دستکاریهای بیشتر (مانند تغییر پرچمهای حفاظت، اندازه سگمنت یا حذف نگاشت) جلوگیری شود. این یک مقاومسازی امنیتی است که به پشتیبانی سیستم نیاز دارد. این گزینه GNU_PROPERTY_MEMORY_SEAL را در بخش
- now
-
هنگام تولید یک فایل اجرایی یا کتابخانه اشتراکی، آن را طوری علامتگذاری میکند که به پیونددهنده پویا بگوید تمام نمادها را در زمان آغاز برنامه، یا هنگام بارگذاری کتابخانه اشتراکی توسط dlopen تفکیک کند؛ به جای اینکه تفکیک فراخوانی توابع را به زمان نخستین فراخوانی تابع موکول نماید.
- origin
-
مشخص میکند که شیء به پردازش $ORIGIN در مسیرها نیاز دارد. - pack-relative-relocs
- nopack-relative-relocs
-
بازنشانی نسبی فشرده را در اجراییهای مستقل از موقعیت و کتابخانههای اشتراکی تولید میکند. این گزینه مدخلهای "DT_RELR"، "DT_RELRSZ" و "DT_RELRENT" را به بخش پویا اضافه میکند. هنگام ساخت فایل اجرایی وابسته به موقعیت و خروجی با قابلیت بازنشانی، نادیده گرفته میشود. nopack-relative-relocs حالت پیشفرض است که بازنشانی نسبی فشرده را غیرفعال میکند. هنگام پیوند در برابر کتابخانه C گنو (GNU C Library)، یک وابستگی نسخه نماد GLIBC_ABI_DT_RELR به کتابخانه اشتراکی C به خروجی افزوده میشود. برای i386 و x86-64 پشتیبانی میشود.
- relro
- norelro
-
یک سرآیند سگمنت "PT_GNU_RELRO" از نوع ELF در شیء ایجاد میکند. این گزینه سگمنتی از حافظه را مشخص میکند که در صورت پشتیبانی، پس از بازنشانی باید فقطخواندنی شود. مشخص کردن common-page-size با اندازهای کوچکتر از اندازه صفحه سیستم، این حفاظت را بیاثر میکند. اگر از norelro استفاده شود، سگمنت "PT_GNU_RELRO" در ELF ایجاد نمیشود.
- report-relative-reloc
-
بازنشانیهای نسبی پویای تولیدشده توسط پیونددهنده را گزارش میدهد. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- sectionheader
- nosectionheader
-
سرآیند بخش را تولید میکند. در صورت استفاده از nosectionheader، سرآیند بخش تولید نمیشود. sectionheader حالت پیشفرض است..IP separate-code 4
- 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
-
تعیین اندازه پشته برای سگمنت ELF "PT_GNU_STACK". تعیین مقدار صفر، ایجاد پیشفرض هرگونه سگمنت "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 این رفتار را غیرفعال میکند و به بخشها اجازه میدهد بهگونهای پاکسازی (garbage collect) شوند که گویی این نمادهای خاص ایجاد نشدهاند. گزینهٔ -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" را تعریف کرده باشد، پیونددهنده این وابستگی را اضافه خواهد کرد. در 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 باشند. آرشیوهای مشخصشده بهطور مکرر جستجو میشوند تا زمانی که هیچ ارجاع تعریفنشدهٔ جدیدی ایجاد نشود. بهطور معمول، یک آرشیو تنها یک بار و به ترتیبی که در خط فرمان مشخص شده است جستجو میشود. اگر نمادی در آن آرشیو برای حل ارجاع به یک نماد تعریفنشده که توسط شیئی در آرشیوی که بعداً در خط فرمان ظاهر شده ارجاع داده شده نیاز باشد، پیونددهنده قادر به حل آن ارجاع نخواهد بود. با گروهبندی آرشیوها، همهٔ آنها بهطور مکرر جستجو میشوند تا تمام ارجاعات ممکن برطرف شوند. استفاده از این گزینه هزینهٔ کارایی قابل توجهی دارد. بهتر است تنها زمانی استفاده شود که ارجاعات حلقوی اجتنابناپذیری میان دو یا چند آرشیو وجود داشته باشد.
- --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 مراجعه کنید..IP --add-needed 4
- --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 node) بدون دامنه و نام گره است. برای اطلاعات بیشتر VERSION را ببینید.
- --dynamic-list-data
-
تمام نمادهای دادهای سراسری را در فهرست پویا قرار میدهد.
- --dynamic-list-cpp-new
-
فهرست پویای توکار را برای عملگرهای new و delete در C++ ارائه میدهد. این گزینه عمدتاً برای ساخت libstdc++ مشترک مفید است.
- --dynamic-list-cpp-typeinfo
-
فهرست پویای توکار را برای شناسایی نوع زمان اجرا (RTTI) در 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
-
یک جدول ارجاع متقابل (cross reference) در خروجی تولید میکند. اگر فایل نقشهنگاشت پیونددهنده در حال تولید باشد، جدول ارجاع متقابل در فایل نقشه چاپ میشود. در غیر این صورت، در خروجی استاندارد چاپ میشود. قالب جدول عمداً ساده است تا در صورت نیاز بهآسانی توسط یک اسکریپت پردازش شود. نمادها با مرتبسازی بر پایهٔ نام چاپ میشوند. برای هر نماد، فهرستی از نامهای فایل ارائه میشود. اگر نماد تعریف شده باشد، نخستین فایل فهرستشده مکان تعریف آن است. اگر نماد بهصورت یک مقدار عام (common) تعریف شده باشد، هر فایلی که این اتفاق در آن افتاده باشد در ادامه میآید. در پایان، تمامی فایلهایی که به آن نماد ارجاع دادهاند فهرست میشوند.
- --ctf-variables
- --no-ctf-variables
-
قالب اطلاعات اشکالزدایی CTF از بخشی پشتیبانی میکند که نامها و انواع متغیرهای موجود در برنامه را که در هیچ جدول نمادی ظاهر نمیشوند، کدگذاری میکند. این متغیرها آشکارا نمیتوانند توسط اشکالزداهای سنتی بر اساس نشانی جستجو شوند، بنابراین فضای مصرفشده برای انواع و نامهای آنها معمولاً هدر میرود: انواع معمولاً کوچک هستند اما نامها اغلب کوچک نیستند. --ctf-variables باعث تولید چنین بخشی میشود. رفتار پیشفرض را میتوان با --no-ctf-variables بازگرداند.
- --ctf-share-types=method
-
روشی که برای بهاشتراکگذاری انواع میان واحدهای ترجمه در CTF استفاده میشود را تنظیم میکند.
-
تمام انواعی را که تعاریف مبهم ندارند در فرهنگلغت مشترک قرار میدهد؛ جایی که اشکالزداها میتوانند بهراحتی به آنها دسترسی داشته باشند، حتی اگر فقط در یک واحد ترجمه ظاهر شده باشند. این حالت پیشفرض است.
-
تنها انواعی را که در چندین واحد ترجمه ظاهر میشوند در فرهنگلغت مشترک قرار میدهد: انواع با تنها یک تعریف به فرهنگلغتهای اختصاصیِ هر واحد ترجمه میروند. انواع با تعاریف مبهم در چندین واحد ترجمه همیشه به فرهنگلغتهای اختصاصیِ هر واحد ترجمه منتقل میشوند. این کار معمولاً اندازهٔ CTF را بزرگتر میکند، اما ممکن است حجم CTF را در فرهنگلغت مشترک کاهش دهد. برای پروژههای بسیار بزرگ، این کار ممکن است باز کردن CTF را سرعت ببخشد و در مصرف حافظهٔ مصرفکنندهٔ CTF در زمان اجرا صرفهجویی کند.
- --no-define-common
-
این گزینه مانع از تخصیص نشانیها به نمادهای عام میشود. دستور اسکریپت "INHIBIT_COMMON_ALLOCATION" اثر یکسانی دارد. گزینهٔ --no-define-common امکان تفکیک تصمیمگیری برای تخصیص نشانی به نمادهای عام از انتخاب نوع فایل خروجی را فراهم میسازد؛ در غیر این صورت یک نوع خروجی غیرقابل جابهجایی، تخصیص نشانی به نمادهای عام را اجباری میکند. استفاده از --no-define-common اجازه میدهد نمادهای عامی که از یک کتابخانهٔ مشترک به آنها ارجاع داده شده است، تنها در برنامهٔ اصلی نشانیدهی شوند. این کار فضای تکراریِ استفادهنشده در کتابخانهٔ مشترک را حذف میکند و همچنین از هرگونه سردرگمی احتمالی دربارهٔ حل نماد به نسخهٔ تکراریِ نادرست در هنگام وجود ماژولهای پویای متعدد با مسیرهای جستجوی اختصاصی برای حل نماد در زمان اجرا، جلوگیری مینماید. - --force-group-allocation
-
این گزینه باعث میشود که پیونددهنده اعضای گروهِ بخش را مانند بخشهای ورودی عادی جایگذاری کرده و گروههای بخش را حذف کند. این رفتار پیشفرض برای پیوند نهایی است، اما میتوان از این گزینه برای تغییر رفتار یک پیوند با قابلیت جابهجایی (-r) استفاده کرد. دستور اسکریپت "FORCE_GROUP_ALLOCATION" اثر مشابهی دارد..IP --defsym=symbol=expression 4 یک نماد سراسری در فایل خروجی ایجاد میکند که حاوی آدرس مطلق ارائهشده توسط expression است. میتوانید از این گزینه به تعداد دفعات مورد نیاز برای تعریف چند نماد در خط فرمان استفاده کنید. فرم محدودی از محاسبات ریاضی برای expression در این زمینه پشتیبانی میشود: میتوانید یک مقدار ثابت هگزادسیمال یا نام یک نماد موجود را تعیین کنید، یا از "+" و "-" برای جمع یا تفریق مقادیر ثابت هگزادسیمال یا نمادها استفاده نمایید. اگر به عبارتهای پیچیدهتری نیاز دارید، استفاده از زبان دستور پیونددهنده در قالب یک اسکریپت را در نظر بگیرید. نکته: نباید هیچ فاصلهای بین symbol، علامت مساوی ("=") و expression وجود داشته باشد. پیونددهنده آرگومانهای --defsym و -T را به ترتیب پردازش میکند؛ قرار دادن --defsym قبل از -T نماد را پیش از پردازش اسکریپت پیونددهنده ارائهشده با -T تعریف خواهد کرد، در حالی که قرار دادن --defsym پس از -T نماد را پس از پردازش اسکریپت پیونددهنده تعریف خواهد نمود. این تفاوت برای عبارتهای درون اسکریپت پیونددهنده که از نمادهای --defsym استفاده میکنند پیامدهایی به همراه دارد؛ اینکه کدام ترتیب صحیح است بستگی به هدف مورد نظر شما خواهد داشت.
- --demangle[=style]
- --no-demangle
-
این گزینهها بازگردانی نام نمادها (demangle) را در پیامهای خطا و سایر خروجیها کنترل میکنند. هنگامی که به پیونددهنده دستور demangle داده میشود، تلاش میکند نام نمادها را به شیوهای خوانا نمایش دهد: زیرخطهای ابتدایی را در صورتی که توسط قالب فایل شیء استفاده شده باشند حذف میکند، و نامهای درهمریخته (mangled) نمادهای ++C را به نامهای خوانا برای کاربر تبدیل میکند. کامپایلرهای مختلف سبکهای درهمریزی گوناگونی دارند. آرگومان اختیاری سبک demangle میتواند برای انتخاب سبک مناسب با کامپایلر شما استفاده شود. پیونددهنده بهطور پیشفرض نمادها را demangle میکند مگر اینکه متغیر محیطی COLLECT_NO_DEMANGLE تنظیم شده باشد. این گزینهها را میتوان برای لغو رفتار پیشفرض استفاده کرد.
- -Ifile
- --dynamic-linker=file
-
نام پیونددهنده پویا را تعیین میکند. این گزینه تنها هنگام تولید فایلهای اجرایی ELF با پیوند پویا معنادار است. پیونددهنده پویای پیشفرض معمولاً مناسب است؛ از این گزینه استفاده نکنید مگر اینکه بدانید در حال انجام چه کاری هستید.
- --no-dynamic-linker
-
هنگام تولید یک فایل اجرایی، درخواست استفاده از پیونددهنده پویا در زمان بارگذاری را حذف میکند. این گزینه تنها برای فایلهای اجرایی ELF که شامل بازنشانیهای پویا هستند معنادار است و معمولاً به کد نقطه ورود (entry point) نیاز دارد که قادر به پردازش این بازنشانیها باشد.
- --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
-
جمعآوری و حذف بخشهای ورودی استفادهنشده (garbage collection) را فعال میکند. این گزینه در مقصدهایی که از آن پشتیبانی نمیکنند نادیده گرفته میشود. رفتار پیشفرض (عدم انجام این جمعآوری) را میتوان با تعیین --no-gc-sections در خط فرمان بازگرداند. توجه داشته باشید که جمعآوری بخشهای استفادهنشده برای مقصدهای با قالب COFF و PE پشتیبانی میشود، اما پیادهسازی آن در حال حاضر آزمایشی در نظر گرفته میشود. گزینه --gc-sections با بررسی نمادها و بازنشانیها تعیین میکند کدام بخشهای ورودی استفاده شدهاند. بخشی که حاوی نماد ورود (entry symbol) است و تمام بخشهای حاوی نمادهای تعریفنشده در خط فرمان نگهداشته خواهند شد؛ همچنین بخشهای حاوی نمادهایی که توسط اشیاء پویا ارجاع داده شدهاند نیز حفظ میشوند. توجه داشته باشید که هنگام ساخت کتابخانههای اشتراکی، پیونددهنده باید فرض کند هر نماد قابل مشاهدهای ارجاع داده شده است. پس از تعیین این مجموعه اولیه از بخشها، پیونددهنده بهطور بازگشتی هر بخشی را که توسط بازنشانیهای آنها ارجاع داده شده باشد بهعنوان استفادهشده نشانهگذاری میکند. گزینههای --entry، --undefined و --gc-keep-exported را ببینید. این گزینه میتواند در زمان انجام پیوند جزئی (که با گزینه -r فعال میشود) نیز تنظیم گردد. در این حالت، ریشه نمادهای نگهداشتهشده باید صراحتاً یا توسط یکی از گزینههای --entry، --undefined یا --gc-keep-exported، یا توسط دستور "ENTRY" در اسکریپت پیونددهنده مشخص شود. به عنوان یک افزونه گنو (GNU extension)، بخشهای ورودی 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
- خلاصهای از تمام گزینههای ویژه مقصد را در خروجی استاندارد چاپ کرده و خارج میشود.
- -Map=mapfile
- یک نگاشت
پیوند (link map) را
در فایل 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]
مشخص کردن بیش از یک نویسه "%" خطا محسوب میشود.
اگر فایل نگاشت از قبل وجود داشته باشد، با این عملیات بازنویسی خواهد شد..IP --no-keep-memory 4 ld معمولاً با کش کردن جدول نمادهای پروندههای ورودی در حافظه، سرعت را به جای مصرف حافظه بهینهسازی میکند. این گزینه به ld میگوید که به جای آن با بازخوانی جدولهای نماد در صورت نیاز، مصرف حافظه را بهینهسازی کند. این کار ممکن است در صورتی که ld حین پیوند دادن یک پروندهٔ اجرایی بزرگ با کمبود فضا در حافظه مواجه شود، لازم باشد.
- --no-undefined
- -z defs
- ارجاعات
حلنشدهٔ
نمادها را
از
پروندههای
شیء عادی
گزارش
میدهد. این
کار حتی اگر
پیونددهنده
در حال
ایجاد یک
کتابخانهٔ
اشتراکی
غیرنمادین
باشد نیز
انجام
میشود.
سوئیچ
--[no-]allow-shlib-undefined
رفتار
گزارش
ارجاعات
حلنشدهٔ
یافتشده
در
کتابخانههای
اشتراکی
پیوند
خورده را
کنترل
میکند.
اثرات این گزینه را میتوان با استفاده از "-z undefs" بازگرداند.
- --allow-multiple-definition
- -z muldefs
- به طور معمول هنگامی که یک نماد چندین بار تعریف شود، پیونددهنده یک خطای مهلک گزارش میکند. این گزینهها اجازهٔ تعریفهای چندگانه را میدهند و اولین تعریف استفاده خواهد شد.
- --allow-shlib-undefined
- --no-allow-shlib-undefined
- نمادهای
تعریفنشده
در
کتابخانههای
اشتراکی را
مجاز یا
غیرمجاز
میکند. این
سوئیچ
مشابه --no-undefined
است، با این
تفاوت که
رفتار را
هنگامی که
نمادهای
تعریفنشده
به جای یک
پروندهٔ
شیء عادی در
یک
کتابخانهٔ
اشتراکی
هستند،
تعیین
میکند. این
گزینه بر
نحوهٔ
رسیدگی به
نمادهای
تعریفنشده
در
پروندههای
شیء عادی
تأثیری
ندارد.
رفتار پیشفرض این است که اگر پیونددهنده برای ایجاد یک پروندهٔ اجرایی استفاده میشود، برای هر نماد تعریفنشدهٔ ارجاع دادهشده در کتابخانههای اشتراکی خطا گزارش کند، اما اگر پیونددهنده برای ایجاد یک کتابخانهٔ اشتراکی استفاده میشود، آنها را مجاز بداند.
دلایل مجاز دانستن ارجاعات نمادهای تعریفنشده در کتابخانههای اشتراکی مشخصشده در زمان پیوند عبارتند از:
- کتابخانهٔ اشتراکی مشخصشده در زمان پیوند ممکن است با کتابخانهای که در زمان بارگذاری موجود است یکسان نباشد، بنابراین نماد ممکن است در زمان بارگذاری عملاً قابل حل باشد.
- برخی از
سیستمهای
عامل،
مانند BeOS و HPPA
وجود دارند
که نمادهای
تعریفنشده
در
کتابخانههای
اشتراکی در
آنها عادی
است.
برای نمونه، هستهٔ BeOS کتابخانههای اشتراکی را در زمان بارگذاری وصله (patch) میکند تا هر تابعی را که برای معماری فعلی مناسبتر است انتخاب کند. این کار، برای مثال، برای انتخاب پویای یک تابع memset مناسب به کار میرود.
- --error-handling-script=scriptname
- اگر این
گزینه
فراهم شود،
پیونددهنده
هر زمان که
با خطایی
مواجه شود،
scriptname را
فراخوانی
میکند. با
این حال در
حال حاضر
تنها از دو
نوع خطا
پشتیبانی
میشود:
نمادهای
مفقود و
کتابخانههای
مفقود. دو
آرگومان به
اسکریپت
ارسال
خواهد شد:
کلیدواژهٔ
“undefined-symbol” یا
“missing-lib” و name
نماد
تعریفنشده
یا
کتابخانهٔ
مفقود. هدف
این است که
اسکریپت
پیشنهادهایی
را در مورد
جایی که
نماد یا
کتابخانه
ممکن است در
آن پیدا شود
به کاربر
ارائه دهد.
پس از پایان
کار
اسکریپت،
پیام خطای
عادی
پیونددهنده
نمایش داده
خواهد شد.
در دسترس بودن این گزینه توسط یک سوئیچ در زمان پیکربندی کنترل میشود، بنابراین ممکن است در برخی پیادهسازیهای خاص وجود نداشته باشد.
- --no-undefined-version
- به طور معمول هنگامی که یک نماد دارای نسخهٔ تعریفنشده باشد، پیونددهنده آن را نادیده میگیرد. این گزینه نمادهایی با نسخهٔ تعریفنشده را غیرمجاز میکند و به جای آن یک خطای مهلک صادر خواهد شد.
- --default-symver
- ایجاد و استفاده از یک نسخهٔ نماد پیشفرض (همان soname) برای نمادهای صادرشدهٔ بدون نسخه.
- --default-imported-symver
- ایجاد و استفاده از یک نسخهٔ نماد پیشفرض (همان soname) برای نمادهای واردشدهٔ بدون نسخه.
- --no-warn-mismatch
- به طور معمول اگر سعی کنید پروندههای ورودی را که به دلایلی مانند کامپایل شدن برای پردازندههای مختلف یا اندیانهای متفاوت با یکدیگر ناهمخوان هستند پیوند دهید، ld یک خطا صادر خواهد کرد. این گزینه به ld میگوید که باید بیصدا چنین خطاهای احتمالی را مجاز بداند. از این گزینه باید تنها با احتیاط و در مواردی استفاده شود که اقدام ویژهای انجام دادهاید که تضمین میکند خطاهای پیونددهنده نابجا هستند.
- --no-warn-search-mismatch
- به طور معمول اگر ld در طول جستجوی کتابخانه، یک کتابخانهٔ ناسازگار بیابد، یک هشدار صادر میکند. این گزینه هشدار را بیصدا میکند.
- --no-whole-archive
- اثر گزینهٔ --whole-archive را برای پروندههای آرشیو بعدی غیرفعال میکند.
- --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ها) را فراهم میآورد. این گزینه تنها برای پورتهای هدفگذاریشده برای i386 PE و ELF پیونددهنده در دسترس است.
- -pie
- --pic-executable
- یک پروندهٔ اجرایی مستقل از موقعیت ایجاد میکند. در حال حاضر این ویژگی تنها روی بسترهای ELF پشتیبانی میشود. پروندههای اجرایی مستقل از موقعیت توسط پیونددهندهٔ پویا به آدرس مجازی که سیستمعامل برای آنها انتخاب میکند بازنشانی میشوند، که میتواند بین هر فراخوانی متفاوت باشد. آنها در سرآیند پروندهٔ ELF با ET_DYN علامتگذاری میشوند، اما از چندین جهت با کتابخانههای اشتراکی تفاوت دارند. به ویژه، نمادهای تعریفشده در یک PIE به طور پیشفرض نمیتوانند توسط شیء دیگری جایگزین شوند، آنگونه که در یک کتابخانهٔ اشتراکی ممکن است.
- -no-pie
- یک پروندهٔ اجرایی وابسته به موقعیت ایجاد میکند. این حالت پیشفرض است.
- -qmagic
- این گزینه به منظور سازگاری با Linux نادیده گرفته میشود.
- -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 تقدم دارد..IP -rpath=dir 4 افزودن یک دایرکتوری به مسیر جستجوی کتابخانهها در زمان اجرا (runtime). این گزینه هنگام پیوند دادن یک فایل اجرایی ELF با اشیاء مشترک (shared objects) استفاده میشود. تمام آرگومانهای -rpath به یکدیگر متصل شده و به پیونددهنده زمان اجرا (runtime linker) ارسال میشوند که از آنها برای مکانیابی اشیاء مشترک در زمان اجرا استفاده میکند.
گزینه -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" یک
کتابخانه
مشترک را به
عنوان یکی
از
فایلهای
ورودی در بر
داشته باشد.
هنگامی که پیونددهنده در حین انجام یک پیوند غیرمشترک (non-shared) و غیرقابلانتقال (non-relocatable) با چنین وابستگیای مواجه میشود، در صورت عدم گنجاندن صریح آن، بهطور خودکار تلاش میکند تا کتابخانه مشترک مورد نیاز را مکانیابی کرده و در پیوند بگنجاند. در چنین حالتی، چندین دایرکتوری به شرح زیر جستجو میشوند. گزینه -rpath-link نخستین مجموعه از دایرکتوریها را برای جستجو تعیین میکند. این گزینه میتواند با ارائه فهرستی از نامها که با دونقطه جدا شدهاند، یا با تکرار چندینباره در خط فرمان، دنبالهای از نامهای دایرکتوری را مشخص کند.
نشانههای $ORIGIN و $LIB میتوانند در این دایرکتوریهای جستجو ظاهر شوند. آنها در مورد $ORIGIN با مسیر کامل دایرکتوری حاوی برنامه یا شیء مشترک، و در مورد $LIB با lib - برای باینریهای ۳۲ بیتی - یا lib64 - برای باینریهای ۶۴ بیتی - جایگزین خواهند شد.
شکل جایگزین این نشانهها - ${ORIGIN} و ${LIB} نیز میتواند استفاده شود. نشانه $PLATFORM پشتیبانی نمیشود.
گزینه --rpath-link باید با احتیاط استفاده شود چرا که مسیر جستجویی را که ممکن است بهصورت ثابت در یک کتابخانه مشترک کامپایل شده باشد بازنویسی (override) میکند. در چنین حالتی ممکن است ناخواسته از مسیر جستجوی متفاوتی نسبت به آنچه پیونددهنده زمان اجرا استفاده میکرد، استفاده شود.
هنگامی که کتابخانههای مشترک بیشتری مورد نیاز باشند، پیونددهنده برای یافتن آنها دایرکتوریها را به ترتیبی که در زیر آمده است جستجو میکند. با این حال توجه داشته باشید که این موضوع تنها در مورد کتابخانههای اضافیِ لازم برای برآورده کردن نیاز کتابخانههای مشترکِ از پیش گنجاندهشده اعمال میشود. این مورد شامل کتابخانههایی که از طریق گزینه خط فرمان -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) بخشها در اسکریپت پیونددهنده اعمال میکند..IP --spare-dynamic-tags=count 4 این گزینه تعداد خانههای خالی برای باقی گذاشتن در بخش .dynamic از اشیاء مشترک (shared objects) ELF را مشخص میکند. ممکن است ابزارهای پسپردازش مانند prelinker به خانههای خالی نیاز داشته باشند. مقدار پیشفرض ۵ است.
- --split-by-file[=size]
- مشابه --split-by-reloc است اما با رسیدن به size، برای هر فایل ورودی یک بخش خروجی جدید ایجاد میکند. اگر size داده نشود، مقدار پیشفرض آن اندازهٔ ۱ است.
- --split-by-reloc[=count]
- تلاش میکند تا بخشهای اضافی در فایل خروجی ایجاد کند تا هیچ بخش خروجی مجزایی در فایل بیش از count بازآرایی (relocation) نداشته باشد. این گزینه هنگام تولید فایلهای بازآراستنی بزرگ برای بارگذاری در هستههای بیدرنگ خاص با قالب فایل شیء COFF مفید است؛ چرا که COFF نمیتواند بیش از ۶۵۵۳۵ بازآرایی را در یک بخش نمایش دهد. توجه داشته باشید که این گزینه با قالبهای فایل شیئی که از بخشهای دلخواه پشتیبانی نمیکنند کار نخواهد کرد. پیونددهنده بخشهای ورودی تکی را برای توزیع مجدد تقسیم نمیکند، بنابراین اگر یک بخش ورودی تکی شامل بیش از count بازآرایی باشد، یک بخش خروجی شامل همان تعداد بازآرایی خواهد بود. مقدار پیشفرض count برابر ۳۲۷۶۸ است.
- --stats[=filename]
- محاسبه و
نمایش آمار
درباره
عملکرد
پیونددهنده،
مانند زمان
اجرا و
میزان مصرف
حافظه.
اگر آرگومان اختیاری filename ارائه نشود، تنها اطلاعات پایه گزارش شده و به جریان خروجی خطای استاندارد ارسال میشود. اگر آرگومان filename ارائه شود، اطلاعات گسترشیافته در فایل نامبرده نوشته میشود. اگر filename فقط به نماد - تنظیم شود، اطلاعات گسترشیافته به جریان خروجی استاندارد ارسال خواهد شد. اگر filename با + آغاز شود، فایل به جای حالت رونویسی (overwrite)، در حالت الحاق (append) باز میشود.
اگر گزینهٔ -Map فعال شده باشد، این اطلاعات در فایل نگاشت (map file) نیز ثبت میشود. توجه: اگر به هر دو گزینهٔ --stats و -Map آرگومانهای filename داده شده باشد و نامها یکسان باشند، اطلاعات تنها یک بار نوشته خواهد شد نه دو بار.
اگر متغیر محیطی "LD_STATS" تعریف شده باشد، رفتاری مشابه گزینهٔ --stats خواهد داشت. اگر مقدار متغیر یک رشته باشد، از آن به عنوان نام فایلی که اطلاعات باید در آن ثبت شود استفاده میشود. در غیر این صورت اطلاعات به جریان خروجی استاندارد ارسال خواهد شد. استفاده از این متغیر محیطی اجازه میدهد که آمار بدون نیاز به تغییر خط فرمان پیونددهنده ثبت شود. توجه: اگر هم از متغیر محیطی و هم از گزینهٔ --stats استفاده شود، گزینهٔ --stats اولویت خواهد داشت.
اطلاعات گسترشیافتهٔ گزارششده شامل زمان مصرفی CPU است و در صورتی که فراخوانی کتابخانه سیستم getrusage() در دسترس باشد، مصرف حافظه نیز ثبت میشود. این اطلاعات برای بخشهای مختلف فرایند پیونددهی که به عنوان فازها (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 memory user time system time Stats: name (microsec) (KiB) (seconds) (seconds) Stats: ALL 390082 217740 0 0 Stats: ctf processing 12 0 0 0 Stats: string merge 1324 0 0 0 Stats: parsing 349 288 0 0 Stats: plugins 1 0 0 0 Stats: processing files 259616 214524 0 0 Stats: write 116493 0 0 0
- --no-stats
- گزارش آمارهای استفاده را در صورتی که از طریق گزینهٔ خط فرمان --stats یا متغیر محیطی LD_STATS فعال شده باشد، غیرفعال میکند.
- --sysroot=directory
- استفاده از directory به عنوان مکان sysroot، که پیشفرض زمان پیکربندی را بازنویسی میکند. این گزینه فقط توسط پیونددهندههایی پشتیبانی میشود که با استفاده از --with-sysroot پیکربندی شده باشند.
- --task-link
- این گزینه توسط مقصدهای مبتنی بر COFF/PE برای ایجاد یک فایل شیء پیوندِ وظیفه (task-linked) استفاده میشود که در آن تمام نمادهای سراسری به نمادهای ایستا (static) تبدیل شدهاند.
- --traditional-format
- برای برخی
از مقصدها،
خروجی ld از
جهاتی با
خروجی
پیونددهندههای
موجود
متفاوت است.
این سوییچ
از ld
میخواهد
که در عوض
از قالب
سنتی
استفاده
کند.
به عنوان مثال، در SunOS، دستور ld ورودیهای تکراری را در جدول رشتههای نماد ادغام میکند. این کار میتواند حجم فایل خروجی دارای اطلاعات اشکالزدایی کامل را تا بیش از ۳۰ درصد کاهش دهد. متأسفانه، برنامهٔ "dbx" در SunOS نمیتواند برنامهٔ حاصل را بخواند (در حالی که "gdb" مشکلی با آن ندارد). سوییچ --traditional-format به ld اعلام میکند که ورودیهای تکراری را ادغام نکند.
- --section-start=sectionname=org
- قرار دادن یک بخش در فایل خروجی در آدرس مطلق مشخصشده توسط org. میتوانید به تعداد دفعات مورد نیاز برای تعیین مکان چندین بخش در خط فرمان از این گزینه استفاده کنید. org باید یک عدد صحیح هگزادسیمال منفرد باشد؛ برای سازگاری با سایر پیونددهندهها، میتوانید پیشوند 0x را که معمولاً با مقادیر هگزادسیمال همراه است حذف کنید. توجه: نباید هیچ فاصله یا نویسهٔ خالی بین 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 بزرگتر از ۱ باشد (NUMBER > 1)، وضعیت نمادهای افزونه نیز نمایش داده خواهد شد..IP --version-script=version-scriptfile 4 نام یک اسکریپت نسخه را برای پیونددهنده مشخص میکند. این گزینه معمولاً هنگام ساخت کتابخانههای اشتراکی جهت تعیین اطلاعات تکمیلی درباره سلسلهمراتب نسخه برای کتابخانه در حال ایجاد استفاده میشود. این گزینه تنها در بسترهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند، بهطور کامل پشتیبانی میشود؛ به VERSION مراجعه کنید. این قابلیت در بسترهای PE بهطور جزئی پشتیبانی میشود که میتوانند از اسکریپتهای نسخه برای پالایش پدیداری نمادها در حالت auto-export استفاده کنند: هر نمادی که در اسکریپت نسخه با علامت local مشخص شده باشد، صادر نخواهد شد.
- --warn-common
- هنگامی که
یک نماد
مشترک با
نماد مشترک
دیگری یا با
تعریف یک
نماد ترکیب
شود، هشدار
میدهد.
پیونددهندههای
Unix این شیوه
تا حدی
سهلانگارانه
را مجاز
میدانند،
اما
پیونددهندهها
در برخی
سیستمعاملهای
دیگر چنین
اجازهای
نمیدهند.
این گزینه
به شما
اجازه
میدهد
مشکلات
بالقوه
ناشی از
ترکیب
نمادهای
سراسری را
بیابید.
متأسفانه
برخی
کتابخانههای
C از این
شیوه
استفاده
میکنند،
بنابراین
ممکن است
هشدارهایی
درباره
نمادهای
درون
کتابخانهها
و همچنین
برنامههای
خود دریافت
کنید.
سه نوع نماد سراسری وجود دارد که در اینجا با مثالهای C نشان داده شدهاند:
- int i = 1;
- یک تعریف، که در بخش دادههای مقداردهیشده فایل خروجی قرار میگیرد.
- extern int i;
- یک ارجاع تعریفنشده، که فضایی تخصیص نمیدهد. باید در جایی تعریفی یا نمادی مشترک برای این متغیر وجود داشته باشد.
- int i;
- یک نماد مشترک. اگر برای یک متغیر فقط (یک یا چند) نماد مشترک وجود داشته باشد، به ناحیه دادههای مقداردهینشده فایل خروجی میرود. پیونددهنده چندین نماد مشترک برای یک متغیر را در قالب یک نماد واحد ادغام میکند. اگر آنها اندازههای متفاوتی داشته باشند، بزرگترین اندازه را انتخاب میکند. در صورتی که تعریفی برای همان متغیر وجود داشته باشد، پیونددهنده نماد مشترک را به یک اعلان تبدیل میکند.
گزینه --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
- اگر از هرگونه سازنده سراسری استفاده شود، هشدار میدهد. این گزینه فقط برای تعداد معدودی از قالبهای فایل شیء مفید است. برای قالبهایی مانند COFF یا ELF، پیونددهنده قادر به تشخیص استفاده از سازندههای سراسری نیست.
- --warn-execstack
- --warn-execstack-objects
- --no-warn-execstack
- در بسترهای ELF، چنانچه از پیونددهنده خواسته شود فایل خروجی حاوی پشته قابل اجرا ایجاد کند، ممکن است پیامهای هشدار تولید کند. سه حالت ممکن وجود دارد:
- 1.
- هیچ هشداری تولید نشود.
- 2.
- همیشه هشدار تولید شود، حتی اگر پشته قابل اجرا از طریق گزینه خط فرمان -z execstack درخواست شده باشد.
- 3.
- تنها زمانی هشدار تولید شود که یک فایل شیء درخواست پشته قابل اجرا دهد، اما نه در صورتی که گزینه -z execstack استفاده شده باشد.
حالت پیشفرض به نحوه پیکربندی پیونددهنده در هنگام ساخت آن بستگی دارد. گزینه --no-warn-execstack همواره پیونددهنده را در حالت بدون هشدار قرار میدهد. گزینه --warn-execstack پیونددهنده را در حالت همیشه هشدار قرار میدهد. گزینه --warn-execstack-objects پیونددهنده را در حالت هشدار فقط برای فایلهای شیء قرار میدهد.
نکته: فایلهای ورودی با قالب ELF میتوانند با داشتن بخش .note.GNU-stack به همراه بیت قابل اجرا تنظیمشده در پرچمهای بخش خود، مشخص کنند که به یک پشته قابل اجرا نیاز دارند. آنها میتوانند با داشتن همان بخش، اما بدون تنظیم بودن بیت پرچم قابل اجرا، مشخص کنند که نیازی به پشته قابل اجرا ندارند. اگر یک فایل ورودی دارای بخش .note.GNU-stack نباشد، رفتار پیشفرض وابسته به معماری هدف است. برای برخی اهداف، نبود چنین بخشی به این معنی است که پشته قابل اجرا واقعاً مورد نیاز است. این موضوع اغلب برای فایلهای اسمبلی دستنویس مشکلآفرین است.
- --error-execstack
- --no-error-execstack
- اگر
پیونددهنده
بنا به
تولید پیام
هشداری در
مورد پشته
قابل اجرا
داشته
باشد،
گزینه --error-execstack
آن هشدار را
به یک خطا
تبدیل
میکند.
توجه - این
گزینه حالت
تولید
هشدار execstack
پیونددهنده
را تغییر
نمیدهد.
برای تنظیم
یک حالت
هشدار مشخص
از --warn-execstack یا
--warn-execstack-objects
استفاده
کنید.
گزینه --no-error-execstack رفتار پیشفرض در تولید پیامهای هشدار را بازیابی میکند.
- --warn-multiple-gp
- در صورتی که چندین مقدار اشارهگر سراسری در فایل خروجی مورد نیاز باشد، هشدار میدهد. این گزینه فقط برای پردازندههای خاصی مانند Alpha معنادار است. به طور مشخص، برخی پردازندهها مقادیر ثابت بزرگ را در یک بخش ویژه قرار میدهند. یک ثبات خاص (اشارهگر سراسری) به میانه این بخش اشاره میکند تا ثابتها بتوانند به شکلی کارآمد از طریق حالت آدرسدهی نسبی با ثباتپایه بارگذاری شوند. از آنجا که آفست در حالت آدرسدهی نسبی با ثباتپایه ثابت و نسبتاً کوچک است (برای نمونه ۱۶ بیت)، این امر حداکثر اندازه استخر مقادیر ثابت را محدود میسازد. بنابراین، در برنامههای بزرگ، اغلب لازم است از چندین مقدار اشارهگر سراسری استفاده شود تا بتوان همه ثابتهای ممکن را آدرسدهی کرد. این گزینه باعث میشود هر زمان چنین حالتی رخ دهد، یک هشدار صادر شود.
- --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 فعال میشوند..IP --warn-section-align 4 هشدار دادن در صورتی که آدرس یک بخش خروجی به دلیل ترازسازی تغییر کند. بهطور معمول، ترازسازی توسط یک بخش ورودی تعیین میشود. آدرس تنها در صورتی تغییر خواهد کرد که بهطور صریح مشخص نشده باشد؛ یعنی اگر دستور "SECTIONS" آدرس شروعی برای این بخش تعیین نکرده باشد.
- --warn-textrel
- هشدار دادن در صورتی که پیونددهنده DT_TEXTREL را به یک فایل اجرایی مستقل از موقعیت یا شیء اشتراکی اضافه کند.
- --warn-alternate-em
- هشدار دادن در صورتی که یک شیء دارای کد ماشین ELF جایگزین باشد.
- --warn-unresolved-symbols
- اگر پیونددهنده بخواهد یک نماد حلنشده را گزارش کند (گزینهٔ --unresolved-symbols را ببینید)، بهطور عادی یک خطا تولید میکند. این گزینه باعث میشود که به جای آن یک هشدار تولید کند.
- --error-unresolved-symbols
- این گزینه رفتار پیشفرض پیونددهنده در ایجاد خطا هنگام گزارش نمادهای حلنشده را بازمیگرداند.
- --whole-archive
- برای هر
آرشیوی که
در خط فرمان
پس از
گزینهٔ --whole-archive
ذکر شود، به
جای جستجو
در آرشیو
برای
فایلهای
شیء مورد
نیاز، تمام
فایلهای
شیء موجود
در آرشیو را
در پیوند
قرار
میدهد. این
گزینه
معمولاً
برای تبدیل
یک فایل
آرشیو به یک
کتابخانه
اشتراکی
استفاده
میشود و
گنجاندن هر
شیء را در
کتابخانه
اشتراکی
حاصل تحمیل
میکند. این
گزینه ممکن
است بیش از
یک بار
استفاده
شود.
دو نکته هنگام استفاده از این گزینه از طریق gcc: نخست اینکه gcc این گزینه را نمیشناسد، بنابراین باید از -Wl,-whole-archive استفاده کنید. دوم، فراموش نکنید که پس از فهرست آرشیوهای خود از -Wl,-no-whole-archive استفاده کنید، زیرا gcc فهرست آرشیوهای خودش را به پیوند شما اضافه خواهد کرد و ممکن است نخواهید این پرچم بر آنها نیز تأثیر بگذارد.
- --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" و سرآیند قطعهٔ ELF با عنوان "PT_GNU_EH_FRAME".
- --no-ld-generated-unwind-info
- درخواست ایجاد اطلاعات unwind مربوط به ".eh_frame" برای بخشهای کد تولیدشده توسط پیونددهنده مانند PLT. در صورت پشتیبانی از اطلاعات unwind تولیدشده توسط پیونددهنده، این گزینه بهطور پیشفرض فعال است. این گزینه همچنین تولید اطلاعات ردگیری پشته مربوط به ".sframe" را برای بخشهای کد تولیدشده توسط پیونددهنده مانند PLT کنترل میکند.
- --enable-new-dtags
- --disable-new-dtags
- این پیونددهنده میتواند تگهای پویای جدیدی را در ELF ایجاد کند. اما سیستمهای قدیمیتر ELF ممکن است آنها را درک نکنند. اگر --enable-new-dtags را مشخص کنید، تگهای پویای جدید در صورت نیاز ایجاد میشوند و تگهای پویای قدیمیتر حذف خواهند شد. اگر --disable-new-dtags را مشخص کنید، هیچ تگ پویای جدیدی ایجاد نخواهد شد. بهطور پیشفرض، تگهای پویای جدید ایجاد نمیشوند. توجه داشته باشید که این گزینهها تنها برای سیستمهای ELF در دسترس هستند.
- --hash-size=number
- تنظیم اندازهٔ پیشفرض جدولهای درهمسازی پیونددهنده روی یک عدد اول نزدیک به number. افزایش این مقدار میتواند مدتزمان لازم برای انجام وظایف پیونددهنده را کاهش دهد، اما به قیمت افزایش حافظهٔ مورد نیاز پیونددهنده. بهطور مشابه، کاهش این مقدار میتواند حافظهٔ مورد نیاز را به بهای کاهش سرعت کم کند.
- --hash-style=style
- تنظیم نوع جدول(های) درهمسازی پیونددهنده. style میتواند "sysv" برای بخش کلاسیک ".hash" در ELF، یا "gnu" برای بخش نوین گنو ".gnu.hash"، یا "both" برای هر دو جدول درهمسازی کلاسیک ELF ".hash" و نوین گنو ".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) که
حدود ۴۰٪
حافظهٔ
بیشتری
برای
ذخیرهٔ
نمادها
استفاده
میکند،
معرفی شد.
اثر دیگر این سوئیچ، تنظیم اندازهٔ پیشفرض جدول درهمسازی روی ۱۰۲۱ است که باز هم به قیمت طولانیتر شدن زمان اجرای پیونددهنده، در حافظه صرفهجویی میکند. با این حال، اگر از سوئیچ --hash-size استفاده شده باشد، این کار انجام نخواهد شد.
سوئیچ --reduce-memory-overheads همچنین ممکن است برای فعالسازی موازنههای دیگر در نسخههای آیندهٔ پیونددهنده به کار رود.
- --max-cache-size=size
- دستور ld بهطور معمول اطلاعات بازآرایی و جدولهای نمادِ فایلهای ورودی را با اندازهٔ نامحدود در حافظه نهانسازی میکند. این گزینه حداکثر اندازهٔ حافظهٔ نهان را روی size تنظیم میکند.
- --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" قبلی در خط فرمان را غیرفعال میکند..IP --package-metadata=JSON 4 درخواست ایجاد یک بخش یادداشت ELF با نام ".note.package". محتوای این یادداشت در قالب JSON و مطابق با مشخصات متاداده بسته (package metadata) است. برای اطلاعات بیشتر ببینید: https://systemd.io/ELF_PACKAGE_METADATA آرگومان JSON از percent-encoding و همچنین کدبندی %[string] (که در آن string به نام موجود در مراجع کاراکتر نامگذاریشده HTML اشاره دارد) پشتیبانی میکند: %[comma] برای ,، %[lbrace] برای {، %[quot] برای "، %[rbrace] برای }، و %[space] برای نویسه فاصله. اگر آرگومان JSON وجود نداشته باشد یا خالی باشد، در صورتی که ایجاد یادداشت متاداده با وقوع قبلی گزینه --package-metadata فعال شده باشد، غیرفعال خواهد شد. اگر پیونددهنده با libjansson ساخته شده باشد، رشته JSON اعتبارسنجی خواهد شد.
پیونددهنده i386 PE از گزینه -shared پشتیبانی میکند که باعث میشود خروجی به جای یک فایل اجرایی معمولی، یک کتابخانه پیوند پویا (DLL) باشد. هنگام استفاده از این گزینه، باید نام خروجی را به صورت "*.dll" تعیین کنید. علاوه بر این، پیونددهنده به طور کامل از فایلهای استاندارد "*.def" پشتیبانی میکند که میتوان آنها را مانند یک فایل شیء (object file) در خط فرمان پیونددهنده مشخص کرد (در واقع، باید قبل از آرشیوهایی قرار گیرد که نمادها را از آنها صادر میکند، تا اطمینان حاصل شود که مانند یک فایل شیء معمولی به فرآیند پیوند وارد میشوند).
علاوه بر گزینههای مشترک برای همه اهداف، پیونددهنده i386 PE از گزینههای خط فرمان دیگری نیز پشتیبانی میکند که مختص هدف i386 PE هستند. گزینههایی که مقدار میگیرند ممکن است با یک فاصله یا یک علامت مساوی از مقدار خود جدا شوند.
- --add-stdcall-alias
- در صورت تعیین، نمادهای دارای پسوند stdcall (بهصورت @nn) همانطور که هستند و همچنین با حذف پسوند، صادر خواهند شد. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --base-file file
- استفاده از file به عنوان نام فایلی که در آن آدرسهای پایه تمامی بازنشانیهای (relocations) لازم برای تولید DLLها با dlltool ذخیره شود. [این گزینه مختص i386 PE است]
- --dll
- ایجاد یک DLL به جای یک فایل اجرایی معمولی. همچنین میتوانید از -shared استفاده کنید یا یک "LIBRARY" را در یک فایل ".def" دادهشده مشخص نمایید. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --enable-long-section-names
- --disable-long-section-names
- گونههای PE از قالب شیء COFF افزونهای را اضافه میکنند که امکان استفاده از نامهای بخش طولانیتر از هشت نویسه (حد معمول در COFF) را فراهم میسازد. به طور پیشفرض، این نامها فقط در فایلهای شیء مجاز هستند، زیرا تصاویر اجرایی کاملاً پیوندخورده جدول رشتههای COFF مورد نیاز برای پشتیبانی از نامهای طولانیتر را همراه ندارند. به عنوان یک افزونه گنو (GNU)، با استفاده از این دو گزینه امکان مجاز کردن استفاده از آنها در تصاویر اجرایی، یا (احتمالاً بدون دلیل مفید!) غیرمجاز کردن آن در فایلهای شیء وجود دارد. تصاویر اجرایی تولیدشده با این نامهای بخش طولانی به دلیل داشتن جدول رشتهها، اندکی غیراستاندارد هستند و ممکن است هنگام بررسی با ابزارهای غیر گنو که با PE سازگارند، مانند نمایشگرها و تخلیهکنندههای فایل (dumpers)، خروجی گیجکنندهای ایجاد کنند. با این حال، GDB برای یافتن بخشهای اطلاعات اشکالزدایی Dwarf-2 در یک تصویر اجرایی در زمان اجرا، به استفاده از نامهای بخش طولانی PE متکی است؛ بنابراین اگر هیچیک از این دو گزینه در خط فرمان مشخص نشده باشد، زمانی که ld هنگام پیوند یک تصویر اجرایی و بدون زدودن نمادها، وجود اطلاعات اشکالزدایی را تشخیص دهد، با نادیده گرفتن رفتار پیشفرض و از نظر فنی صحیح، نامهای بخش طولانی را فعال خواهد کرد. [این گزینه برای همه درگاههای هدف PE در پیونددهنده معتبر است]
- --enable-stdcall-fixup
- --disable-stdcall-fixup
- اگر فرآیند پیوند با نمادی مواجه شود که قادر به حل آن نباشد، تلاش خواهد کرد با جستجوی نماد تعریفشده دیگری که تنها در قالب نام نماد (cdecl در برابر stdcall) تفاوت دارد، یک پیوند تقریبی (fuzzy linking) انجام دهد و آن نماد را با پیوند به مورد منطبق حل کند. به عنوان مثال، نماد تعریفنشده "_foo" ممکن است به تابع "_foo@12" پیوند بخورد، یا نماد تعریفنشده "_bar@16" ممکن است به تابع "_bar" پیوند یابد. هنگامی که پیونددهنده این کار را انجام میدهد، یک هشدار چاپ میکند، زیرا در حالت عادی باید پیوند با شکست مواجه میشد، اما گاهی کتابخانههای وارداتی (import libraries) تولیدشده از dllهای شخص ثالث ممکن است برای قابل استفاده بودن به این ویژگی نیاز داشته باشند. اگر --enable-stdcall-fixup را مشخص کنید، این ویژگی کاملاً فعال شده و هشداری چاپ نمیشود. اگر --disable-stdcall-fixup را مشخص کنید، این ویژگی غیرفعال شده و چنین عدم تطابقهایی خطا در نظر گرفته میشوند. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --leading-underscore
- --no-leading-underscore
- برای اکثر اهداف، پیشوند نماد پیشفرض یک خط زیر (underscore) است و در شرح هدف تعریف شده است. با این گزینه میتوان پیشوند خط زیر پیشفرض را غیرفعال/فعال کرد.
- --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". [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --exclude-symbols symbol,symbol,...
- فهرستی از نمادها را مشخص میکند که نباید به طور خودکار صادر شوند. نام نمادها ممکن است با ویرگول یا دونقطه از هم جدا شوند. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --exclude-all-symbols
- مشخص میکند که هیچ نمادی نباید به طور خودکار صادر شود. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --file-alignment
- ترازبندی فایل را مشخص میکند. بخشها در فایل همیشه در آفستهایی از فایل آغاز میشوند که مضاربی از این عدد هستند. مقدار پیشفرض ۵۱۲ است. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --heap reserve
- --heap reserve,commit
- میزان حافظه بر حسب بایت را جهت رزرو (و در صورت تمایل تخصیص یا commit) برای استفاده به عنوان هیپ (heap) این برنامه مشخص میکند. مقدار پیشفرض ۱ مگابایت رزرو، و ۴ کیلوبایت تخصیصیافته است. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --kill-at
- در صورت تعیین، پسوندهای stdcall (بهصورت @nn) پیش از صدور، از نمادها حذف میشوند. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --large-address-aware
- در صورت تعیین، بیت مناسب در فیلد "Characteristics" از سرایند COFF تنظیم میشود تا نشان دهد این فایل اجرایی از آدرسهای مجازی بزرگتر از ۲ گیگابایت پشتیبانی میکند. این گزینه باید به همراه سوییچ /3GB یا /USERVA=value مگابایتی در بخش "[operating systems]" از فایل BOOT.INI استفاده شود؛ در غیر این صورت، این بیت هیچ اثری نخواهد داشت. [این گزینه مختص درگاههای هدف PE در پیونددهنده است]
- --disable-large-address-aware
- اثر گزینه قبلی --large-address-aware را خنثی میکند. این مورد زمانی مفید است که --large-address-aware همیشه توسط درایور کامپایلر (مانند Cygwin gcc) تنظیم شده باشد و فایل اجرایی از آدرسهای مجازی بزرگتر از ۲ گیگابایت پشتیبانی نکند. [این گزینه مختص درگاههای هدف PE در پیونددهنده است]
- --major-image-version value
- شماره اصلی "نسخه تصویر" را تنظیم میکند. پیشفرض 1 است. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --major-os-version value
- شماره اصلی "نسخه سیستمعامل" را تنظیم میکند. پیشفرض 4 است. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --major-subsystem-version value
- شماره اصلی "نسخه زیرسیستم" را تنظیم میکند. پیشفرض 4 است. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --minor-image-version value
- شماره فرعی "نسخه تصویر" را تنظیم میکند. پیشفرض 0 است. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --minor-os-version value
- شماره فرعی "نسخه سیستمعامل" را تنظیم میکند. پیشفرض 0 است. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --minor-subsystem-version value
- شماره فرعی "نسخه زیرسیستم" را تنظیم میکند. پیشفرض 0 است. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است]
- --output-def file
- پیونددهنده فایل file را ایجاد خواهد کرد که حاوی یک فایل DEF متناظر با DLL در حال تولید توسط پیونددهنده است. این فایل DEF (که باید "*.def" نامیده شود) میتواند برای ایجاد یک کتابخانه وارداتی با "dlltool" استفاده شود یا به عنوان مرجعی برای نمادهای صادرشده به صورت خودکار یا ضمنی مورد استفاده قرار گیرد. [این گزینه مختص درگاهِ هدف i386 PE در پیونددهنده است].IP --enable-auto-image-base 4
- --enable-auto-image-base=value
- بهطور خودکار آدرس پایه تصویر (image base) را برای DLLها انتخاب میکند که میتواند بهطور اختیاری با مقدار پایه value آغاز شود، مگر اینکه با استفاده از آرگومان "--image-base" مقداری مشخص شده باشد. با استفاده از درهمسازی (هش) تولیدشده از نام DLL برای ایجاد آدرسهای پایه تصویر یکتا برای هر DLL، از تداخلها و بازنشانیهای (relocations) درون حافظه که میتوانند اجرای برنامه را به تأخیر بیندازند، جلوگیری میشود. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --disable-auto-image-base
- بهطور خودکار یک آدرس پایه تصویر یکتا تولید نمیکند. اگر آدرس پایهای توسط کاربر تعیین نشده باشد ("--image-base")، از پیشفرض سکو استفاده میشود. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --dll-search-prefix string
- هنگام پیوند پویای یک DLL بدون کتابخانه واردسازی (import library)، برای جستجو "<string><basename>.dll" را نسبت به "lib<basename>.dll" در اولویت قرار میدهد. این رفتار امکان تمایز آسان بین DLLهای ساختهشده برای «زیرسکوهای» گوناگون را فراهم میکند: native، cygwin، uwin، pw، و غیره. برای نمونه، DLLهای cygwin معمولاً از "--dll-search-prefix=cyg" استفاده میکنند. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --enable-auto-import
- پیونددهی
پیشرفتهای
میان
"_symbol" و
"__imp__symbol"
برای
واردسازی
دادهها (DATA imports)
از DLLها
انجام
میدهد، و
در نتیجه
دور زدن
سازوکار dllimport
در سمت
کاربر و
ارجاع به
نام
نمادهای
دستنخورده
(unmangled) را ممکن
میسازد.
[این گزینه
مختص پورت
هدف i386 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 است. این کار وظیفه تنظیم ارجاعها در کد کلاینت را به محیط زمان اجرا واگذار میکند؛ بنابراین این روش تنها زمانی کار میکند که محیط زمان اجرا از این قابلیت پشتیبانی کند.
راهحل دوم اجبار یکی از «ثابتها» به متغیر بودن است -- یعنی در زمان کامپایل، ناشناخته و غیرقابل بهینهسازی باشد. برای آرایهها، دو حالت وجود دارد: الف) تبدیل اندیسپذیر (آدرس آرایه) به یک متغیر، یا ب) تبدیل اندیس «ثابت» به یک متغیر. بنابراین:
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
- برای واردسازی دادهها (DATA imports) از DLLها، تلاشی جهت پیونددهی پیشرفته "_symbol" به "__imp__symbol" انجام نمیدهد. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --enable-runtime-pseudo-reloc
- اگر کد شما حاوی عبارتهای شرح داده شده در بخش --enable-auto-import باشد (یعنی واردسازی دادهها از DLL با آفست غیرصفر)، این سوییچ برداری از «بازنشانیهای کاذب زمان اجرا» ('runtime pseudo relocations') ایجاد میکند که میتواند توسط محیط زمان اجرا برای تنظیم ارجاعها به چنین دادههایی در کد کلاینت استفاده شود. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --disable-runtime-pseudo-reloc
- برای واردسازی دادهها (DATA imports) از DLLها با آفست غیرصفر، بازنشانی کاذب ایجاد نمیکند. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --enable-extra-pe-debug
- اطلاعات اشکالزدایی بیشتری را در رابطه با thunking نمادهای auto-import نمایش میدهد. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --section-alignment
- تراز بخش را تنظیم میکند. بخشها در حافظه همواره از آدرسهایی آغاز میشوند که مضربی از این عدد هستند. مقدار پیشفرض 0x1000 است. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --stack reserve
- --stack reserve,commit
- میزان حافظه بر حسب بایت را برای رزرو کردن (و بهطور اختیاری تخصیص دادن یا commit) جهت استفاده به عنوان پشته (stack) برای این برنامه مشخص میکند. مقدار پیشفرض 2MB رزروشده و 4K تخصیصیافته است. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --subsystem which
- --subsystem which:major.minor
- زیرسیستمی
را که
برنامه شما
تحت آن اجرا
خواهد شد
مشخص
میکند.
مقادیر
مجاز برای
which عبارتند
از "native"،
"windows"،
"console"،
"posix" و
"xbox".
همچنین
میتوانید
به صورت
اختیاری
نسخه
زیرسیستم
را نیز
تنظیم کنید.
مقادیر
عددی نیز
برای which
پذیرفته
میشوند.
[این گزینه
مختص پورت
هدف i386 PE
پیونددهنده
است]
گزینههای زیر پرچمهایی را در فیلد "DllCharacteristics" از سرآیند فایل PE تنظیم میکنند: [این گزینهها مختص پورتهای هدف PE پیونددهنده هستند]
- --high-entropy-va
- --disable-high-entropy-va
- تصویر با
تصادفیسازی
چیدمان
فضای آدرس
۶۴ بیتی (ASLR)
سازگار است.
این گزینه
به طور
پیشفرض
برای
تصاویر PE ۶۴
بیتی در
هدفهای MinGW
فعال است.
این گزینه همچنین متضمن --dynamicbase و --enable-reloc-section است.
- --dynamicbase
- --disable-dynamicbase
- آدرس پایه تصویر ممکن است با استفاده از تصادفیسازی چیدمان فضای آدرس (ASLR) بازنشانی شود. این قابلیت در MS Windows Vista برای هدفهای i386 PE معرفی شد. این گزینه به طور پیشفرض برای هدفهای MinGW فعال است اما میتوان آن را از طریق گزینه --disable-dynamicbase غیرفعال کرد. این گزینه همچنین متضمن --enable-reloc-section است.
- --forceinteg
- --disable-forceinteg
- بررسیهای یکپارچگی کد اجباری میشوند. این گزینه به طور پیشفرض غیرفعال است.
- --nxcompat
- --disable-nxcompat
- تصویر با قابلیت جلوگیری از اجرای داده (DEP) سازگار است. این قابلیت در MS Windows XP SP2 برای هدفهای i386 PE معرفی شد. این گزینه به طور پیشفرض برای هدفهای 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 aware). این گزینه به طور پیشفرض غیرفعال است.
- --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 تنظیم میکند. حالت پیشفرض، ایجاد جدولی با 64 مدخل است.
- --dsbt-index index
- این گزینه
نمایه DSBT
فایل
اجرایی یا
کتابخانه
اشتراکی
فعلی را روی
index تنظیم
میکند.
مقدار
پیشفرض 0
است، که
برای تولید
فایلهای
اجرایی
مناسب است.
اگر یک
کتابخانه
اشتراکی با
نمایه DSBT
برابر با 0
تولید شود،
بازنشانیهای
"R_C6000_DSBT_INDEX" در
فایل خروجی
کپی
میشوند.
گزینه --no-merge-exidx-entries ادغام مدخلهای مجاور exidx را در اطلاعات بازپیچی فریم (frame unwind info) غیرفعال میکند.
- --branch-stub
- این گزینه تسهیل پرش (branch relaxation) پیونددهنده را با درج بخشهای واسط پرش (branch stub) در زمان نیاز به گسترش دامنه پرشها فعال میکند. این گزینه معمولاً مورد نیاز نیست زیرا C-SKY از دستورالعملهای پرش و فراخوانی پشتیبانی میکند که میتوانند به کل دامنه حافظه دسترسی داشته باشند و تسهیل پرش معمولاً توسط کامپایلر یا اسمبلر مدیریت میشود.
- --stub-group-size=N
- این گزینه امکان کنترل دقیقتر ایجاد واسط پرش پیونددهنده را فراهم میکند. این گزینه حداکثر اندازه گروهی از بخشهای ورودی را که میتوانند توسط یک بخش واسط مدیریت شوند تنظیم میکند. مقدار منفی برای N بخشهای واسط را پس از پرشهای آنها قرار میدهد، در حالی که مقدار مثبت اجازه میدهد بخشهای واسط قبل یا بعد از پرشها ظاهر شوند. مقادیر 1 یا -1 نشان میدهند که پیونددهنده باید مقادیر پیشفرض مناسب را انتخاب کند.
پیونددهندههای 68HC11 و 68HC12 از گزینههای خاصی برای کنترل نگاشت تعویض بانک حافظه و تولید کد ترامپولین (trampoline) پشتیبانی میکنند.
- --no-trampoline
- این گزینه تولید ترامپولین را غیرفعال میکند. به طور پیشفرض، برای هر تابع دور (far function) که با استفاده از یک دستورالعمل "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 خطایی تولید کند..IP --compact-branches 4
- --no-compact-branches
- این گزینهها تولید دستورالعملهای فشرده توسط پیونددهنده در مدخلهای 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 در سیستمهای Unix روی PDP11 بوده است.
- -n
- --nmagic
- خروجی را در سرایند a.out با مقدار "NMAGIC" (0410) علامتگذاری میکند تا نشان دهد هنگامی که فایل خروجی اجرا میشود، بخش کد فقطخواندنی بوده و میان تمام فرایندهایی که همان فایل را اجرا میکنند قابل اشتراکگذاری خواهد بود. این کار مستلزم انتقال نواحی داده به اولین مرز صفحهٔ ۸ کیلوبایتی ممکنِ پس از پایان کد است. این گزینه یک قالب «اجرایی خالص» (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" تغییر دهید.
اگر از -b (یا هممعنی آن --format) استفاده نکنید، "GNUTARGET" قالب شیء فایل ورودی را تعیین میکند. مقدار آن باید یکی از نامهای BFD برای یک قالب ورودی باشد. اگر "GNUTARGET" در محیط وجود نداشته باشد، ld از قالب طبیعی هدف استفاده میکند. اگر "GNUTARGET" روی "default" تنظیم شده باشد، BFD تلاش میکند تا با بررسی فایلهای ورودی دودویی، قالب ورودی را کشف کند؛ این روش معمولاً موفقیتآمیز است، اما ابهامات احتمالی وجود دارد، چرا که هیچ روشی برای اطمینان از یکتا بودن شماره جادویی بهکاررفته برای تعیین قالبهای فایل شیء وجود ندارد. با این حال، رویهٔ پیکربندی BFD در هر سیستم، قالب متعارف آن سیستم را در ابتدای فهرست جستوجو قرار میدهد، بنابراین ابهامات به نفع روش متعارف برطرف میشوند.
اگر از گزینهٔ -m استفاده نکنید، "LDEMULATION" شبیهسازی پیشفرض را تعیین میکند. این شبیهسازی میتواند جنبههای گوناگونی از رفتار پیونددهنده، بهویژه اسکریپت پیونددهندهٔ پیشفرض را تحت تأثیر قرار دهد. میتوانید شبیهسازیهای موجود را با گزینههای --verbose یا -V فهرست کنید. اگر گزینهٔ -m استفاده نشود و متغیر محیطی "LDEMULATION" تعریف نشده باشد، شبیهسازی پیشفرض به نحوهٔ پیکربندی پیونددهنده بستگی خواهد داشت.
در حالت عادی، پیونددهنده بهطور پیشفرض نمادها را ناهموارگشایی (demangle) میکند. با این حال، اگر "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)
کپیرایت (c) 1991-2025 Free Software Foundation, Inc.
اجازهٔ نسخهبرداری، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نسخهٔ 1.3 یا هر نسخهٔ بالاتر منتشرشده توسط بنیاد نرمافزارهای آزاد اعطا میشود؛ بدون بخشهای تغییرناپذیر، بدون متون روی جلد، و بدون متون پشت جلد. نسخهای از این مجوز در بخشی تحت عنوان «GNU Free Documentation License» گنجانده شده است.
| 2025-11-10 | binutils-2.45.1 |