| LD(1) | GNU Development Tools | LD(1) |
نام (NAME)
ld - پیونددهنده گنو
خلاصه دستور (SYNOPSIS)
ld [options] objfile ...
توضیحات (DESCRIPTION)
ld تعدادی از فایلهای شیء (object) و آرشیو را ترکیب کرده، دادههای آنها را بازنشانی (relocate) میکند و ارجاعات نمادها را به هم پیوند میدهد. معمولاً آخرین مرحله در کامپایل یک برنامه، اجرای ld است.
ld فایلهای زبان دستور پیونددهنده (Linker Command Language) را که در یک ابرمجموعه از نحو «زبان دستور ویرایشگر پیوند AT&T» نوشته شدهاند میپذیرد تا کنترلی صریح و کامل بر فرایند پیونددهی فراهم کند.
این صفحه راهنما زبان دستور را شرح نمیدهد؛ برای جزئیات کامل در مورد زبان دستور و سایر جنبههای پیونددهنده گنو، مدخل ld را در "info" ببینید.
این نسخه از ld از کتابخانههای چندمنظورهٔ BFD برای کار با فایلهای شیء استفاده میکند. این ویژگی به ld اجازه میدهد فایلهای شیء را در قالبهای مختلف بخواند، ترکیب کند و بنویسد؛ به عنوان مثال، COFF یا "a.out". قالبهای گوناگون را میتوان با یکدیگر پیوند داد تا هر نوع فایل شیء موجودی تولید شود.
جدا از انعطافپذیری، پیونددهنده گنو در ارائه اطلاعات تشخیصی و خطاها از سایر پیونددهندهها بسیار مفیدتر عمل میکند. بسیاری از پیونددهندهها بلافاصله پس از مواجهه با یک خطا، اجرا را متوقف میکنند؛ در حالی که تا جای ممکن، ld به اجرا ادامه میدهد و به شما امکان میدهد خطاهای دیگر را نیز شناسایی کنید (یا در مواردی، علیرغم وجود خطا، یک فایل خروجی به دست آورید).
پیونددهنده گنو ld برای پوشش طیف گستردهای از شرایط و تا حد امکان سازگار بودن با سایر پیونددهندهها در نظر گرفته شده است. در نتیجه، شما گزینههای فراوانی برای کنترل رفتار آن در اختیار دارید.
گزینهها (OPTIONS)
پیونددهنده از گزینههای خط فرمان بیشماری پشتیبانی میکند، اما در عمل تنها تعداد کمی از آنها در هر زمینهٔ خاص به کار میروند. برای نمونه، یک کاربرد متداول ld پیوند دادن فایلهای شیء استاندارد Unix در یک سیستم استاندارد و پشتیبانیشدهٔ Unix است. در چنین سیستمی، برای پیوند دادن یک فایل "hello.o":
ld -o <output> /lib/crt0.o hello.o -lc
این دستور به ld میگوید فایلی به نام output را در نتیجهٔ پیوند دادن فایل "/lib/crt0.o" با "hello.o" و کتابخانهٔ "libc.a" (که از دایرکتوریهای جستجوی استاندارد دریافت خواهد شد) ایجاد کند. (توضیحات مربوط به گزینهٔ -l را در ادامه ببینید.)
برخی از گزینههای خط فرمان ld را میتوان در هر کجای خط فرمان مشخص کرد. با این حال، گزینههایی که به فایلها اشاره دارند، مانند -l یا -T، باعث میشوند که فایل در همان نقطهای که گزینه در خط فرمان ظاهر شده است (نسبت به فایلهای شیء و سایر گزینههای فایلی) خوانده شود. تکرار گزینههای غیرفایلی با آرگومانهای متفاوت، یا اثری نخواهد داشت و یا موارد پیشین (آنهایی که در سمت چپتر خط فرمان قرار دارند) را لغو و جایگزین میکند. گزینههایی که تکرار آنها معنادار است در توضیحات زیر مشخص شدهاند.
آرگومانهای غیرگزینهای، فایلهای شیء یا آرشیوهایی هستند که باید به یکدیگر پیوند داده شوند. آنها میتوانند قبل از گزینههای خط فرمان، بعد از آنها، یا در میان آنها قرار گیرند، با این استثنا که یک آرگومان فایل شیء نباید بین یک گزینه و آرگومان مربوط به آن واقع شود.
معمولاً پیونددهنده با حداقل یک فایل شیء فراخوانی میشود، اما میتوانید اشکال دیگر فایلهای ورودی باینری را با استفاده از -l، -R و زبان دستور اسکریپت نیز مشخص کنید. اگر هیچ فایل ورودی باینری مشخص نشده باشد، پیونددهنده خروجیای تولید نمیکند و پیام No input files را صادر مینماید.
اگر پیونددهنده نتواند قالب یک فایل شیء را تشخیص دهد، فرض میکند که آن فایل یک اسکریپت پیونددهنده است. اسکریپتی که به این روش مشخص شود، به اسکریپت اصلی پیونددهنده که برای فرایند پیوند استفاده میشود (خواه اسکریپت پیشفرض باشد یا اسکریپتی که با -T مشخص شده) افزوده میگردد. این ویژگی به پیونددهنده اجازه میدهد با فایلی پیوند برقرار کند که ظاهراً شبیه به یک فایل شیء یا آرشیو است، اما در واقع تنها مقادیر برخی نمادها را تعریف میکند یا از "INPUT" یا "GROUP" برای بارگذاری سایر اشیاء استفاده مینماید. مشخص کردن یک اسکریپت به این شیوه صرفاً به اسکریپت اصلی پیونددهنده میافزاید و دستورهای اضافی بعد از اسکریپت اصلی قرار میگیرند؛ برای جایگزینی کامل اسکریپت پیشفرض پیونددهنده از گزینهٔ -T استفاده کنید، اما به تأثیر دستور "INSERT" توجه داشته باشید.
برای گزینههایی که نام آنها تکحرفی است، آرگومانهای گزینه باید یا بلافاصله و بدون فاصله بعد از حرف گزینه بیایند، یا به عنوان آرگومانی مجزا بلافاصله پس از گزینهای که به آنها نیاز دارد قرار گیرند.
برای گزینههایی که نام آنها چندحرفی است، میتوان پیش از نام گزینه از یک خط تیره یا دو خط تیره استفاده کرد؛ برای نمونه، -trace-symbol و --trace-symbol معادل یکدیگرند. توجه داشته باشید که یک استثنا برای این قاعده وجود دارد: گزینههای چندحرفی که با حرف کوچک 'o' شروع میشوند، فقط میتوانند با دو خط تیره مشخص شوند. این کار برای جلوگیری از اشتباه گرفته شدن با گزینهٔ -o است. بنابراین، به عنوان مثال، -omagic نام فایل خروجی را برابر با magic قرار میدهد، در حالی که --omagic پرچم NMAGIC را روی خروجی تنظیم میکند.
آرگومانهای گزینههای چندحرفی باید یا با علامت مساوی از نام گزینه جدا شوند، یا به عنوان آرگومانهای مجزا بلافاصله پس از گزینهای که به آنها نیاز دارد داده شوند. به عنوان مثال، --trace-symbol foo و --trace-symbol=foo معادل هستند. خلاصهسازیهای یکتا از نام گزینههای چندحرفی پذیرفته میشوند.
توجه داشته باشید اگر پیونددهنده به صورت غیرمستقیم و از طریق یک راهانداز کامپایلر (مانند gcc) فراخوانی میشود، در این صورت تمام گزینههای خط فرمان پیونددهنده باید با پیشوند -Wl, (یا هر پیشوندی که برای آن راهانداز کامپایلر خاص مناسب است) مشخص شوند، مانند:
gcc -Wl,--start-group foo.o bar.o -Wl,--end-group
این نکته مهم است، زیرا در غیر این صورت برنامه راهانداز کامپایلر ممکن است گزینههای پیونددهنده را بیصدا نادیده بگیرد که منجر به یک پیوند ناموفق یا اشتباه خواهد شد. همچنین هنگام ارسال گزینههای دارای مقدار از طریق راهانداز ممکن است تداخل رخ دهد؛ زیرا استفاده از فاصله بین گزینه و آرگومان به عنوان یک جداکننده عمل میکند و باعث میشود راهانداز فقط گزینه را به پیونددهنده و آرگومان را به کامپایلر بفرستد. در این حالت، سادهترین راه استفاده از شکل متصل و چسبیده برای هر دو نوع گزینههای تکحرفی و چندحرفی است، مانند:
gcc foo.o bar.o -Wl,-eENTRY -Wl,-Map=a.map
در ادامه جدولی از سوییچهای عمومی خط فرمان که توسط پیونددهنده گنو پذیرفته میشوند آورده شده است:
- @file
- گزینههای
خط فرمان را
از file
میخواند.
گزینههای
خواندهشده
به جای
گزینهٔ
اولیهٔ @file
درج
میشوند.
اگر file وجود
نداشته
باشد یا
قابل
خواندن
نباشد، با
گزینه به
عنوان یک
مقدار
تحتاللفظی
رفتار
خواهد شد و
حذف
نمیشود.
گزینهها در file با نویسههای فاصله (whitespace) از یکدیگر جدا میشوند. یک نویسهٔ فاصله را میتوان با قرار دادن کل گزینه در گیومهٔ تکی یا دوتایی داخل یک گزینه گنجاند. هر نویسهای (از جمله بکاسلش) را میتوان با افزودن یک بکاسلش به عنوان پیشوند به آن نویسه درج کرد. خود file میتواند شامل گزینههای @file بیشتری باشد؛ هر یک از این گزینهها به صورت بازگشتی پردازش خواهند شد..IP "-a keyword" 4 این گزینه برای سازگاری با HP/UX پشتیبانی میشود. آرگومان keyword باید یکی از رشتههای archive، shared یا default باشد. -aarchive از نظر عملکرد معادل -Bstatic است، و دو کلیدواژه دیگر از نظر عملکرد معادل -Bdynamic هستند. این گزینه میتواند به هر تعداد بار استفاده شود.
- --audit AUDITLIB
- مقدار AUDITLIB را به مدخل "DT_AUDIT" در بخش پویا اضافه میکند. وجود AUDITLIB بررسی نمیشود، و همچنین از DT_SONAME مشخصشده در کتابخانه استفاده نخواهد کرد. اگر چندین بار مشخص شود، "DT_AUDIT" شامل فهرستی از رابطهای بازرسی جدا شده با دونقطه خواهد بود که باید استفاده شوند. اگر پیونددهنده هنگام جستجوی کتابخانههای مشترک، شیئی با یک مدخل بازرسی بیابد، یک مدخل متناظر "DT_DEPAUDIT" در فایل خروجی اضافه میکند. این گزینه تنها بر روی پلتفرمهای ELF که از رابط rtld-audit پشتیبانی میکنند معنیدار است.
- -b input-format
- --format=input-format
- ممکن است ld
به گونهای
پیکربندی
شده باشد که
از بیش از
یک نوع فایل
شیء
پشتیبانی
کند. اگر ld
شما به این
صورت
پیکربندی
شده باشد،
میتوانید
از گزینه -b
برای تعیین
قالب
باینری
فایلهای
شیء ورودی
که پس از
این گزینه
در خط فرمان
میآیند،
استفاده
کنید. حتی
زمانی که ld
برای
پشتیبانی
از
قالبهای
شیء
جایگزین
پیکربندی
شده باشد،
معمولاً
نیازی به
مشخص کردن
آن ندارید،
زیرا ld
باید طوری
پیکربندی
شده باشد که
متداولترین
قالب را در
هر ماشین به
عنوان قالب
ورودی
پیشفرض
انتظار
داشته باشد.
input-format یک رشته
متنی است؛
نام قالبی
خاص که توسط
کتابخانههای
BFD پشتیبانی
میشود.
(میتوانید
قالبهای
باینری
موجود را با
objdump -i فهرست
کنید.)
اگر در حال پیوند دادن فایلهایی با یک قالب باینری نامعمول هستید، ممکن است بخواهید از این گزینه استفاده کنید. همچنین میتوانید با قرار دادن -b input-format پیش از هر گروه از فایلهای شیء در یک قالب مشخص، قالبها را به طور صریح تغییر دهید (هنگام پیوند دادن فایلهای شیء با قالبهای مختلف).
قالب پیشفرض از متغیر محیطی "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
- این سه گزینه معادل یکدیگرند؛ اشکال چندگانه برای سازگاری با سایر پیونددهندهها پشتیبانی میشوند. آنها به نمادهای عمومی فضا اختصاص میدهند، حتی اگر یک فایل خروجی قابل بازآرایی (با -r) مشخص شده باشد. دستور اسکریپت "FORCE_COMMON_ALLOCATION" نیز اثر مشابهی دارد.
- --depaudit AUDITLIB
- -P AUDITLIB
- مقدار AUDITLIB را به مدخل "DT_DEPAUDIT" در بخش پویا اضافه میکند. وجود AUDITLIB بررسی نمیشود، و همچنین از DT_SONAME مشخصشده در کتابخانه استفاده نخواهد کرد. اگر چندین بار مشخص شود، "DT_DEPAUDIT" شامل فهرستی از رابطهای بازرسی جدا شده با دونقطه خواهد بود که باید استفاده شوند. این گزینه تنها در پلتفرمهای ELF که از رابط rtld-audit پشتیبانی میکنند معنیدار است. گزینه -P برای سازگاری با Solaris ارائه شده است.
- --enable-linker-version
- دستورالعمل
اسکریپت
پیونددهنده
"LINKER_VERSION" را
که در Output Section Data
شرح داده
شده است،
فعال
میکند. اگر
از این
دستورالعمل
در یک
اسکریپت
پیونددهنده
استفاده
شود و این
گزینه فعال
شده باشد،
رشتهای
حاوی نسخه
پیونددهنده
در نقطه
جاری درج
خواهد شد.
توجه - محل قرارگیری این گزینه در خط فرمان پیونددهنده مهم است. این گزینه تنها بر روی اسکریپتهای پیونددهندهای اثر میگذارد که پس از آن در خط فرمان بیایند، یا درون پیونددهنده تعبیه شده باشند.
- --disable-linker-version
- دستورالعمل اسکریپت پیونددهنده "LINKER_VERSION" را غیرفعال میکند، به طوری که رشته نسخه را درج نکند. این حالت پیشفرض است.
- --enable-non-contiguous-regions
- این گزینه
در صورتی که
یک بخش
ورودی در یک
بخش خروجی
متناظر جا
نشود، از
ایجاد خطا
جلوگیری
میکند.
پیونددهنده
تلاش
میکند تا
بخش ورودی
را به
بخشهای
خروجی
متناظر
بعدی تخصیص
دهد، و تنها
زمانی خطا
ایجاد
میکند که
هیچ بخش
خروجی به
اندازه
کافی بزرگ
نباشد. این
در مواردی
مفید است که
چندین
ناحیه
حافظه
غیرپیوسته
در دسترس
باشند و بخش
ورودی به
ناحیه خاصی
وابسته
نباشد.
ترتیبی که
بخشهای
ورودی بر
اساس آن
ارزیابی
میشوند
تغییر
نمیکند،
به عنوان
مثال:
MEMORY { MEM1 (rwx) : ORIGIN = 0x1000, LENGTH = 0x14 MEM2 (rwx) : ORIGIN = 0x1000, LENGTH = 0x40 MEM3 (rwx) : ORIGIN = 0x2000, LENGTH = 0x40 } SECTIONS { mem1 : { *(.data.*); } > MEM1 mem2 : { *(.data.*); } > MEM2 mem3 : { *(.data.*); } > MEM3 } with input sections: .data.1: size 8 .data.2: size 0x10 .data.3: size 4 results in .data.1 affected to mem1, and .data.2 and .data.3 affected to mem2, even though .data.3 would fit in mem3.این گزینه با دستورهای INSERT ناسازگار است زیرا نحوه نگاشت بخشهای ورودی به بخشهای خروجی را تغییر میدهد.
- --enable-non-contiguous-regions-warnings
- این گزینه هشدارهایی را فعال میکند هنگامی که "--enable-non-contiguous-regions" اجازه تطبیقهای احیاناً غیرمنتظره را در نگاشت بخشها میدهد؛ امری که بالقوه میتواند به جای شکست خوردن به دلیل جا نشدن در هیچ ناحیه خروجی، منجر به دور انداخته شدن بیسر و صدای یک بخش شود.
- -e entry
- --entry=entry
- از entry به عنوان نماد صریح برای شروع اجرای برنامه خود به جای نقطه ورود پیشفرض استفاده کنید. اگر هیچ نمادی به نام entry وجود نداشته باشد، پیونددهنده تلاش میکند تا entry را به عنوان یک عدد تجزیه کند و از آن به عنوان نشانی ورود استفاده نماید (این عدد در مبنای ۱۰ تفسیر خواهد شد؛ میتوانید از یک 0x آغازین برای مبنای ۱۶، یا یک 0 آغازین برای مبنای ۸ استفاده کنید). برای i386 PE، مقدار entry همچنین میتواند نام اصلی تابع باشد (در صورت وجود، بدون خط زیر آغازین و/یا پسوند stdcall @number).
- --exclude-libs lib,lib,...
- فهرستی از کتابخانههای آرشیو را مشخص میکند که نمادهای آنها نباید به طور خودکار صادر شوند. نامهای کتابخانهها میتوانند با کاما یا دونقطه از هم جدا شوند. مشخص کردن "--exclude-libs ALL" تمام نمادها را در تمام کتابخانههای آرشیو از صادرات خودکار مستثنی میکند. این گزینه فقط برای پورت پیونددهنده با مقصد i386 PE و برای پورتهای با مقصد ELF در دسترس است. برای i386 PE، نمادهایی که به صراحت در یک فایل .def فهرست شدهاند، بدون توجه به این گزینه همچنان صادر میشوند. برای پورتهای با مقصد ELF، با نمادهای تحت تأثیر این گزینه به عنوان پنهان (hidden) رفتار خواهد شد.
- --exclude-modules-for-implib module,module,...
- فهرستی از فایلهای شیء یا اعضای آرشیو را مشخص میکند که نمادهای آنها نباید به طور خودکار صادر شوند، بلکه باید به صورت یکپارچه در کتابخانه واردات (import library) که در حین پیوند ایجاد میشود کپی گردند. نامهای پیمانهها میتوانند با کاما یا دونقطه از هم جدا شوند و باید دقیقاً با نام فایلهای مورد استفاده توسط ld برای باز کردن فایلها مطابقت داشته باشند؛ برای اعضای آرشیو، این صرفاً نام عضو است، اما برای فایلهای شیء نام فهرستشده باید شامل هر مسیری باشد که برای تعیین فایل ورودی در خط فرمان پیونددهنده استفاده شده است و دقیقاً با آن مطابقت کند. این گزینه تنها برای پورت پیونددهنده با مقصد i386 PE در دسترس است. نمادهایی که صراحتاً در یک فایل .def فهرست شدهاند، بدون توجه به این گزینه همچنان صادر میشوند.
- -E
- --export-dynamic
- --no-export-dynamic
- هنگام
ایجاد یک
فایل
اجرایی با
پیوند
پویا،
استفاده از
گزینه -E یا
گزینه --export-dynamic
باعث
میشود که
پیونددهنده
همه نمادها
را به جدول
نمادهای
پویا اضافه
کند. جدول
نمادهای
پویا
مجموعهای
از نمادها
است که در
زمان اجرا
از اشیاء
پویا قابل
مشاهده
هستند.
اگر از هیچکدام از این گزینهها استفاده نکنید (یا از گزینه --no-export-dynamic برای بازگرداندن رفتار پیشفرض استفاده کنید)، جدول نمادهای پویا معمولاً تنها شامل آن نمادهایی خواهد بود که توسط یک شیء پویای اشارهشده در پیوند، مورد ارجاع قرار گرفتهاند.
اگر از "dlopen" برای بارگذاری یک شیء پویا استفاده میکنید که به جای یک شیء پویای دیگر، نیاز به ارجاع مجدد به نمادهای تعریفشده توسط برنامه دارد، احتمالاً لازم است هنگام پیوند دادن خود برنامه از این گزینه استفاده کنید.
همچنین در صورتی که قالب خروجی از آن پشتیبانی کند، میتوانید از لیست پویا برای کنترل نمادهایی که باید به جدول نمادهای پویا اضافه شوند استفاده نمایید. توضیحات --dynamic-list را ببینید.
توجه داشته باشید که این گزینه مختص پورتهای با مقصد ELF است. مقاصد PE از قابلیتی مشابه برای صادر کردن تمام نمادها از یک DLL یا EXE پشتیبانی میکنند؛ توضیحات مربوط به --export-all-symbols را در زیر ببینید..IP --export-dynamic-symbol=glob 4 هنگام ایجاد یک فایل اجرایی با پیوند پویا، نمادهای منطبق با glob به جدول نمادهای پویا اضافه خواهند شد. هنگام ایجاد یک کتابخانه مشترک، ارجاعات به نمادهای منطبق با glob به تعاریف درون کتابخانه مشترک مقید نخواهند شد. این گزینه هنگام ایجاد یک کتابخانه مشترک در صورتی که -Bsymbolic یا --dynamic-list مشخص نشده باشند، هیچ عملی انجام نمیدهد (no-op). این گزینه تنها در پلتفرمهای ELF که از کتابخانههای مشترک پشتیبانی میکنند معنی دارد.
- --export-dynamic-symbol-list=file
- برای هر الگو در فایل یک --export-dynamic-symbol مشخص میکند. قالب فایل همانند گره نسخه (version node) بدون حوزه (scope) و نام گره است. برای اطلاعات بیشتر VERSION را ببینید.
- -EB
- پیوند اشیاء با ترتیب بایت بزرگتر (big-endian). این گزینه بر قالب خروجی پیشفرض تأثیر میگذارد.
- -EL
- پیوند اشیاء با ترتیب بایت کوچکتر (little-endian). این گزینه بر قالب خروجی پیشفرض تأثیر میگذارد.
- -f name
- --auxiliary=name
- هنگام
ایجاد یک
شیء مشترک
ELF، فیلد
داخلی DT_AUXILIARY را
به نام
مشخصشده
تنظیم
میکند. این
کار به
پیونددهنده
پویا اعلام
میکند که
جدول
نمادهای
شیء مشترک
باید به
عنوان یک
فیلتر کمکی
بر روی جدول
نمادهای
شیء مشترک
name استفاده
شود.
اگر بعداً برنامهای را در برابر این شیء فیلتر پیوند دهید، آنگاه هنگام اجرای برنامه، پیونددهنده پویا فیلد DT_AUXILIARY را خواهد دید. اگر پیونددهنده پویا هر نمادی را از شیء فیلتر حل کند، ابتدا بررسی میکند که آیا تعریفی در شیء مشترک name وجود دارد یا خیر. اگر وجود داشته باشد، به جای تعریف موجود در شیء فیلتر استفاده خواهد شد. لزومی ندارد شیء مشترک name وجود داشته باشد. بنابراین شیء مشترک name ممکن است برای ارائه یک پیادهسازی جایگزین از توابع خاصی، شاید برای اشکالزدایی یا کارایی ویژه یک ماشین خاص، استفاده شود.
این گزینه ممکن است بیش از یک بار مشخص شود. ورودیهای DT_AUXILIARY به ترتیبی که در خط فرمان ظاهر میشوند ایجاد خواهند شد.
- -F name
- --filter=name
- هنگام
ایجاد یک
شیء مشترک
ELF، فیلد
داخلی DT_FILTER را
به نام
مشخصشده
تنظیم
میکند. این
کار به
پیونددهنده
پویا اعلام
میکند که
جدول
نمادهای
شیء مشترک
در حال
ایجاد باید
به عنوان یک
فیلتر بر
روی جدول
نمادهای
شیء مشترک
name استفاده
شود.
اگر بعداً برنامهای را در برابر این شیء فیلتر پیوند دهید، آنگاه هنگام اجرای برنامه، پیونددهنده پویا فیلد DT_FILTER را خواهد دید. پیونددهنده پویا نمادها را طبق معمول بر اساس جدول نمادهای شیء فیلتر حل خواهد کرد، اما در واقع به تعاریف موجود در شیء مشترک name پیوند خواهد خورد. بنابراین شیء فیلتر میتواند برای انتخاب زیرمجموعهای از نمادهای ارائهشده توسط شیء name استفاده شود.
برخی پیونددهندههای قدیمیتر از گزینه -F در سراسر یک زنجیره ابزار کامپایل برای مشخص کردن قالب فایل شیء برای هر دو فایلهای شیء ورودی و خروجی استفاده میکردند. پیونددهنده GNU از سازوکارهای دیگری برای این منظور استفاده میکند: گزینههای -b، --format، --oformat، دستور "TARGET" در اسکریپتهای پیونددهنده، و متغیر محیطی "GNUTARGET". پیونددهنده GNU در صورتی که در حال ایجاد یک شیء مشترک ELF نباشد، گزینه -F را نادیده خواهد گرفت.
- -fini=name
- هنگام ایجاد یک فایل اجرایی یا شیء مشترک ELF، با تنظیم DT_FINI به آدرس تابع، هنگام تخلیه شدن فایل اجرایی یا شیء مشترک از حافظه، NAME را فراخوانی میکند. به طور پیشفرض، پیونددهنده از "_fini" به عنوان تابع فراخوانیشده استفاده میکند.
- -g
- نادیده گرفته میشود. برای سازگاری با سایر ابزارها ارائه شده است.
- -G value
- --gpsize=value
- حداکثر اندازه اشیایی که قرار است با استفاده از ثبات GP بهینهسازی شوند را به size تنظیم میکند. این گزینه فقط برای قالبهای فایل شیء نظیر MIPS ELF که از قرار دادن اشیاء بزرگ و کوچک در بخشهای مختلف پشتیبانی میکنند معنیدار است. برای سایر قالبهای فایل شیء نادیده گرفته میشود.
- -h name
- -soname=name
- هنگام ایجاد یک شیء مشترک ELF، فیلد داخلی DT_SONAME را به نام مشخصشده تنظیم میکند. هنگامی که یک فایل اجرایی با یک شیء مشترک دارای فیلد DT_SONAME پیوند داده میشود، هنگام اجرای فایل اجرایی، پیونددهنده پویا تلاش میکند به جای استفاده از نام فایل دادهشده به پیونددهنده، شیء مشترک مشخصشده توسط فیلد DT_SONAME را بارگذاری کند.
- -i
- انجام یک پیوند افزایشی (مشابه گزینه -r).
- -init=name
- هنگام ایجاد یک فایل اجرایی یا شیء مشترک ELF، با تنظیم DT_INIT به آدرس تابع، هنگام بارگذاری شدن فایل اجرایی یا شیء مشترک، NAME را فراخوانی میکند. به طور پیشفرض، پیونددهنده از "_init" به عنوان تابع فراخوانیشده استفاده میکند.
- -l namespec
- --library=namespec
- فایل آرشیو
یا شیء
مشخصشده
توسط namespec را
به فهرست
فایلهای
پیوند
اضافه
میکند. این
گزینه
میتواند
به هر تعداد
بار
استفاده
شود. اگر namespec
به صورت :filename
باشد، ld
مسیر
کتابخانه
را برای
فایلی به
نام filename
جستجو
میکند، در
غیر این
صورت مسیر
کتابخانه
را برای
فایلی به
نام libnamespec.a
جستجو
خواهد کرد.
در سیستمهایی که از کتابخانههای مشترک پشتیبانی میکنند، ld ممکن است برای فایلهایی به غیر از libnamespec.a نیز جستجو کند. به طور مشخص، در سیستمهای ELF و SunOS، برنامه ld پیش از جستجو برای فایلی به نام libnamespec.a، یک پوشه را برای کتابخانهای به نام libnamespec.so جستجو میکند. (بر اساس قرارداد، پسوند ".so" نشاندهنده یک کتابخانه مشترک است.) توجه داشته باشید که این رفتار بر :filename که همیشه فایلی به نام filename را مشخص میکند، اعمال نمیشود.
پیونددهنده یک آرشیو را تنها یک بار، در همان مکانی که در خط فرمان مشخص شده است، جستجو خواهد کرد. اگر آرشیو نمادی را تعریف کند که در شیئی پیش از آرشیو در خط فرمان نامشخص بوده باشد، پیونددهنده فایل(های) مربوطه را از آرشیو اضافه میکند. با این حال، یک نماد نامشخص در شیئی که بعداً در خط فرمان ظاهر شود، باعث جستجوی مجدد آرشیو توسط پیونددهنده نخواهد شد.
برای روشی جهت وادار کردن پیونددهنده به جستجوی چندباره آرشیوها، گزینه -( را ببینید.
میتوانید یک آرشیو مشابه را چندین بار در خط فرمان فهرست کنید.
این نوع جستجوی آرشیو برای پیونددهندههای Unix استاندارد است. با این حال، اگر از ld در AIX استفاده میکنید، توجه داشته باشید که این روش با رفتار پیونددهنده AIX متفاوت است.
- -L searchdir
- --library-path=searchdir
- مسیر searchdir را
به فهرست
مسیرهایی
که ld برای
کتابخانههای
آرشیو و
اسکریپتهای
کنترلی ld
جستجو
میکند،
اضافه
میکند.
میتوانید
از این
گزینه به هر
تعداد بار
استفاده
کنید.
پوشهها به
همان
ترتیبی که
در خط فرمان
مشخص
شدهاند
جستجو
میشوند.
پوشههای
مشخصشده
در خط
فرمان، پیش
از
پوشههای
پیشفرض
جستجو
میشوند.
تمام
گزینههای
-L، صرف نظر
از ترتیب
ظاهر شدن،
بر تمام
گزینههای
-l اعمال
میشوند.
گزینههای
-L تأثیری
بر نحوه
جستجوی
اسکریپت
پیونددهنده
توسط ld
ندارند مگر
اینکه
گزینه -T
مشخص شده
باشد.
اگر searchdir با "=" یا $SYSROOT شروع شود، این پیشوند با sysroot prefix که توسط گزینه --sysroot کنترل میشود یا هنگام پیکربندی پیونددهنده مشخص شده است، جایگزین خواهد شد.
مجموعه پیشفرض مسیرهای جستجوشده (بدون مشخص شدن با -L) بستگی به این دارد که ld از کدام حالت شبیهسازی استفاده میکند، و در برخی موارد نیز به نحوه پیکربندی آن وابسته است.
مسیرها را میتوان در یک اسکریپت پیوند با دستور "SEARCH_DIR" نیز مشخص کرد. پوشههایی که به این روش مشخص میشوند، در نقطهای که اسکریپت پیونددهنده در خط فرمان ظاهر میشود جستجو خواهند شد.
- -m emulation
- پیونددهنده
emulation را
شبیهسازی
میکند.
میتوانید
با
گزینههای
--verbose یا -V،
شبیهسازیهای
موجود را
فهرست کنید.
اگر گزینه -m استفاده نشود، شبیهسازی از متغیر محیطی "LDEMULATION" (در صورت تعریف) گرفته میشود.
در غیر این صورت، شبیهسازی پیشفرض به نحوه پیکربندی پیونددهنده بستگی دارد.
- --remap-inputs=pattern=filename
- --remap-inputs-file=file
- این
گزینهها
اجازه
میدهند
نام
فایلهای
ورودی قبل
از اینکه
پیونددهنده
اقدام به
باز کردن
آنها کند،
تغییر داده
شوند. گزینه
--remap-inputs=foo.o=bar.o باعث
میشود هر
تلاشی برای
بارگذاری
فایلی به
نام foo.o، در
عوض تلاش
کند فایلی
به نام bar.o را
بارگذاری
کند.
الگوهای
نویسهنما
(wildcard) در نام
فایل اول
مجاز
هستند،
بنابراین
--remap-inputs=foo*.o=bar.o هر
فایل ورودی
را که با foo*.o
مطابقت
داشته باشد
به bar.o تغییر
نام میدهد.
شکل جایگزین این گزینه یعنی --remap-inputs-file=filename اجازه میدهد نگاشتهای مجدد از یک فایل خوانده شوند. هر خط در فایل میتواند حاوی یک نگاشت مجدد باشد. خطوط خالی نادیده گرفته میشوند. هر چیزی از نویسه هش (#) تا انتهای یک خط به عنوان توضیح در نظر گرفته شده و نادیده گرفته میشود. الگوی نگاشت میتواند با فاصله یا نویسه مساوی (=) از نام فایل جدا شود.
این گزینهها میتوانند چندین بار مشخص شوند. محتوای آنها تجمع مییابد. نگاشتهای مجدد به همان ترتیبی که در خط فرمان ظاهر میشوند، و اگر از یک فایل باشند، به ترتیبی که در فایل آمدهاند پردازش خواهند شد. اگر تطابقی حاصل شود، بررسی بیشتری برای آن نام فایل انجام نخواهد شد.
اگر نام فایل جایگزین /dev/null یا فقط NUL باشد، آنگاه نگاشت مجدد در واقع باعث نادیده گرفته شدن فایل ورودی خواهد شد. این میتواند روشی مناسب برای آزمودن حذف فایلهای ورودی از یک محیط ساخت پیچیده باشد.
توجه داشته باشید که این گزینه وابسته به موقعیت است و فقط بر نام فایلهایی تأثیر میگذارد که بعد از آن در خط فرمان میآیند. بنابراین:
ld foo.o --remap-inputs=foo.o=bar.o
هیچ اثری نخواهد داشت، در حالی که:
ld --remap-inputs=foo.o=bar.o foo.o
نام فایل ورودی foo.o را به bar.o تغییر خواهد داد.
توجه - این گزینهها بر فایلهای مورد ارجاع توسط عبارات INPUT در اسکریپتهای پیونددهنده نیز تأثیر میگذارند. اما از آنجا که اسکریپتهای پیونددهنده پس از خوانده شدن کل خط فرمان پردازش میشوند، موقعیت گزینههای نگاشت مجدد در خط فرمان اهمیتی ندارد.
اگر گزینه verbose فعال باشد، هر نگاشتی که مطابقت داشته باشد گزارش داده خواهد شد، اگرچه باز هم نیاز است گزینه verbose در خط فرمان پیش از ظاهر شدن نام فایلهای نگاشتیافته فعال شده باشد.
اگر گزینههای -Map یا --print-map فعال باشند، فهرست نگاشت مجدد در خروجی نگاشت (map output) گنجانده خواهد شد..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 (GNU properties).
هنگامی که پیونددهنده بخشهای ورودی .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 (با مقدار ویژگی 0x1 برای 0xc0010001) و bar.o (با مقدار ویژگی 0x1 برای 0xc0010001)، در خروجی به 0x1 بهروزرسانی شده است.
- در برخی
مقصدهای ELF،
فهرستی از
اصلاحات (fixups)
درجشده
توسط --relax.
foo.o: Adjusting branch at 0x00000008 towards "far" in section .text
این مورد نشان میدهد که انشعاب در نشانی 0x00000008 در foo.o به مقصد نماد "far" در بخش .text، با یک ترامپولین (trampoline) جایگزین شده است.
- --print-map-discarded
- --no-print-map-discarded
- چاپ (یا عدم چاپ) فهرست بخشهای کنار گذاشتهشده و دور ریختهشده (garbage collected) در نگاشت پیوند. بهطور پیشفرض فعال است.
- --print-map-locals
- --no-print-map-locals
- چاپ (یا عدم چاپ) نمادهای محلی در نگاشت پیوند. نمادهای محلی متن (local) را پیش از نام خود خواهند داشت و پس از تمام نمادهای سراسری در یک بخش مشخص فهرست میشوند. نمادهای محلی موقت (معمولاً نمادهایی که با .L آغاز میشوند) در خروجی گنجانده نخواهند شد. بهطور پیشفرض غیرفعال است.
- -n
- --nmagic
- غیرفعال کردن همترازی صفحهای (page alignment) بخشها، و غیرفعال کردن پیوند با کتابخانههای اشتراکی. اگر قالب خروجی از شمارههای جادویی به سبک یونیکس پشتیبانی کند، خروجی را با عنوان "NMAGIC" علامتگذاری میکند.
- -N
- --omagic
- تنظیم بخشهای text و data به عنوان خواندنی و نوشتنی. همچنین بخش داده را همتراز صفحه نمیکند، و پیوند با کتابخانههای اشتراکی را غیرفعال میسازد. اگر قالب خروجی از شمارههای جادویی به سبک یونیکس پشتیبانی کند، خروجی را با عنوان "OMAGIC" مشخص میکند. نکته: گرچه داشتن یک بخش text نوشتنی برای مقصدهای PE-COFF مجاز است، اما با مشخصات قالبی که توسط مایکروسافت منتشر شده مطابقت ندارد.
- --no-omagic
- این گزینه بیشتر اثرات گزینه -N را خنثی میکند. این گزینه بخش text را فقطخواندنی تنظیم میکند و قطعه داده را وادار میسازد که همتراز صفحه شود. نکته - این گزینه پیوند با کتابخانههای اشتراکی را فعال نمیکند. برای این منظور از -Bdynamic استفاده کنید.
- -o output
- --output=output
- استفاده از
output به عنوان
نام برنامه
تولیدشده
توسط ld؛
اگر این
گزینه مشخص
نشده باشد،
نام a.out
بهطور
پیشفرض
استفاده
میشود.
دستور
اسکریپتی
"OUTPUT" نیز
میتواند
نام فایل
خروجی را
مشخص کند.
نکته - پیونددهنده پیش از شروع نوشتن در فایل خروجی، آن را حذف خواهد کرد. این کار حتی اگر مشخص شود که فرایند پیوند به دلیل خطاها کامل نمیشود نیز انجام میگیرد.
نکته - پیونددهنده بررسی میکند تا مطمئن شود نام فایل خروجی با نام هیچیک از فایلهای ورودی مطابقت نداشته باشد، اما فقط همین. بهویژه اگر فایل خروجی ممکن است یک فایل منبع یا فایل مهم دیگری را بازنویسی کند، هشداری داده نخواهد شد. بنابراین در سیستمهای ساخت توصیه میشود از گزینه -o به عنوان آخرین گزینه در خط فرمان پیونددهنده استفاده شود. برای مثال در نظر بگیرید:
ld -o $(EXE) $(OBJS) ld $(OBJS) -o $(EXE)
اگر متغیر EXE به هر دلیلی تعریف نشده باشد، نگارش اول دستور پیونددهنده میتواند منجر به حذف یکی از فایلهای شیء شود (اولین فایل در فهرست OBJS)، در حالی که نگارش دوم دستور پیونددهنده یک پیام خطا تولید کرده و چیزی را حذف نخواهد کرد.
- --dependency-file=depfile
- نوشتن یک فایل وابستگی در depfile. این فایل حاوی قاعدهای مناسب برای "make" است که فایل خروجی و تمامی فایلهای ورودی خواندهشده برای تولید آن را توصیف میکند. خروجی مشابه خروجی کامپایلر با -M -MP است. توجه داشته باشید که گزینهای شبیه به گزینه -MM کامپایلر برای مستثنی کردن «فایلهای سیستمی» وجود ندارد (چرا که این مفهوم برخلاف «سرفایلهای سیستمی» در کامپایلر، در پیونددهنده تعریف دقیقی ندارد). بنابراین خروجی --dependency-file همیشه مختص وضعیت دقیق نصب در سیستمی است که در آن تولید شده، و نباید بدون ویرایش دقیق در makefileهای توزیعشده کپی شود.
- -O level
- اگر level یک مقدار عددی بزرگتر از صفر باشد، ld خروجی را بهینهسازی میکند. این کار ممکن است بهمیزان قابلتوجهی زمان بیشتری ببرد و بنابراین احتمالاً تنها باید برای باینری نهایی فعال شود. در حال حاضر این گزینه فقط بر تولید کتابخانههای اشتراکی ELF تأثیر میگذارد. انتشارهای آینده پیونددهنده ممکن است استفاده بیشتری از این گزینه بکنند. همچنین هماکنون تفاوتی در رفتار پیونددهنده برای مقادیر مختلف غیرصفر این گزینه وجود ندارد. این مورد نیز ممکن است در نسخههای بعدی تغییر کند.
- -plugin name
- درگیر کردن
یک پلاگین
در فرایند
پیوند.
پارامتر name
نام فایل
مطلق
پلاگین است.
معمولاً
این
پارامتر
هنگام
استفاده از
بهینهسازی
زمان
پیوند،
بهطور
خودکار
توسط
کامپایلر
اضافه
میشود،
اما
کاربران
نیز در صورت
تمایل
میتوانند
پلاگینهای
خود را
اضافه کنند.
توجه داشته باشید که محل پلاگینهای منشأگرفته از کامپایلر با محلی که برنامههای ar، nm و ranlib پلاگینهای خود را در آن جستجو میکنند متفاوت است. برای اینکه آن دستورها بتوانند از یک پلاگین مبتنی بر کامپایلر استفاده کنند، پلاگین باید ابتدا در دایرکتوری ${libdir}/bfd-plugins کپی شود. تمام پلاگینهای پیونددهنده مبتنی بر gcc دارای سازگاری عقبروی (backward compatible) هستند، بنابراین کپی کردن جدیدترین نسخه از آنها کافی خواهد بود.
- --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) نامیده میشود. به عنوان یک اثر جانبی، در محیطهایی که از شمارههای جادویی (magic numbers) استاندارد Unix پشتیبانی میکنند، این گزینه شماره جادویی فایل خروجی را نیز روی "OMAGIC" تنظیم میکند. اگر این گزینه مشخص نشود، یک فایل مطلق تولید میشود. هنگام پیوند برنامههای C++، این گزینه ارجاعات به سازندهها (constructors) را حل نخواهد کرد؛ برای انجام این کار، از -Ur استفاده کنید. هنگامی که قالب یک فایل ورودی با فایل خروجی یکسان نباشد، پیوند جزئی تنها در صورتی پشتیبانی میشود که آن فایل ورودی حاوی هیچ بازآدرسدهیای نباشد. قالبهای خروجی مختلف میتوانند محدودیتهای بیشتری داشته باشند؛ به عنوان مثال برخی از قالبهای مبتنی بر "a.out" به هیچ وجه از پیوند جزئی با فایلهای ورودی در قالبهای دیگر پشتیبانی نمیکنند. هنگامی که خروجی بازآدرسپذیر هم شامل محتوایی باشد که نیازمند بهینهسازی زمان پیوند (LTO) است و هم محتوایی که به LTO نیازی ندارد، یک بخش .gnu_object_only ایجاد خواهد شد تا حاوی یک فایل شیء بازآدرسپذیر باشد، درست مانند حالتی که -r برای تمام ورودیهای بازآدرسپذیری که نیازی به LTO ندارند اعمال شده باشد. هنگام پردازش یک ورودی بازآدرسپذیر با یک بخش .gnu_object_only، پیونددهنده بخش .gnu_object_only را به عنوان یک ورودی مجزا استخراج خواهد کرد. توجه داشته باشید که از آنجا که -r برخی از بخشهای فایلهای ورودی مختلف را با یکدیگر گروهبندی میکند، ممکن است اثرات منفی بر اندازه کد و محلیبودن (locality) در فایل اجرایی یا کتابخانه اشتراکی نهایی داشته باشد. این گزینه همان کاری را انجام میدهد که -i انجام میدهد.
- -R filename
- --just-symbols=filename
-
نام نمادها و نشانیهای آنها را از filename میخواند، اما آن را بازآدرسدهی نمیکند و در خروجی قرار نمیدهد. این به فایل خروجی شما اجازه میدهد تا به صورت نمادین به مکانهای مطلق حافظه تعریفشده در برنامههای دیگر ارجاع دهد. میتوانید از این گزینه بیش از یک بار استفاده کنید. برای سازگاری با سایر پیونددهندههای ELF، اگر پس از گزینه -R به جای نام یک فایل، نام یک دایرکتوری بیاید، همانند گزینه -rpath رفتار خواهد شد.
- --rosegment
- --no-rosegment
-
تلاش میکند تا اطمینان حاصل شود که تنها یک سگمنت فقطخواندنی و غیرکدی ایجاد میشود. تنها زمانی مفید است که همراه با گزینه -z separate-code استفاده شود. باینریهای حاصل باید از حالتی که -z separate-code به تنهایی استفاده میشود کوچکتر باشند. بدون این گزینه، یا اگر --no-rosegment مشخص شود، گزینه -z separate-code دو سگمنت فقطخواندنی ایجاد خواهد کرد، یکی قبل از سگمنت کد و دیگری بعد از آن. نام گزینهها گمراهکننده است، اما برای سازگاری پیونددهنده با پیونددهندههای LLD و GOLD اینگونه انتخاب شدهاند. این گزینهها فقط توسط مقصدهای ELF پشتیبانی میشوند.
- -s
- --strip-all
-
تمام اطلاعات نمادها را از فایل خروجی حذف میکند.
- -S
- --strip-debug
-
اطلاعات نمادهای خطایاب (اما نه همه نمادها) را از فایل خروجی حذف میکند.
- --strip-discarded
- --no-strip-discarded
-
نمادهای سراسری تعریفشده در بخشهای دور ریختهشده را حذف (یا عدم حذف) میکند. بهطور پیشفرض فعال است.
- -plugin-save-temps
-
فایلهای واسط «موقتی» افزونه را به صورت دائمی ذخیره میکند.
- -t
- --trace
-
نام فایلهای ورودی را همزمان با پردازش آنها توسط ld چاپ میکند. اگر -t دو بار داده شود، اعضای درون آرشیوها نیز چاپ میشوند. خروجی -t برای ایجاد فهرستی از تمام فایلهای شیء و اسکریپتهای درگیر در پیوند، برای مثال هنگام بستهبندی فایلها برای گزارش اشکال پیونددهنده، مفید است.
- -T scriptfile
- --script=scriptfile
-
از scriptfile به عنوان اسکریپت پیونددهنده استفاده میکند. این اسکریپت جایگزین اسکریپت پیشفرض پیونددهنده ld میشود (نه اینکه به آن اضافه شود)، مگر اینکه اسکریپت حاوی "INSERT" باشد، بنابراین commandfile باید تمام موارد لازم برای توصیف فایل خروجی را مشخص کند. اگر scriptfile در دایرکتوری فعلی وجود نداشته باشد، "ld" در دایرکتوریهای مشخصشده توسط گزینههای پیشین -L به دنبال آن میگردد. گزینههای خط فرمانی که قبل از گزینه -T میآیند میتوانند بر اسکریپت تأثیر بگذارند، اما گزینههای خط فرمانی که پس از آن قرار دارند تأثیری ندارند. چندین گزینه -T در صورتی که اسکریپت فعلی را توسعه دهند با هم تجمیع میشوند، در غیر این صورت از آخرین گزینه -T غیرتوسعهدهنده استفاده خواهد شد. راههای دیگری نیز برای تعیین اسکریپتهای پیونددهنده وجود دارد. رجوع کنید به
- -dT scriptfile
- --default-script=scriptfile
-
از scriptfile به عنوان اسکریپت پیشفرض پیونددهنده استفاده میکند. این گزینه مشابه گزینه --script است، با این تفاوت که پردازش اسکریپت تا بعد از پردازش سایر بخشهای خط فرمان به تعویق میافتد. این ویژگی به گزینههایی که پس از گزینه --default-script در خط فرمان قرار گرفتهاند امکان میدهد بر رفتار اسکریپت پیونددهنده تأثیر بگذارند؛ امری که وقتی خط فرمان پیونددهنده نمیتواند مستقیماً توسط کاربر کنترل شود میتواند مهم باشد (برای مثال زمانی که خط فرمان توسط ابزار دیگری مانند gcc ساخته میشود).
- -u symbol
- --undefined=symbol
-
symbol را وادار میکند تا به عنوان یک نماد تعریفنشده (undefined) وارد فایل خروجی شود. انجام این کار برای مثال میتواند موجب کشیدن و پیوند دادن ماژولهای اضافی از کتابخانههای استاندارد شود. -u ممکن است با آرگومانهای مختلف تکرار شود تا نمادهای تعریفنشده بیشتری وارد شوند. این گزینه معادل دستور "EXTERN" در اسکریپت پیونددهنده است. اگر از این گزینه برای وادار کردن ماژولهای بیشتر جهت ورود به پیوند استفاده میشود، و تعریفنشده ماندن نماد یک خطا به شمار میرود، باید در عوض از گزینه --require-defined استفاده شود. - --require-defined=symbol
-
الزام میکند که symbol در فایل خروجی تعریف شده باشد. این گزینه مانند گزینه --undefined است با این تفاوت که اگر symbol در فایل خروجی تعریف نشده باشد، پیونددهنده یک خطا صادر کرده و خارج میشود. همین اثر را میتوان در یک اسکریپت پیونددهنده با استفاده همزمان از "EXTERN"، "ASSERT" و "DEFINED" به دست آورد. این گزینه میتواند چندین بار برای الزام نمادهای بیشتر استفاده شود.
- -Ur
-
برای برنامههایی که از سازندهها (constructors) یا نابودکنندهها (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، یا اگر آرگومان اختیاری الگوی عام 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
-
هنگام تبدیل فراخوانی غیرمستقیم به یک تابع تعریفشده محلی، مثلاً foo، از طریق اسلات GOT آن، فاصله پرکننده (padding) یک بایتی "NOP" را مشخص میکند. گزینه 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
-
چندین بخش بازآرایی (relocation) پویا را ترکیب کرده و مرتب میکند تا حافظه موقت (caching) جستجوی نمادهای پویا بهبود یابد. در صورت استفاده از nocombreloc این کار را انجام نمیدهد.
- common
- nocommon
-
تولید نمادهای عمومی (common symbols) با نوع 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 تولید میکند تا نشان دهد فایل شیء به اشارهگرهای تابع استاندارد (canonical) نیاز دارد و نمیتوان از آن همراه با بازآرایی کپی (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 این گزینه تنها هنگام ساخت یک شیء اشتراکی (shared object) معنا دارد. این گزینه شیء را طوری علامتگذاری میکند که مقداردهی اولیه زمان اجرای آن پیش از مقداردهی اولیه زمان اجرای هر شیء دیگری که همزمان به فرآیند وارد میشود، رخ دهد. به همین ترتیب، خاتمهسازی زمان اجرای این شیء پس از خاتمهسازی زمان اجرای سایر اشیاء رخ خواهد داد.
- 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
-
هنگام تولید یک فایل اجرایی یا کتابخانه اشتراکی، آن را طوری علامتگذاری میکند تا به بارگذار پویا اعلام شود حل فراخوانی توابع را به جای زمان بارگذاری، به زمان فراخوانی تابع (lazy binding) موکول کند. پیوند تنبل (lazy binding) حالت پیشفرض است.
- 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 تولیدشده توسط پیونددهنده را که به جای متغیرهای تعریفشده در کتابخانههای اشتراکی استفاده میشوند، غیرفعال میکند. ممکن است منجر به بازنشانیهای متن پویا شود.
- 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 را در بخش .note.gnu.property تولید میکند.
- now
-
هنگام تولید یک فایل اجرایی یا کتابخانه اشتراکی، آن را طوری علامتگذاری میکند تا به بارگذار پویا اعلام شود همه نمادها را هنگام شروع برنامه یا هنگام بارگذاری کتابخانه اشتراکی توسط dlopen حل کند، به جای اینکه حل فراخوانی توابع را به زمان اولین فراخوانی تابع موکول نماید.
- origin
-
مشخص میکند که شیء نیازمند مدیریت $ORIGIN در مسیرها است. - pack-relative-relocs
- nopack-relative-relocs
-
بازنشانی نسبی فشرده را در فایل اجرایی مستقل از موقعیت و کتابخانه اشتراکی تولید میکند. این گزینه ورودیهای "DT_RELR"، "DT_RELRSZ" و "DT_RELRENT" را به بخش پویا میافزاید. هنگام ساخت فایل اجرایی وابسته به موقعیت و خروجی قابل بازنشانی نادیده گرفته میشود. nopack-relative-relocs حالت پیشفرض است که بازنشانی نسبی فشرده را غیرفعال میکند. هنگام پیوند با GNU C Library، یک وابستگی نگارش نماد GLIBC_ABI_DT_RELR به کتابخانه اشتراکی C به خروجی افزوده میشود. در i386 و x86-64 پشتیبانی میشود.
- relro
- norelro
-
یک سرآیند بخش ELF به نام "PT_GNU_RELRO" در شیء ایجاد میکند. این گزینه بخشی از حافظه را مشخص میکند که در صورت پشتیبانی، باید پس از بازنشانی به صورت فقطخواندنی درآید. تعیین common-page-size کوچکتر از اندازه صفحه سیستم، این حفاظت را بیاثر خواهد کرد. در صورت استفاده از norelro، بخش ELF به نام "PT_GNU_RELRO" ایجاد نمیشود.
- 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
-
تعیین اندازه پشته (stack) برای یک سگمنت "PT_GNU_STACK" در ELF. تعیین مقدار صفر، ایجاد هرگونه سگمنت پیشفرض با اندازه غیرصفر "PT_GNU_STACK" را بازنویسی (override) میکند.
- 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
-
تعیین میزان دید (visibility) نماد ELF برای نمادهای ترکیبی "__start_SECNAME" و "__stop_SECNAME". مقدار value باید دقیقاً یکی از مقادیر default، internal، hidden یا protected باشد. اگر هیچ گزینه -z start-stop-visibility مشخص نشده باشد، برای سازگاری با روالهای گذشته از protected استفاده میشود. با این حال، قویاً توصیه میشود که در برنامهها و کتابخانههای اشتراکی جدید از -z start-stop-visibility=hidden استفاده شود تا این نمادها بین اشیاء اشتراکی صادر نشوند، چرا که معمولاً چنین مقصودی وجود ندارد.
- text
- notext
- textoff
-
در صورت تنظیم بودن DT_TEXTREL، یعنی اگر شیء مستقل از موقعیت یا شیء اشتراکی دارای بازنشانیهای پویا در بخشهای فقطخواندنی باشد، خطا گزارش میدهد. در صورت استفاده از notext یا textoff خطایی گزارش نمیشود.
- undefs
-
ارجاعات نمادهای حلنشده از فایلهای شیء معمولی را، چه هنگام ایجاد یک فایل اجرایی و چه هنگام ایجاد یک کتابخانه اشتراکی، گزارش نمیدهد. این گزینه معکوسِ -z defs است.
- unique-symbol
- nounique-symbol
-
جلوگیری از نامهای تکراری نمادهای محلی در جدول رشته نمادها. در صورت استفاده از unique-symbol، مقدار "."number"" به نامهای تکراری نمادهای محلی پیوست میشود. حالت پیشفرض nounique-symbol است. - x86-64-baseline
- x86-64-v2
- x86-64-v3
- x86-64-v4
-
سطح ISA معماری x86-64 مورد نیاز را در بخش .note.gnu.property مشخص میکند. x86-64-baseline مقدار "GNU_PROPERTY_X86_ISA_1_BASELINE" را تولید میکند. x86-64-v2 مقدار "GNU_PROPERTY_X86_ISA_1_V2" را تولید میکند. x86-64-v3 مقدار "GNU_PROPERTY_X86_ISA_1_V3" را تولید میکند. x86-64-v4 مقدار "GNU_PROPERTY_X86_ISA_1_V4" را تولید میکند. در Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- isa-level-report=none
- isa-level-report=all
- isa-level-report=needed
- isa-level-report=used
-
چگونگی گزارش سطوح ISA معماری x86-64 در فایلهای بازنشانیپذیر ورودی را مشخص میکند. گزینه isa-level-report=none که پیشفرض است، باعث میشود پیونددهنده سطوح ISA معماری x86-64 را در فایلهای ورودی گزارش نکند. گزینه isa-level-report=all باعث میشود پیونددهنده سطوح ISA معماری x86-64 مورد نیاز و استفادهشده در فایلهای ورودی را گزارش کند. گزینه isa-level-report=needed باعث میشود پیونددهنده سطوح ISA معماری x86-64 مورد نیاز در فایلهای ورودی را گزارش کند. گزینه isa-level-report=used باعث میشود پیونددهنده سطوح ISA معماری x86-64 استفادهشده در فایلهای ورودی را گزارش کند. در Linux/i386 و Linux/x86_64 پشتیبانی میشود.
سایر کلیدواژهها به منظور سازگاری با Solaris نادیده گرفته میشوند.
- --gnu-tls-tag
- --no-gnu-tls-tag
-
افزودن وابستگی برچسب نسخه "GLIBC_ABI_GNU_TLS" در برنامههای خروجی و کتابخانههای اشتراکی هنگام پیوند با glibc، در صورتی که فایلهای شیء بازنشانیپذیر ورودی "___tls_get_addr" را فراخوانی کنند. خروجی در زمان اجرا در صورت اجرا در کنار نسخهای از glibc که برچسب نسخه "GLIBC_ABI_GNU_TLS" را تعریف نکرده باشد، بارگیری و اجرا نخواهد شد. مگر اینکه توسط گزینه پیکربندی --disable-gnu-tls-tag در زمان ساخت پیونددهنده غیرفعال شده باشد، در صورتی که هیچ گزینهای مشخص نشده باشد، اگر ورودیها دارای فراخوانی "___tls_get_addr" باشند و libc.so برچسب نسخه "GLIBC_ABI_GNU_TLS" را تعریف کرده باشد، پیونددهنده وابستگی برچسب نسخه "GLIBC_ABI_GNU_TLS" را اضافه خواهد کرد. در Linux/i386 پشتیبانی میشود.
- --gnu2-tls-tag
- --no-gnu2-tls-tag
-
افزودن وابستگی برچسب نسخه "GLIBC_ABI_GNU2_TLS" در برنامههای خروجی و کتابخانههای اشتراکی هنگام پیوند با glibc، در صورتی که فایلهای شیء بازنشانیپذیر ورودی دارای بازنشانی "R_386_TLS_DESC_CALL" یا "R_X86_64_TLSDESC_CALL" باشند. خروجی در زمان اجرا در صورت اجرا در کنار نسخهای از glibc که برچسب نسخه "GLIBC_ABI_GNU2_TLS" را تعریف نکرده باشد، بارگیری و اجرا نخواهد شد. مگر اینکه توسط گزینه پیکربندی --disable-gnu2-tls-tag در زمان ساخت پیونددهنده غیرفعال شده باشد، در صورتی که هیچ گزینهای مشخص نشده باشد، اگر ورودیها دارای بازنشانی "R_386_TLS_DESC_CALL" یا "R_X86_64_TLSDESC_CALL" باشند و libc.so برچسب نسخه "GLIBC_ABI_GNU2_TLS" را تعریف کرده باشد، پیونددهنده وابستگی برچسب نسخه "GLIBC_ABI_GNU2_TLS" را اضافه خواهد کرد. در Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- -( archives -)
- --start-group archives --end-group
-
آرگومان archives باید فهرستی از فایلهای بایگانی باشد. اینها میتوانند نامهای صریح فایل یا گزینههای -l باشند. بایگانیهای مشخصشده به طور مکرر جستجو میشوند تا زمانی که هیچ ارجاع تعریفنشده جدیدی ایجاد نشود. در حالت عادی، یک بایگانی تنها یک بار و به ترتیبی که در خط فرمان مشخص شده است جستجو میشود. اگر نمادی در آن بایگانی برای حل یک نماد تعریفنشده که توسط شیئی در بایگانیِ بعدیِ خط فرمان ارجاع داده شده است نیاز باشد، پیونددهنده قادر به حل آن ارجاع نخواهد بود. با گروهبندی بایگانیها، همه آنها به طور مکرر جستجو میشوند تا زمانی که تمام ارجاعات ممکن برطرف گردند. استفاده از این گزینه هزینه عملکردی قابل توجهی دارد. بهتر است تنها زمانی استفاده شود که ارجاعات متقابل و مدورِ اجتنابناپذیری میان دو یا چند بایگانی وجود دارد.
- --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 رفتار پیشفرض را بازیابی میکند. نکته: در سیستمهای مبتنی بر Linux گزینه --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 را ببینید.
- --dynamic-list-data
-
شامل کردن تمام نمادهای دادهای سراسری در فهرست پویا.
- --dynamic-list-cpp-new
-
فهرست پویای توکار را برای عملگرهای new و delete در ++C ارائه میدهد. این گزینه عمدتاً برای ساخت libstdc++ مشترک کاربرد دارد.
- --dynamic-list-cpp-typeinfo
-
فهرست پویای توکار را برای شناسایی نوع زمان اجرا در ++C ارائه میدهد.
- --check-sections
- --no-check-sections
-
از پیونددهنده میخواهد که پس از تخصیص آدرسهای بخشها، وجود همپوشانی میان آنها را بررسی نکند. پیونددهنده بهطور معمول این بررسی را انجام میدهد و در صورت یافتن هرگونه همپوشانی، پیامهای خطای مناسبی تولید میکند. پیونددهنده بخشهای درون روکشها (overlays) را میشناسد و آنها را در نظر میگیرد. رفتار پیشفرض را میتوان با استفاده از کلید خط فرمان --check-sections بازیابی کرد. همپوشانی بخشها معمولاً برای پیوندهای با قابلیت جابهجایی بررسی نمیشود. شما میتوانید در آن حالت با استفاده از گزینهٔ --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
-
این گزینه از تخصیص آدرس به نمادهای مشترک (common) جلوگیری میکند. دستور اسکریپت "INHIBIT_COMMON_ALLOCATION" نیز همین اثر را دارد. گزینهٔ --no-define-common اجازه میدهد تا تصمیم تخصیص آدرس به نمادهای مشترک از انتخاب نوع فایل خروجی تفکیک شود؛ در غیر این صورت یک نوع خروجی غیرقابلجابهجایی، تخصیص آدرس به نمادهای مشترک را اجباری میکند. استفاده از --no-define-common این امکان را فراهم میسازد که نمادهای مشترک ارجاعشده از یک کتابخانهٔ مشترک، فقط در برنامهٔ اصلی آدرسدهی شوند. این کار فضای تکراری بلااستفاده در کتابخانهٔ مشترک را حذف کرده، و همچنین از هرگونه سردرگمی احتمالی ناشی از حل شدن به نسخهٔ تکراری اشتباه در زمان وجود چندین ماژول پویا با مسیرهای جستجوی تخصصی برای حل نماد زمان اجرا جلوگیری میکند. - --force-group-allocation
-
این گزینه باعث میشود که پیونددهنده اعضای گروه بخش (section group) را مانند بخشهای ورودی عادی قرار داده و گروههای بخش را حذف کند. این رفتار، رفتار پیشفرض برای یک پیوند نهایی است اما میتوان از این گزینه برای تغییر رفتار یک پیوند با قابلیت جابهجایی (-r) استفاده کرد. دستور اسکریپت "FORCE_GROUP_ALLOCATION" نیز اثر مشابهی دارد..IP --defsym=symbol=expression 4 یک نماد سرتاسری (global symbol) در فایل خروجی ایجاد میکند که حاوی آدرس مطلقی است که توسط expression مشخص شده است. میتوانید این گزینه را به هر تعداد بار که برای تعریف چندین نماد در خط فرمان لازم است استفاده کنید. در این زمینه، شکل محدودی از محاسبات برای expression پشتیبانی میشود: میتوانید یک ثابت هگزادسیمال یا نام یک نماد موجود را وارد کنید، یا از "+" و "-" برای جمع یا تفریق ثابتهای هگزادسیمال یا نمادها بهره ببرید. اگر به عبارتهای پیچیدهتری نیاز دارید، استفاده از زبان دستورات پیونددهنده از طریق یک اسکریپت را مد نظر قرار دهید. نکته: نباید هیچ فاصلهای بین symbol، علامت مساوی ("=")، و expression وجود داشته باشد. پیونددهنده آرگومانهای --defsym و -T را به ترتیب پردازش میکند؛ قرار دادن --defsym پیش از -T نماد را پیش از پردازش اسکریپت پیونددهنده مشخصشده با -T تعریف خواهد کرد، در حالی که قرار دادن --defsym پس از -T نماد را پس از پردازش اسکریپت پیونددهنده تعریف میکند. این تفاوت روی عبارتهایی در اسکریپت پیونددهنده که از نمادهای --defsym استفاده میکنند پیامدهایی دارد؛ اینکه کدام ترتیب درست است به هدف مورد نظر شما بستگی دارد.
- --demangle[=style]
- --no-demangle
-
این گزینهها کنترل میکنند که آیا نام نمادها در پیامهای خطا و سایر خروجیها رمزگشایی (demangle) شوند یا خیر. وقتی به پیونددهنده گفته میشود رمزگشایی کند، تلاش میکند نام نمادها را به شیوهای خوانا ارائه دهد: زیرخطهای (underscores) ابتدایی را در صورتی که توسط قالب فایل شیء استفاده شده باشند حذف میکند، و نامهای درهمریخته (mangled) زبان C++ را به نامهای خوانا برای کاربر تبدیل مینماید. کامپایلرهای مختلف شیوههای درهمریزی متفاوتی دارند. از آرگومان اختیاری شیوه رمزگشایی میتوان برای انتخاب شیوه مناسب برای کامپایلر خود استفاده کرد. پیونددهنده بهطور پیشفرض رمزگشایی را انجام میدهد مگر اینکه متغیر محیطی COLLECT_NO_DEMANGLE تنظیم شده باشد. این گزینهها میتوانند برای بازنویسی این رفتار پیشفرض استفاده شوند.
- -Ifile
- --dynamic-linker=file
-
نام پیونددهنده پویا (dynamic linker) را تعیین میکند. این گزینه فقط هنگام تولید فایلهای اجرایی ELF با پیوند پویا معنادار است. پیونددهنده پویای پیشفرض معمولاً درست است؛ از این گزینه استفاده نکنید مگر اینکه بدانید چه کار میکنید.
- --no-dynamic-linker
-
هنگام تولید یک فایل اجرایی، درخواست استفاده از یک پیونددهنده پویا در زمان بارگذاری (load-time) را حذف میکند. این فقط برای فایلهای اجرایی ELF که حاوی بازنشانیهای پویا (dynamic relocations) هستند معنادار است و معمولاً به کد نقطه ورود (entry point) نیاز دارد که قادر به پردازش این بازنشانیها باشد.
- --embedded-relocs
-
این گزینه مشابه گزینه --emit-relocs است با این تفاوت که بازنشانیها در بخشی مختص به هدف (target-specific section) ذخیره میشوند. این گزینه فقط توسط اهداف 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 فعال است، این گزینه از جمعآوری زباله بخشهای ورودی استفادهنشدهای که شامل نمادهای سرتاسری با قابلیت دید پیشفرض یا محافظتشده (default or protected 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 ./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
- ارجاعات
نمادهای
حلنشده را
از
فایلهای
شیء معمولی
گزارش
میدهد. این
کار حتی اگر
پیونددهنده
در حال
ایجاد یک
کتابخانه
اشتراکی
غیرنمادین
(non-symbolic) باشد نیز
انجام
میشود.
سوییچ
--[no-]allow-shlib-undefined
رفتار
گزارشدهی
ارجاعات
حلنشده
موجود در
کتابخانههای
اشتراکی
پیوند داده
شده را
کنترل
میکند.
اثرات این گزینه را میتوان با استفاده از "-z undefs" بازگرداند.
- --allow-multiple-definition
- -z muldefs
- بهطور معمول هنگامی که یک نماد چندین بار تعریف شده باشد، پیونددهنده یک خطای مهلک گزارش میدهد. این گزینهها تعاریف چندگانه را مجاز میدانند و نخستین تعریف استفاده خواهد شد.
- --allow-shlib-undefined
- --no-allow-shlib-undefined
- نمادهای
تعریفنشده
در
کتابخانههای
اشتراکی را
مجاز یا
غیرمجاز
میکند. این
سوییچ
مشابه --no-undefined
است با این
تفاوت که
رفتار
مربوط به
زمان قرار
داشتن
نمادهای
تعریفنشده
در یک
کتابخانه
اشتراکی را
به جای یک
فایل شیء
معمولی
تعیین
میکند. این
گزینه بر
نحوه
مدیریت
نمادهای
تعریفنشده
در
فایلهای
شیء معمولی
تأثیری
ندارد.
رفتار پیشفرض این است که اگر پیونددهنده برای ایجاد یک فایل اجرایی استفاده شود، برای هر نماد تعریفنشده ارجاعشده در کتابخانههای اشتراکی خطا گزارش دهد، اما اگر پیونددهنده برای ایجاد یک کتابخانه اشتراکی به کار رود، آنها را مجاز میشمارد.
دلایل مجاز بودن ارجاعات نمادهای تعریفنشده در کتابخانههای اشتراکی مشخصشده هنگام پیوند این است که:
- ممکن است کتابخانه اشتراکی مشخصشده در زمان پیوند با کتابخانه موجود در زمان بارگذاری یکسان نباشد، بنابراین نماد ممکن است در زمان بارگذاری واقعاً قابل حل باشد.
- برخی
سیستمعاملها
مانند BeOS و HPPA
وجود دارند
که نمادهای
تعریفنشده
در
کتابخانههای
اشتراکی در
آنها امری
عادی است.
برای نمونه، هسته BeOS در زمان بارگذاری، کتابخانههای اشتراکی را وصله میکند تا هر تابعی را که برای معماری فعلی مناسبتر است انتخاب کند. این کار مثلاً برای انتخاب پویای تابع مناسب memset استفاده میشود.
- --error-handling-script=scriptname
- در صورت
ارائه این
گزینه،
پیونددهنده
در زمان
مواجهه با
هر خطایی،
scriptname را
فراخوانی
میکند.
البته در
حال حاضر
تنها دو نوع
خطا
پشتیبانی
میشوند:
نمادهای
مفقود و
کتابخانههای
مفقود. دو
آرگومان به
اسکریپت
ارسال
میشود:
کلیدواژه
"undefined-symbol" یا `missing-lib" و
name نماد
تعریفنشده
یا
کتابخانه
مفقود. هدف
این است که
اسکریپت
پیشنهادهایی
به کاربر
ارائه دهد
که نماد یا
کتابخانه
ممکن است در
کجا پیدا
شوند. پس از
پایان
اجرای
اسکریپت،
پیام خطای
معمول
پیونددهنده
نمایش داده
خواهد شد.
در دسترس بودن این گزینه توسط یک سوییچ در زمان پیکربندی کنترل میشود، بنابراین ممکن است در برخی پیادهسازیهای خاص وجود نداشته باشد.
- --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
- یک فایل اجرایی مستقل از موقعیت (PIE) ایجاد میکند. این ویژگی در حال حاضر فقط روی پلتفرمهای ELF پشتیبانی میشود. فایلهای اجرایی مستقل از موقعیت توسط پیونددهنده پویا به آدرس مجازیای که سیستمعامل برای آنها انتخاب میکند منتقل (relocate) میشوند، آدرسی که میتواند بین هر بار فراخوانی متغیر باشد. آنها در سرآیند فایل ELF با عنوان ET_DYN علامتگذاری میشوند، اما از جنبههای مختلفی با کتابخانههای اشتراکی تفاوت دارند. بهویژه، نمادهای تعریفشده در یک PIE بهطور پیشفرض نمیتوانند مانند کتابخانههای اشتراکی توسط شیء دیگری بازنویسی و جایگزین شوند.
- -no-pie
- یک فایل اجرایی وابسته به موقعیت ایجاد میکند. این حالت پیشفرض است.
- -qmagic
- این گزینه به منظور سازگاری با لینوکس نادیده گرفته میشود.
- -Qy
- این گزینه به منظور سازگاری با SVR4 نادیده گرفته میشود.
- --relax
- --no-relax
- گزینهای
با اثرات
وابسته به
ماشین. این
گزینه فقط
روی تعداد
محدودی از
اهداف
پشتیبانی
میشود.
در برخی پلتفرمها، گزینه --relax بهینهسازیهای سراسری و مختص هدف را انجام میدهد که با حل آدرسدهیها در برنامه توسط پیونددهنده امکانپذیر میشوند؛ مانند سادهسازی حالتهای آدرسدهی، ترکیب و ساخت دستورالعملهای جدید، انتخاب نسخههای کوتاهتر دستورالعملهای موجود و ترکیب مقادیر ثابت.
در برخی پلتفرمها، این بهینهسازیهای سراسری در زمان پیوند ممکن است اشکالزدایی نمادین فایل اجرایی حاصل را غیرممکن سازد. مشخص شده است که این مورد برای خانواده پردازندههای Matsushita MN10200 و MN10300 صادق است.
در پلتفرمهایی که این ویژگی پشتیبانی میشود، گزینه --no-relax آن را غیرفعال خواهد کرد.
در پلتفرمهایی که این ویژگی پشتیبانی نمیشود، هر دو گزینه --relax و --no-relax پذیرفته میشوند، اما نادیده گرفته خواهند شد.
- --retain-symbols-file=filename
- تنها
نمادهای
فهرستشده
در فایل filename
را نگه
میدارد و
بقیه را دور
میاندازد.
filename صرفاً یک
فایل متنی
ساده است که
در هر خط آن
یک نام نماد
قرار دارد.
این گزینه
بهویژه در
محیطهایی
(مانند VxWorks) که
در آنها یک
جدول نماد
سراسری
بزرگ به
مرور
انباشته
میشود،
برای
صرفهجویی
در حافظه
زمان اجرا
مفید است.
گزینه --retain-symbols-file نمادهای تعریفنشده یا نمادهای مورد نیاز برای بازآراییها را دور نمیاندازد.
شما فقط یک بار در خط فرمان مجاز به مشخص کردن --retain-symbols-file هستید. این گزینه بر -s و -S اولویت دارد..IP -rpath=dir 4 افزودن یک دایرکتوری به مسیر جستجوی کتابخانهها در زمان اجرا (runtime). این گزینه هنگام پیوند دادن یک فایل اجرایی ELF با اشیاء مشترک (shared objects) به کار میرود. تمام آرگومانهای -rpath به یکدیگر متصل شده و به پیونددهنده زمان اجرا منتقل میشوند، که از آنها برای یافتن اشیاء مشترک در زمان اجرا استفاده میکند.
گزینهٔ -rpath همچنین هنگام یافتن اشیاء مشترکی که توسط اشیاء مشترک صراحتاً گنجاندهشده در پیوند مورد نیاز هستند نیز استفاده میشود؛ به توضیحات گزینهٔ -rpath-link مراجعه کنید. جستجوی -rpath به این روش تنها توسط پیونددهندههای بومی (native) و پیونددهندههای متقاطع (cross linkers) که با گزینهٔ --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-relocatable) با چنین وابستگیای مواجه شود، در صورتی که کتابخانه صراحتاً اضافه نشده باشد، بهطور خودکار تلاش میکند تا کتابخانهٔ مشترک مورد نیاز را یافته و در پیوند بگنجاند. در چنین حالتی، چندین دایرکتوری همانگونه که در زیر شرح داده شده جستجو میشوند. گزینهٔ -rpath-link نخستین مجموعه از دایرکتوریها را برای جستجو مشخص میکند. این گزینه میتواند دنبالهای از نامهای دایرکتوری را چه با ارائهٔ فهرستی از نامهای جدا شده با دونقطه (:) یا با تکرار چندینبارهٔ گزینه مشخص کند.
نشانههای $ORIGIN و $LIB میتوانند در این دایرکتوریهای جستجو ظاهر شوند. آنها در مورد $ORIGIN با مسیر کامل دایرکتوری حاوی برنامه یا شیء مشترک، و در مورد $LIB با lib - برای باینریهای ۳۲ بیتی - یا lib64 - برای باینریهای ۶۴ بیتی - جایگزین خواهند شد.
شکل جایگزین این نشانهها - ${ORIGIN} و ${LIB} - نیز میتواند مورد استفاده قرار گیرد. نشانهٔ $PLATFORM پشتیبانی نمیشود.
گزینهٔ --rpath-link باید با احتیاط استفاده شود، چرا که مسیر جستجویی را که ممکن است درون یک کتابخانهٔ مشترک بهصورت سخت کد شده باشد (hard compiled) بازنویسی میکند. در چنین حالتی ممکن است بهطور ناخواسته از مسیر جستجویی متفاوت با آنچه پیونددهنده زمان اجرا استفاده میکرد، استفاده شود.
هنگامی که کتابخانههای مشترک اضافی مورد نیاز باشند، پیونددهنده دایرکتوریها را به ترتیبی که در زیر فهرست شده برای یافتن آنها جستجو میکند. با این حال توجه داشته باشید که این موضوع تنها برای کتابخانههای اضافیِ لازم برای برآورده کردن نیازهای کتابخانههای مشترک قبلاً گنجاندهشده اعمال میشود. این مورد شامل کتابخانههایی که از طریق گزینهٔ خط فرمان -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.
- برای پیونددهنده در یک سامانهٔ Linux، در صورت وجود فایل /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" در یک اسکریپت پیونددهندهٔ پیشفرض.
با این حال توجه داشته باشید که در سامانههای مبتنی بر Linux یک هشدار دیگر نیز وجود دارد: اگر گزینهٔ --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 اشیای اشتراکی 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 با + آغاز شود، فایل به جای حالت بازنویسی در حالت الحاق (append mode) باز میشود.
در صورتی که گزینه -Map فعال شده باشد، اطلاعات در فایل نگاشت (map file) نیز ثبت میشود. نکته: اگر به هر دو گزینه --stats و -Map آرگومانهای filename داده شود و مقدار آنها یکسان باشد، اطلاعات تنها یک بار نوشته خواهد شد نه دو بار.
اگر متغیر محیطی "LD_STATS" تعریف شده باشد، مانند گزینه --stats رفتار میکند. اگر مقدار متغیر یک رشته باشد، از آن به عنوان نام فایلی که اطلاعات باید در آن ثبت شود استفاده خواهد شد. در غیر این صورت اطلاعات به جریان خروجی استاندارد ارسال میشود. استفاده از این متغیر محیطی امکان ثبت آمار را بدون نیاز به تغییر خط فرمان پیونددهنده فراهم میکند. نکته: اگر هم متغیر محیطی و هم گزینه --stats استفاده شوند، گزینه --stats اولویت خواهد داشت.
اطلاعات گسترشیافته گزارششده شامل زمان پردازنده (cpu time) مصرفی است و اگر فراخوانی کتابخانهای سیستمی 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 استفاده میشود که در آن همه نمادهای سراسری (global) به ایستا (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
- هنگامی که
یک نماد
عمومی (common symbol) با
یک نماد
عمومی دیگر
یا با تعریف
یک نماد
ترکیب شود،
هشدار
میدهد.
پیونددهندههای
Unix این عمل تا
حدی
سهلانگارانه
را مجاز
میدانند،
اما
پیونددهندهها
در برخی
سیستمعاملهای
دیگر این
کار را
انجام
نمیدهند.
این گزینه
به شما
اجازه
میدهد
مشکلات
بالقوهٔ
ناشی از
ترکیب
نمادهای
سراسری را
بیابید.
متأسفانه
برخی از
کتابخانههای
C از این
شیوه
استفاده
میکنند،
بنابراین
ممکن است
هشدارهایی
دربارهٔ
نمادهای
درون
کتابخانهها
و همچنین
برنامههای
خود دریافت
کنید.
سه نوع نماد سراسری وجود دارد که در اینجا با مثالهای C نشان داده شدهاند:
- int i = 1;
- یک تعریف، که در بخش دادههای مقداردهیشدهٔ (initialized data) فایل خروجی قرار میگیرد.
- extern int i;
- یک ارجاع تعریفنشده، که فضایی را تخصیص نمیدهد. باید در جایی یا یک تعریف و یا یک نماد عمومی برای این متغیر وجود داشته باشد.
- int i;
- یک نماد عمومی. اگر برای یک متغیر تنها (یک یا چند) نماد عمومی وجود داشته باشد، در ناحیهٔ دادههای مقداردهینشدهٔ (uninitialized data) فایل خروجی قرار میگیرد. پیونددهنده چندین نماد عمومی برای یک متغیر یکسان را در یک نماد واحد ادغام میکند. اگر اندازههای آنها متفاوت باشد، بزرگترین اندازه را برمیگزیند. اگر تعریفی از همان متغیر وجود داشته باشد، پیونددهنده نماد عمومی را به یک اعلان تبدیل میکند.
گزینهٔ --warn-common میتواند پنج نوع هشدار تولید کند. هر هشدار از یک جفت خط تشکیل میشود: خط اول نمادی را که بهتازگی مشاهده شده توصیف میکند، و خط دوم نماد پیشین با همان نام را شرح میدهد. یک یا هر دوی این نمادها، یک نماد عمومی خواهند بود.
- 1.
- تبدیل یک
نماد عمومی
به یک
ارجاع،
زیرا از پیش
تعریفی
برای این
نماد وجود
دارد.
<file>(<section>): warning: common of `<symbol>' overridden by definition <file>(<section>): warning: defined here
- 2.
- تبدیل یک
نماد عمومی
به یک
ارجاع،
زیرا
تعریفی
برای این
نماد در
ادامه
مشاهده شده
است. این
مورد
همانند
حالت پیشین
است، به جز
اینکه
نمادها با
ترتیب
متفاوتی
مشاهده
شدهاند.
<file>(<section>): warning: definition of `<symbol>' overriding common <file>(<section>): warning: common is here
- 3.
- ادغام یک
نماد عمومی
با یک نماد
عمومی
پیشینِ
هماندازه.
<file>(<section>): warning: multiple common of `<symbol>' <file>(<section>): warning: previous common is here
- 4.
- ادغام یک
نماد عمومی
با یک نماد
عمومی
پیشینِ
بزرگتر.
<file>(<section>): warning: common of `<symbol>' overridden by larger common <file>(<section>): warning: larger common is here
- 5.
- ادغام یک
نماد عمومی
با یک نماد
عمومی
پیشینِ
کوچکتر.
این مورد
همانند
حالت پیشین
است، به جز
اینکه
نمادها با
ترتیب
متفاوتی
مشاهده
شدهاند.
<file>(<section>): warning: common of `<symbol>' overriding smaller common <file>(<section>): warning: smaller common is here
- --warn-constructors
- اگر از هرگونه سازندهٔ سراسری (global constructor) استفاده شود، هشدار میدهد. این گزینه تنها برای تعداد کمی از قالبهای فایل شیء مفید است. برای قالبهایی مانند COFF یا ELF، پیونددهنده نمیتواند استفاده از سازندههای سراسری را تشخیص دهد.
- --warn-execstack
- --warn-execstack-objects
- --no-warn-execstack
- در بسترهای ELF اگر از پیونددهنده خواسته شود که یک فایل خروجیِ حاوی پشتهٔ قابل اجرا (executable stack) ایجاد کند، ممکن است پیامهای هشدار تولید نماید. سه حالت ممکن وجود دارد:
- 1.
- هیچ هشداری تولید نکند.
- 2.
- همیشه هشدار تولید کند، حتی اگر پشتهٔ قابل اجرا از طریق گزینهٔ خط فرمان -z execstack درخواست شده باشد.
- 3.
- تنها در صورتی هشدار تولید کند که یک فایل شیء درخواست پشتهٔ قابل اجرا داده باشد، اما در صورت استفاده از گزینهٔ -z execstack هشداری صادر نکند.
حالت پیشفرض بستگی به نحوهٔ پیکربندی پیونددهنده در زمان ساخت آن دارد. گزینهٔ --no-warn-execstack همیشه پیونددهنده را در حالت بدون هشدار قرار میدهد. گزینهٔ --warn-execstack پیونددهنده را در حالت همیشه هشدار میگذارد. گزینهٔ --warn-execstack-objects پیونددهنده را در حالت هشدار فقط برای فایلهای شیء قرار میدهد.
نکته: فایلهای ورودی با قالب ELF میتوانند از طریق داشتن یک بخش .note.GNU-stack که بیت اجرایی در پرچمهای بخش آن تنظیم شده باشد، اعلام کنند که به پشتهٔ قابل اجرا نیاز دارند. آنها همچنین میتوانند با داشتن همان بخش بدون تنظیم بودن بیت پرچم اجرایی، مشخص کنند که نیازی به پشتهٔ قابل اجرا ندارند. اگر یک فایل ورودی دارای بخش .note.GNU-stack نباشد، رفتار پیشفرض وابسته به معماری مقصد (target) است. برای برخی مقصدها، نبودِ چنین بخشی بدین معناست که پشتهٔ قابل اجرا لازم است. این موضوع معمولاً برای فایلهای دستنویس زبان اسمبلی مشکلساز میشود.
- --error-execstack
- --no-error-execstack
- اگر
پیونددهنده
قصد تولید
پیام
هشداری در
مورد یک
پشتهٔ قابل
اجرا داشته
باشد،
گزینهٔ --error-execstack
آن هشدار را
در عوض به
یک خطا
تبدیل
خواهد کرد.
توجه داشته
باشید که
این گزینه
وضعیت
تولید
هشدار execstack
پیونددهنده
را تغییر
نمیدهد.
برای تنظیم
یک حالت
هشدار خاص،
از --warn-execstack یا
--warn-execstack-objects
استفاده
کنید.
گزینهٔ --no-error-execstack رفتار پیشفرضِ تولید پیامهای هشدار را بازیابی میکند.
- --warn-multiple-gp
- اگر مقادیر چندگانه برای اشارهگر سراسری (global pointer) در فایل خروجی نیاز باشد، هشدار میدهد. این گزینه تنها برای پردازندههای خاصی معنادار است، مانند پردازندهٔ Alpha. بهطور خاص، برخی پردازندهها ثابتهای بزرگمقدار را در یک بخش ویژه قرار میدهند. یک ثبات خاص (اشارهگر سراسری یا global pointer) به میانهٔ این بخش اشاره میکند، تا ثوابت بتوانند بهطور کارآمد از طریق حالت آدرسدهی نسبی به ثبات پایه بارگذاری شوند. از آنجا که آفست در حالت نسبی به ثبات پایه ثابت و نسبتاً کوچک است (مثلاً ۱۶ بیت)، این امر حداکثر اندازهٔ مخزن ثوابت (constant pool) را محدود میکند. بنابراین، در برنامههای بزرگ، اغلب لازم است که از چندین مقدار اشارهگر سراسری استفاده شود تا بتوان تمام مقادیر ثابت ممکن را آدرسدهی نمود. این گزینه باعث صدور هشدار در هر زمانی که این حالت پیش آید میشود.
- --warn-once
- برای هر نماد تعریفنشده تنها یک بار هشدار میدهد، نه یک بار به ازای هر ماژولی که به آن ارجاع دارد.
- --warn-rwx-segments
- --no-warn-rwx-segments
- هشدار
میدهد اگر
پیونددهنده
یک قطعهٔ (segment)
قابل
بارگذاری و
با اندازهٔ
غیرصفر
ایجاد کند
که هر سه
پرچم
دسترسی
خواندن،
نوشتن و
اجرا در آن
تنظیم شده
باشند. چنین
قطعهای
نشاندهندهٔ
یک
آسیبپذیری
امنیتی
بالقوه است.
علاوه بر
این، اگر یک
قطعهٔ
ذخیرهسازی
محلی رشته (TLS
یا thread local storage) با
پرچم مجوز
اجرا ایجاد
شود،
صرفنظر از
اینکه
پرچمهای
خواندن و/یا
نوشتن
تنظیم شده
باشند یا
خیر،
هشدارهایی
تولید
خواهند شد.
این هشدارها بهطور پیشفرض فعال هستند. میتوان آنها را از طریق گزینهٔ --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
- یک تابع
پوشاننده (wrapper)
برای 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" برای بخش کلاسیک ELF با نام ".hash"، یا "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) که
حدود ۴۰٪
حافظهٔ
بیشتری را
برای
ذخیرهسازی
نمادها
مصرف
میکند.
اثر دیگر این سوئیچ، تنظیم اندازهٔ پیشفرض جدول درهمسازی روی 1021 است که بار دیگر به بهای افزایش زمان اجرای پیونددهنده در مصرف حافظه صرفهجویی میکند. البته در صورتی که از سوئیچ --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". محتویات این نوت مطابق با مشخصات متاداده بسته (package metadata specification) با قالب JSON است. برای اطلاعات بیشتر ببینید: https://systemd.io/ELF_PACKAGE_METADATA آرگومان JSON از percent-encoding و کدگذاری بر اساس %[string] (که در آن string به نام در Named Character References استاندارد 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، مانند نمایشدهندههای فایل و دامپرها، خروجی گمراهکنندهای ایجاد کنند. با این حال، GDB برای یافتن بخشهای اطلاعات اشکالزدایی Dwarf-2 در یک تصویر اجرایی در زمان اجرا، به استفاده از نامهای بخش طولانی PE متکی است؛ بنابراین اگر هیچکدام از این دو گزینه در خط فرمان مشخص نشود، چنانچه ld هنگام پیوند یک تصویر اجرایی بدون حذف نمادها (not stripping symbols) متوجه وجود اطلاعات اشکالزدایی شود، با نادیده گرفتن رفتار پیشفرض و از نظر فنی درست، نامهای بخش طولانی را فعال میکند. [این گزینه برای تمام پورتهای هدف PE پیونددهنده معتبر است]
- --enable-stdcall-fixup
- --disable-stdcall-fixup
- اگر در حین پیوند نمادی پیدا شود که نتوان آن را برطرف (resolve) کرد، با جستجوی نماد تعریفشده دیگری که تفاوت آن تنها در قالب نام نماد است (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 یا بهطور ضمنی از طریق ویژگیهای تابع (function attributes) صادر میشوند، پیشفرض این است که هیچ چیز دیگری صادر نشود، مگر اینکه این گزینه مشخص شده باشد. توجه داشته باشید که نمادهای "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
- همترازی فایل را مشخص میکند. بخشهای درون فایل همیشه در آفستهایی از فایل شروع میشوند که مضربی از این عدد باشند. مقدار پیشفرض آن 512 است. [این گزینه مخصوص پورت هدف 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
- شماره اصلی "image version" را تنظیم میکند. پیشفرض آن 1 است. [این گزینه مخصوص پورت هدف i386 PE پیونددهنده است]
- --major-os-version value
- شماره اصلی "os version" را تنظیم میکند. پیشفرض آن 4 است. [این گزینه مخصوص پورت هدف i386 PE پیونددهنده است]
- --major-subsystem-version value
- شماره اصلی "subsystem version" را تنظیم میکند. پیشفرض آن 4 است. [این گزینه مخصوص پورت هدف i386 PE پیونددهنده است]
- --minor-image-version value
- شماره فرعی "image version" را تنظیم میکند. پیشفرض آن 0 است. [این گزینه مخصوص پورت هدف i386 PE پیونددهنده است]
- --minor-os-version value
- شماره فرعی "os version" را تنظیم میکند. پیشفرض آن 0 است. [این گزینه مخصوص پورت هدف i386 PE پیونددهنده است]
- --minor-subsystem-version value
- شماره فرعی "subsystem version" را تنظیم میکند. پیشفرض آن 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)، اولویت جستجو را به جای "lib<basename>.dll" به "<string><basename>.dll" بده. این رفتار امکان تفکیک آسان DLLهای ساختهشده برای «زیرپلتفرمهای» مختلف را فراهم میآورد: native، cygwin، uwin، pw و غیره. برای نمونه، DLLهای cygwin معمولاً از "--dll-search-prefix=cyg" استفاده میکنند. [این گزینه مختص پورت هدفگیریشده i386 PE پیونددهنده است]
- --enable-auto-import
- پیوند
پیشرفته
"_symbol" به
"__imp__symbol" را
برای
واردات
داده (DATA) از
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، و همچنین استفاده از یک نمایه (index) ثابت برای متغیر آرایهای واردشده از یک 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
- تلاشی برای پیوند پیشرفته "_symbol" به "__imp__symbol" جهت واردات داده (DATA) از DLLها انجام نده. [این گزینه مختص پورت هدفگیریشده i386 PE پیونددهنده است]
- --enable-runtime-pseudo-reloc
- اگر کد شما حاوی عبارتهای شرحدادهشده در بخش --enable-auto-import باشد، یعنی واردات DATA از DLL با آفست غیرصفر، این سوییچ برداری از «بازنشانیهای شبه زمان اجرا» ('runtime pseudo relocations') ایجاد میکند که میتواند توسط محیط زمان اجرا برای تنظیم ارجاعات به چنین دادههایی در کد کلاینت شما استفاده شود. [این گزینه مختص پورت هدفگیریشده i386 PE پیونددهنده است]
- --disable-runtime-pseudo-reloc
- برای واردات DATA با آفست غیرصفر از DLLها، بازنشانیهای شبه (pseudo relocations) ایجاد نکن. [این گزینه مختص پورت هدفگیریشده i386 PE پیونددهنده است]
- --enable-extra-pe-debug
- اطلاعات اشکالزدایی بیشتری را در رابطه با thunking نمادهای auto-import نمایش بده. [این گزینه مختص پورت هدفگیریشده i386 PE پیونددهنده است]
- --section-alignment
- همترازی بخشها (section alignment) را تعیین میکند. بخشها در حافظه همواره از آدرسهایی آغاز خواهند شد که مضربی از این عدد باشند. پیشفرض 0x1000 است. [این گزینه مختص پورت هدفگیریشده i386 PE پیونددهنده است]
- --stack reserve
- --stack reserve,commit
- تعداد بایتهای حافظه را جهت رزرو کردن (و بهطور اختیاری اختصاص دادن/commit) برای استفاده به عنوان پشته (stack) این برنامه مشخص کنید. پیشفرض ۲ مگابایت رزروشده و ۴ کیلوبایت اختصاصیافته (committed) است. [این گزینه مختص پورت هدفگیریشده 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) بازنشانی (relocate) شود. این ویژگی با MS Windows Vista برای مقصدهای i386 PE معرفی شد. این گزینه به طور پیشفرض برای مقصدهای MinGW فعال است، اما میتوان آن را از طریق گزینه --disable-dynamicbase غیرفعال کرد. این گزینه همچنین به طور ضمنی مستلزم --enable-reloc-section است.
- --forceinteg
- --disable-forceinteg
- بررسیهای یکپارچگی کد اجباری میشوند. این گزینه به طور پیشفرض غیرفعال است.
- --nxcompat
- --disable-nxcompat
- تصویر با «پیشگیری از اجرای داده» (Data Execution Prevention یا DEP) سازگار است. این ویژگی با MS Windows XP SP2 برای مقصدهای i386 PE معرفی شد. این گزینه به طور پیشفرض برای مقصدهای MinGW فعال است.
- --no-isolation
- --disable-no-isolation
- اگرچه تصویر جداسازی (isolation) را درک میکند، اما تصویر را جدا نکنید. این گزینه به طور پیشفرض غیرفعال است.
- --no-seh
- --disable-no-seh
- تصویر از SEH استفاده نمیکند. هیچ گرداننده SE نباید از این تصویر فراخوانی شود. این گزینه به طور پیشفرض غیرفعال است.
- --no-bind
- --disable-no-bind
- این تصویر را مقید نکنید (bind انجام نشود). این گزینه به طور پیشفرض غیرفعال است.
- --wdmdriver
- --disable-wdmdriver
- درایور از مدل راهانداز ویندوز مایکروسافت (MS Windows Driver Model) استفاده میکند. این گزینه به طور پیشفرض غیرفعال است.
- --tsaware
- --disable-tsaware
- تصویر از سرور ترمینال (Terminal Server) آگاه است. این گزینه به طور پیشفرض غیرفعال است.
- --insert-timestamp
- --no-insert-timestamp
- یک برچسب
زمانی
واقعی در
تصویر درج
شود. این
رفتار
پیشفرض
است زیرا با
کدهای
موروثی
مطابقت
دارد و به
این معنی
است که
تصویر با
ابزارهای
دیگر و
اختصاصی
کار خواهد
کرد. مشکل
این رفتار
پیشفرض
این است که
هر بار که
سورسهای
یکسان
پیوند داده
میشوند،
تصاویری
اندکی
متفاوت
تولید
خواهند شد.
گزینه --no-insert-timestamp
میتواند
برای درج
مقدار صفر
برای برچسب
زمانی
استفاده
شود، که
اطمینان
میدهد
فایلهای
باینری
تولید شده
از
سورسهای
یکسان
کاملاً با
یکدیگر
تطابق
دارند.
اگر --insert-timestamp فعال باشد، زمان درج شده یا زمانی است که پیونددهی رخ میدهد یا اگر متغیر محیطی "SOURCE_DATE_EPOCH" تعریف شده باشد، تعداد ثانیههای گذشته از مبدا زمانی یونیکس (Unix epoch) طبق آنچه توسط آن متغیر مشخص شده است خواهد بود.
- --enable-reloc-section
- --disable-reloc-section
- ایجاد جدول بازنشانی پایه، که در صورتی لازم است که تصویر در پایهای متفاوت از آنچه در سرآیند PE مشخص شده بارگذاری شود. این گزینه به طور پیشفرض فعال است.
مقصد C6X uClinux از یک قالب باینری به نام DSBT برای پشتیبانی از کتابخانههای مشترک استفاده میکند. هر کتابخانه مشترک در سیستم باید یک شاخص یکتا داشته باشد؛ تمام فایلهای اجرایی از شاخص 0 استفاده میکنند.
- --dsbt-size size
- این گزینه تعداد ورودیهای جدول DSBT از فایل اجرایی یا کتابخانه مشترک فعلی را روی size تنظیم میکند. پیشفرض، ساخت جدولی با ۶۴ ورودی است.
- --dsbt-index index
- این گزینه
شاخص DSBT فایل
اجرایی یا
کتابخانه
مشترک فعلی
را روی index
تنظیم
میکند.
پیشفرض 0
است که برای
تولید
فایلهای
اجرایی
مناسب است.
اگر یک
کتابخانه
مشترک با
شاخص DSBT
برابر با 0
تولید شود،
بازنشانیهای
"R_C6000_DSBT_INDEX" در
فایل خروجی
کپی
میشوند.
سوئیچ --no-merge-exidx-entries ادغام ورودیهای مجاور exidx را در اطلاعات بازگشایی فریم (frame unwind info) غیرفعال میکند.
- --branch-stub
- این گزینه با درج بخشهای واسط شاخهای (branch stub) در زمان نیاز برای گسترش دامنه انشعابها، تعدیل انشعاب توسط پیونددهنده را فعال میکند. این گزینه معمولاً لازم نیست زیرا C-SKY از دستورالعملهای پرش و فراخوانی که میتوانند به کل محدوده حافظه دسترسی داشته باشند پشتیبانی میکند و تعدیل انشعاب معمولاً توسط کامپایلر یا اسمبلر مدیریت میشود.
- --stub-group-size=N
- این گزینه امکان کنترل دقیقتر ایجاد بخشهای واسط شاخهای توسط پیونددهنده را فراهم میکند. این گزینه حداکثر اندازه گروهی از بخشهای ورودی را که میتوانند توسط یک بخش واسط مدیریت شوند تعیین میکند. مقدار منفی برای N بخشهای واسط را پس از انشعابهای آنها قرار میدهد، در حالی که مقدار مثبت اجازه میدهد بخشهای واسط قبل یا بعد از انشعابها قرار گیرند. مقادیر 1 یا -1 نشان میدهند که پیونددهنده باید مقادیر پیشفرض مناسب را انتخاب کند.
پیونددهندههای 68HC11 و 68HC12 از گزینههای خاصی برای کنترل نگاشت تعویض بانک حافظه و تولید کد ترامپولین پشتیبانی میکنند.
- --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) یا در تعدیل را کنترل میکنند. اگر از --insn32 استفاده شود، پیونددهنده فقط از کدگذاریهای دستورالعمل ۳۲ بیتی استفاده میکند. به طور پیشفرض یا در صورت استفاده از --no-insn32، همه کدگذاریهای دستورالعمل، از جمله در صورت امکان ۱۶ بیتی، استفاده میشوند.
- --ignore-branch-isa
- --no-ignore-branch-isa
- این گزینهها بررسیهای بازنشانی انشعاب را برای گذارهای نامعتبر حالت ISA کنترل میکنند. اگر از --ignore-branch-isa استفاده شود، پیونددهنده هرگونه بازنشانی انشعاب را میپذیرد و هرگونه گذار حالت ISA مورد نیاز در محاسبه بازنشانی از بین میرود، به جز در مواردی از دستورالعملهای "BAL" که شرایط تعدیل را دارا هستند و همزمان با محاسبه بازنشانی مربوطه، به دستورالعملهای معادل "JALX" تبدیل میشوند. به طور پیشفرض یا در صورت استفاده از --no-ignore-branch-isa، بررسی انجام میشود که باعث میشود از بین رفتن یک گذار حالت ISA منجر به تولید خطا گردد..IP --compact-branches 4
- --no-compact-branches
- این گزینهها تولید دستورالعملهای فشرده (compact instructions) توسط پیونددهنده را در مدخلهای PLT برای MIPS R6 کنترل میکنند.
برای هدف pdp11-aout، سه گونه از قالب خروجی را میتوان با گزینههای زیر انتخاب و تولید کرد. گونهٔ پیشفرض برای pdp11-aout گزینهٔ --omagic است، در حالی که برای سایر هدفها --nmagic پیشفرض است. گزینهٔ --imagic تنها برای هدف pdp11-aout تعریف شده است، در حالی که گزینههای دیگر همانگونه که در هدف pdp11-aout اعمال میشوند در اینجا شرح داده شدهاند.
- -N
- --omagic
- خروجی را در سرآیند a.out با مقدار "OMAGIC" (0407) علامتگذاری میکند تا مشخص شود که بخش متن (text segment) نباید محافظتشده در برابر نوشتن و اشتراکی باشد. از آنجا که بخشهای متن و داده هر دو قابل خواندن و نوشتن هستند، بخش داده بلافاصله و بهصورت پیوسته پس از بخش متن تخصیص مییابد. این قدیمیترین قالب برای برنامههای اجرایی PDP11 است و از ابتدا تا 2.11BSD در سیستمهای Unix مبتنی بر PDP11 برای ld پیشفرض بوده است.
- -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" تغییر دهید.
متغیر "GNUTARGET" قالب شیء فایل ورودی را در صورتی که از -b (یا مترادف آن --format) استفاده نکنید تعیین میکند. مقدار آن باید یکی از نامهای BFD برای یک قالب ورودی باشد. اگر "GNUTARGET" در محیط وجود نداشته باشد، ld از قالب طبیعی هدف استفاده میکند. اگر "GNUTARGET" روی "default" تنظیم شده باشد، BFD تلاش میکند با بررسی فایلهای ورودی باینری، قالب ورودی را شناسایی کند؛ این روش معمولاً موفقیتآمیز است، اما ابهامات بالقوهای وجود دارد، چرا که هیچ روشی برای اطمینان از یکتا بودن شمارهٔ جادویی بهکاررفته برای تعیین قالبهای فایل شیء وجود ندارد. با این حال، روال پیکربندی BFD روی هر سیستم، قالب متعارف آن سیستم را در ابتدای فهرست جستجو قرار میدهد، بنابراین ابهامات به نفع شیوهٔ متعارف برطرف میشوند.
متغیر "LDEMULATION" شبیهسازی پیشفرض را در صورتی که از گزینهٔ -m استفاده نکنید تعیین میکند. این شبیهسازی میتواند بر جنبههای مختلف رفتار پیونددهنده، بهویژه اسکریپت پیشفرض پیونددهنده تأثیر بگذارد. میتوانید شبیهسازیهای موجود را با گزینههای --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)
Copyright (c) 1991-2025 Free Software Foundation, Inc.
اجازهٔ کپی، توزیع و/یا تغییر این سند تحت شرایط «مجوز مستندات آزاد گنو» (GNU Free Documentation License)، نسخهٔ ۱.۳ یا هر نسخهٔ متأخرتری که توسط بنیاد نرمافزارهای آزاد منتشر شده است، بدون بخشهای تغییرناپذیر، بدون متنهای روی جلد و بدون متنهای پشت جلد اعطا میشود. نسخهای از این مجوز در بخشی تحت عنوان «GNU Free Documentation License» گنجانده شده است.
| 2025-11-10 | binutils-2.45.1 |