| LD(1) | GNU Development Tools | LD(1) |
نام (NAME)
ld - پیونددهندهٔ گنو
خلاصه دستور (SYNOPSIS)
ld [options] objfile ...
توضیحات (DESCRIPTION)
ld چندین فایل شیء و آرشیو را ترکیب کرده، دادههای آنها را بازنشانی (relocate) میکند و ارجاعات نمادها را متصل میسازد. معمولاً آخرین مرحله در کامپایل یک برنامه، اجرای ld است.
ld فایلهای زبان دستورات پیونددهنده (Linker Command Language) را که در یک ابرمجموعه از نحو Link Editor Command Language متعلق به AT&T نوشته شدهاند میپذیرد تا کنترلی صریح و کامل بر فرآیند پیونددهی فراهم کند.
این صفحهٔ راهنما زبان دستورات را شرح نمیدهد؛ برای جزئیات کامل در مورد زبان دستورات و سایر جنبههای پیونددهندهٔ GNU، مدخل ld را در "info" ببینید.
این نسخه از ld از کتابخانههای چندمنظورهٔ BFD برای کار روی فایلهای شیء استفاده میکند. این ویژگی به ld امکان میدهد فایلهای شیء را در قالبهای مختلفِ بسیاری بخواند، ترکیب کند و بنویسد---برای مثال، COFF یا "a.out". قالبهای مختلف را میتوان با یکدیگر پیوند داد تا هر نوع فایل شیء موجودی را تولید کرد.
گذشته از انعطافپذیری، پیونددهندهٔ گنو در ارائهٔ اطلاعات خطایابی و تشخیصی بسیار کارآمدتر از سایر پیونددهندهها است. بسیاری از پیونددهندهها بلافاصله پس از مواجهه با یک خطا اجرا را متوقف میکنند؛ اما ld تا جای ممکن به اجرا ادامه میدهد و به شما امکان میدهد خطاهای دیگر را نیز شناسایی کنید (یا در برخی موارد، با وجود خطا فایل خروجی را تولید کنید).
پیونددهندهٔ گنو ld برای پوشش طیف گستردهای از شرایط و داشتن بیشترین سازگاری ممکن با سایر پیونددهندهها طراحی شده است. در نتیجه، شما گزینههای متعددی برای کنترل رفتار آن در اختیار دارید..SH "گزینهها (OPTIONS)" پیونددهنده از شمار فراوانی گزینه خط فرمان پشتیبانی میکند، اما در عمل تنها تعداد اندکی از آنها در هر زمینهٔ خاصی به کار میروند. برای نمونه، یک کاربرد متداول ld پیوند دادن فایلهای شیء استاندارد یونیکس در یک سیستم یونیکس استاندارد و پشتیبانیشده است. در چنین سیستمی، برای پیوند دادن فایل "hello.o":
ld -o <output> /lib/crt0.o hello.o -lc
این به ld میگوید که فایلی به نام output را در نتیجهٔ پیوند دادن فایل "/lib/crt0.o" با "hello.o" و کتابخانهٔ "libc.a" که از دایرکتوریهای استاندارد جستجو برداشته میشود، تولید کند. (توضیحات مربوط به گزینهٔ -l در زیر را ببینید.)
برخی از گزینههای خط فرمان برای ld میتوانند در هر نقطهای از خط فرمان مشخص شوند. با این حال، گزینههایی که به فایلها اشاره دارند، مانند -l یا -T، باعث میشوند که فایل در همان نقطهای که گزینه در خط فرمان ظاهر میشود، نسبت به فایلهای شیء و دیگر گزینههای فایل خوانده شود. تکرار گزینههای غیرفایلی با یک آرگومان دیگر یا هیچ اثر بیشتری نخواهد داشت، یا وقوعهای قبلی (آنهایی که در خط فرمان در سمت چپتر قرار دارند) آن گزینه را باطل و جایگزین میکند. گزینههایی که میتوان آنها را بیش از یکبار بهطور معناداری مشخص کرد، در توضیحات زیر ذکر شدهاند.
آرگومانهای غیرگزینهای، فایلهای شیء یا آرشیوهایی هستند که باید با یکدیگر پیوند داده شوند. آنها میتوانند پس از گزینههای خط فرمان بیایند، قبل از آنها قرار گیرند، یا با آنها ترکیب شوند، به جز اینکه یک آرگومان فایل شیء نباید بین یک گزینه و آرگومان آن قرار گیرد.
معمولاً پیونددهنده با حداقل یک فایل شیء فراخوانی میشود، اما شما میتوانید شکلهای دیگری از فایلهای ورودی باینری را با استفاده از -l، -R، و زبان دستورات اسکریپت مشخص کنید. اگر هیچ فایل ورودی باینری مشخص نشده باشد، پیونددهنده هیچ خروجی تولید نمیکند و پیام No input files را صادر میکند.
اگر پیونددهنده نتواند قالب یک فایل شیء را تشخیص دهد، فرض میکند که یک اسکریپت پیونددهنده است. اسکریپتی که به این روش مشخص شود، اسکریپت پیونددهندهٔ اصلی مورد استفاده برای پیوند (خواه اسکریپت پیشفرض پیونددهنده باشد و خواه اسکریپتی که با -T مشخص شده) را گسترش داده و تقویت میکند. این ویژگی به پیونددهنده امکان میدهد تا با فایلی پیوند برقرار کند که به نظر یک شیء یا آرشیو میآید، اما در واقع صرفاً مقادیر برخی نمادها را تعریف میکند، یا از "INPUT" یا "GROUP" برای بارگذاری سایر اشیاء استفاده میکند. مشخص کردن یک اسکریپت به این روش صرفاً اسکریپت پیونددهندهٔ اصلی را گسترش میدهد، به طوری که دستورهای اضافی بعد از اسکریپت اصلی قرار میگیرند؛ برای جایگزینی کامل اسکریپت پیشفرض پیونددهنده از گزینهٔ -T استفاده کنید، اما به تأثیر دستور "INSERT" توجه داشته باشید.
برای گزینههایی که نام آنها تکحرفی است، آرگومانهای گزینه باید یا بدون فاصله بعد از حرف گزینه بیایند، یا به عنوان آرگومانهای جداگانه بلافاصله پس از گزینهای که به آنها نیاز دارد ارائه شوند.
برای گزینههایی که نام آنها چندحرفی است، میتواند یک خط تیره یا دو خط تیره قبل از نام گزینه قرار گیرد؛ برای نمونه، -trace-symbol و --trace-symbol معادل یکدیگرند. توجه کنید---یک استثنا برای این قاعده وجود دارد. گزینههای چندحرفی که با حرف کوچک 'o' آغاز میشوند تنها میتوانند با دو خط تیره شروع شوند. این کار برای کاهش سردرگمی با گزینهٔ -o است. بنابراین برای نمونه -omagic نام فایل خروجی را بر روی magic تنظیم میکند در حالی که --omagic پرچم NMAGIC را روی خروجی فعال میسازد.
آرگومانهای گزینههای چندحرفی باید یا با علامت مساوی از نام گزینه جدا شوند، یا به صورت آرگومانهای جداگانه بلافاصله پس از گزینهای که به آنها نیاز دارد ارائه شوند. برای نمونه، --trace-symbol foo و --trace-symbol=foo معادل هستند. مخففهای یکتا از نامهای گزینههای چندحرفی پذیرفته میشوند.
توجه کنید---اگر پیونددهنده به صورت غیرمستقیم و از طریق راهانداز کامپایلر (مانند gcc) فراخوانی میشود، تمام گزینههای خط فرمان پیونددهنده باید دارای پیشوند -Wl, باشند (یا هر آنچه که برای راهانداز کامپایلر مربوطه مناسب است) مانند این:
gcc -Wl,--start-group foo.o bar.o -Wl,--end-group
این نکته مهم است، زیرا در غیر این صورت برنامهٔ راهانداز کامپایلر ممکن است بدون هیچ هشداری گزینههای پیونددهنده را نادیده بگیرد که به یک پیوند ناموفق منجر میشود. همچنین هنگام انتقال گزینههایی که نیازمند مقدار هستند از طریق راهانداز ممکن است ابهام پیش بیاید، زیرا استفاده از فاصله بین گزینه و آرگومان نقش جداکننده را ایفا میکند و باعث میشود که راهانداز تنها گزینه را به پیونددهنده و آرگومان را به کامپایلر منتقل کند. در این حالت، سادهترین کار استفاده از حالت چسبیده برای هر دو نوع گزینهٔ تکحرفی و چندحرفی است، مانند:
gcc foo.o bar.o -Wl,-eENTRY -Wl,-Map=a.map
در اینجا جدول سوئیچهای عمومی خط فرمان که توسط پیونددهندهٔ GNU پذیرفته میشوند آورده شده است:
- @file
- خواندن
گزینههای
خط فرمان از
file.
گزینههای
خواندهشده
در محل
گزینهٔ
اصلی @file
جایگزین
میشوند.
اگر file وجود
نداشته
باشد یا
خوانده
نشود، با
گزینه به
صورت
تحتاللفظی
رفتار
خواهد شد و
حذف
نمیشود.
گزینهها در file با نویسهٔ فاصله جدا میشوند. یک نویسهٔ فاصله را میتوان با قرار دادن کل گزینه در نشانههای نقلقول تکی یا دوتایی درون یک گزینه گنجاند. هر نویسهای (از جمله بکاسلش) را میتوان با قراردادن یک پیشوند بکاسلش قبل از آن نویسه وارد کرد. خود file ممکن است حاوی گزینههای @file دیگری باشد؛ هر یک از این گزینهها به صورت بازگشتی پردازش خواهند شد.
- -a keyword
- این گزینه برای سازگاری با HP/UX پشتیبانی میشود. آرگومان keyword باید یکی از رشتههای archive، shared، یا default باشد. -aarchive از نظر عملکرد معادل -Bstatic است و دو کلیدواژهٔ دیگر از لحاظ عملکرد معادل -Bdynamic هستند. از این گزینه میتوان به هر تعداد دفعات استفاده کرد.
- --audit AUDITLIB
- افزودن AUDITLIB به مدخل "DT_AUDIT" در بخش پویا. وجود AUDITLIB بررسی نمیشود و از DT_SONAME مشخصشده در کتابخانه نیز استفاده نخواهد کرد. در صورت تعیین چندباره، "DT_AUDIT" حاوی فهرستی جداشده با دونقطه از رابطهای حسابرسی جهت استفاده خواهد بود. اگر پیونددهنده هنگام جستجوی کتابخانههای مشترک، شیئی با مدخل حسابرسی پیدا کند، یک مدخل متناظر "DT_DEPAUDIT" را در فایل خروجی اضافه میکند. این گزینه تنها روی سکوهای ELF که از رابط rtld-audit پشتیبانی میکنند معنا دارد.
- -b input-format
- --format=input-format
- ابزار ld
ممکن است
برای
پشتیبانی
از بیش از
یک نوع فایل
شیء
پیکربندی
شده باشد.
اگر ld شما
به این شکل
پیکربندی
شده است،
میتوانید
از گزینهٔ
-b برای
تعیین قالب
باینری
فایلهای
شیء ورودی
که پس از
این گزینه
در خط فرمان
میآیند
استفاده
کنید. حتی
زمانی که ld
برای
پشتیبانی
از
قالبهای
شیء
جایگزین
پیکربندی
شده است،
معمولاً
نیازی به
مشخص کردن
آن ندارید،
زیرا ld
باید طوری
پیکربندی
شده باشد که
معمولترین
قالب در هر
ماشین را به
عنوان قالب
ورودی
پیشفرض در
نظر بگیرد.
input-format یک
رشتهٔ متنی
است، نام
قالبی خاص
که توسط
کتابخانههای
BFD پشتیبانی
میشود.
(میتوانید
قالبهای
باینری
موجود را با
objdump -i فهرست
کنید.)
اگر فایلهایی با یک قالب باینری نامعمول را پیوند میدهید، ممکن است بخواهید از این گزینه استفاده کنید. همچنین میتوانید از -b برای تغییر صریح قالبها (هنگام پیوند دادن فایلهای شیء با قالبهای گوناگون) با قرار دادن -b input-format پیش از هر گروه از فایلهای شیء در یک قالب خاص بهره ببرید.
قالب پیشفرض از متغیر محیطی "GNUTARGET" گرفته میشود.
همچنین میتوانید قالب ورودی را از طریق یک اسکریپت با استفاده از دستور "TARGET" تعریف کنید؛
- -c MRI-commandfile
- --mri-script=MRI-commandfile
- به منظور سازگاری با پیونددهندههای تولیدشده توسط MRI، ابزار ld فایلهای اسکریپت نوشتهشده به یک زبان دستور جایگزین و محدود را میپذیرد که در بخش «MRI Compatible Script Files» در مستندات GNU ld شرح داده شده است. فایلهای اسکریپت MRI را با گزینهٔ -c معرفی کنید؛ از گزینهٔ -T برای اجرای اسکریپتهای پیونددهندهای که به زبان اسکریپتنویسی همهمنظورهٔ ld نوشته شدهاند استفاده نمایید. اگر MRI-cmdfile وجود نداشته باشد، ld آن را در دایرکتوریهای مشخصشده توسط گزینههای -L جستجو میکند.
- -d
- -dc
- -dp
- این سه گزینه با یکدیگر معادل هستند؛ شکلهای چندگانه برای سازگاری با سایر پیونددهندهها پشتیبانی میشوند. آنها به نمادهای عمومی (common symbols) فضا اختصاص میدهند، حتی اگر یک فایل خروجی بازنشانیپذیر (با -r) مشخص شده باشد. دستور اسکریپت "FORCE_COMMON_ALLOCATION" نیز دارای همین اثر است.
- --depaudit AUDITLIB
- -P AUDITLIB
- مقدار AUDITLIB را به مدخل "DT_DEPAUDIT" در بخش پویا اضافه میکند. وجود AUDITLIB بررسی نمیشود و همچنین از DT_SONAME مشخصشده در کتابخانه استفاده نخواهد کرد. اگر چندین بار مشخص شود، "DT_DEPAUDIT" حاوی فهرستی از رابطهای حسابرسی (audit) خواهد بود که با دونقطه (:) از هم جدا شدهاند. این گزینه تنها در پلتفرمهای ELF که از رابط rtld-audit پشتیبانی میکنند معنی دارد. گزینهٔ -P برای سازگاری با Solaris ارائه شده است.
- --enable-linker-version
- دستورالعمل
اسکریپت
پیوندساز
"LINKER_VERSION" را
فعال
میکند که
در Output Section Data شرح
داده شده
است. اگر
این
دستورالعمل
در یک
اسکریپت
پیوندساز
استفاده
شود و این
گزینه فعال
شده باشد،
رشتهای
حاوی نسخهٔ
پیوندساز
در نقطهٔ
فعلی درج
خواهد شد.
توجه - محل قرارگیری این گزینه در خط فرمان پیوندساز دارای اهمیت است. این گزینه تنها بر اسکریپتهای پیوندسازی تأثیر میگذارد که پس از آن در خط فرمان بیایند، یا اسکریپتهایی که درون پیوندساز تعبیه شدهاند.
- --disable-linker-version
- دستورالعمل اسکریپت پیوندساز "LINKER_VERSION" را غیرفعال میکند، بهطوری که رشتهٔ نسخه را درج نمیکند. این حالت پیشفرض است.
- --enable-non-contiguous-regions
- این گزینه
در صورتی که
یک بخش
ورودی در یک
بخش خروجی
منطبق جا
نشود، از
ایجاد خطا
جلوگیری
میکند.
پیوندساز
تلاش
میکند بخش
ورودی را به
بخشهای
خروجی
منطبق بعدی
تخصیص دهد و
تنها در
صورتی خطا
ایجاد
میکند که
هیچ بخش
خروجی به
اندازهٔ
کافی بزرگ
نباشد. این
در مواردی
مفید است که
چندین
ناحیهٔ
حافظهٔ
غیرپیوسته
در دسترس
باشند و بخش
ورودی
نیازمند
ناحیهٔ
خاصی نباشد.
ترتیبی که
بخشهای
ورودی
ارزیابی
میشوند
تغییر
نمیکند،
برای مثال:
MEMORY { MEM1 (rwx) : ORIGIN = 0x1000, LENGTH = 0x14 MEM2 (rwx) : ORIGIN = 0x1000, LENGTH = 0x40 MEM3 (rwx) : ORIGIN = 0x2000, LENGTH = 0x40 } SECTIONS { mem1 : { *(.data.*); } > MEM1 mem2 : { *(.data.*); } > MEM2 mem3 : { *(.data.*); } > MEM3 } with input sections: .data.1: size 8 .data.2: size 0x10 .data.3: size 4 results in .data.1 affected to mem1, and .data.2 and .data.3 affected to mem2, even though .data.3 would fit in mem3.این گزینه با دستورهای INSERT ناسازگار است، زیرا نحوهٔ نگاشت بخشهای ورودی به بخشهای خروجی را تغییر میدهد.
- --enable-non-contiguous-regions-warnings
- این گزینه هشدارهایی را فعال میکند هنگامی که "--enable-non-contiguous-regions" تطابقهای احتمالاً غیرمنتظرهای را در نگاشت بخشها مجاز میکند، که ممکن است به جای شکست به دلیل جا نشدن در هیچ ناحیهٔ خروجی، به دور انداختن بیصدای یک بخش منجر شود.
- -e entry
- --entry=entry
- از entry بهعنوان نماد صریح برای شروع اجرای برنامه، به جای نقطهٔ ورود پیشفرض استفاده میکند. اگر نمادی با نام entry وجود نداشته باشد، پیوندساز تلاش میکند entry را بهعنوان یک عدد تجزیه کند و از آن بهعنوان آدرس ورود استفاده نماید (این عدد در مبنای ۱۰ تفسیر میشود؛ میتوانید از 0x ابتدایی برای مبنای ۱۶ یا 0 ابتدایی برای مبنای ۸ استفاده کنید). برای i386 PE، نماد entry همچنین میتواند نام اصلی تابع باشد (بدون زیرخط ابتدایی و/یا @number انتهای stdcall، در صورت کاربرد داشتن).
- --exclude-libs lib,lib,...
- فهرستی از کتابخانههای آرشیو را مشخص میکند که نمادهای آنها نباید بهطور خودکار صادر (export) شوند. نامهای کتابخانهها میتوانند با ویرگول یا دونقطه جدا شوند. مشخص کردن "--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) برای کنترل اینکه چه نمادهایی باید به جدول نمادهای پویا اضافه شوند استفاده کنید. توضیحات مربوط به --dynamic-list را ببینید.
توجه داشته باشید که این گزینه مختص پورتهای با هدف ELF است. مقصدهای PE از قابلیتی مشابه برای صدور تمام نمادها از یک DLL یا EXE پشتیبانی میکنند؛ توضیحات مربوط به --export-all-symbols را در زیر ببینید.
- --export-dynamic-symbol=glob
- هنگام ایجاد یک فایل اجرایی با پیوند پویا، نمادهای منطبق با glob به جدول نمادهای پویا اضافه خواهند شد. هنگام ایجاد یک کتابخانهٔ مشترک، ارجاعات به نمادهای منطبق با glob به تعاریف درون کتابخانهٔ مشترک مقید نخواهند شد. این گزینه هنگام ایجاد یک کتابخانهٔ مشترک در صورتی که -Bsymbolic یا --dynamic-list مشخص نشده باشند، هیچ عملی انجام نمیدهد (no-op). این گزینه تنها در پلتفرمهای ELF که از کتابخانههای مشترک پشتیبانی میکنند معنی دارد.
- --export-dynamic-symbol-list=file
- به ازای هر الگو در فایل، یک --export-dynamic-symbol مشخص میکند. قالب فایل همانند گره نسخه (version node) بدون حوزه و نام گره است. برای اطلاعات بیشتر VERSION را ببینید.
- -EB
- پیوند دادن شیءهای با ترتیب بایت بزرگپایان (big-endian). این گزینه بر قالب خروجی پیشفرض تأثیر میگذارد.
- -EL
- پیوند دادن شیءهای با ترتیب بایت کوچکپایان (little-endian). این گزینه بر قالب خروجی پیشفرض تأثیر میگذارد.
- -f name
- --auxiliary=name
- هنگام
ایجاد یک
شیء مشترک
ELF، فیلد
درونی DT_AUXILIARY را
به نام
مشخصشده
تنظیم
میکند. این
کار به
پیوندساز
پویا
میگوید که
جدول نماد
شیء مشترک
باید
بهعنوان
یک پالایهٔ
کمکی (auxiliary filter) بر
روی جدول
نماد شیء
مشترک name
استفاده
شود.
اگر بعداً برنامهای را در برابر این شیء پالایه پیوند دهید، هنگام اجرای برنامه، پیوندساز پویا فیلد DT_AUXILIARY را خواهد دید. اگر پیوندساز پویا نمادی را از شیء پالایه حلوفصل کند، ابتدا بررسی میکند که آیا تعریفی در شیء مشترک name وجود دارد یا خیر. اگر وجود داشته باشد، به جای تعریف موجود در شیء پالایه استفاده خواهد شد. لزومی به وجود شیء مشترک name نیست. بدین ترتیب شیء مشترک name میتواند برای ارائه پیادهسازی جایگزینی از برخی توابع، شاید برای اشکالزدایی یا کارایی ویژهٔ ماشین، به کار رود.
این گزینه میتواند بیش از یک بار مشخص شود. ورودیهای DT_AUXILIARY به ترتیبی که در خط فرمان ظاهر میشوند ایجاد خواهند شد.
- -F name
- --filter=name
- هنگام
ایجاد یک
شیء مشترک
ELF، فیلد
درونی DT_FILTER را
به نام
مشخصشده
تنظیم
میکند. این
کار به
پیوندساز
پویا
میگوید که
جدول نماد
شیء مشترکِ
در حال
ایجاد،
باید
بهعنوان
یک پالایه (filter)
بر روی جدول
نماد شیء
مشترک name
استفاده
شود.
اگر بعداً برنامهای را در برابر این شیء پالایه پیوند دهید، هنگام اجرای برنامه، پیوندساز پویا فیلد DT_FILTER را خواهد دید. پیوندساز پویا نمادها را طبق معمول بر اساس جدول نماد شیء پالایه حلوفصل میکند، اما در عمل به تعاریف یافتشده در شیء مشترک name پیوند خواهد خورد. بدین ترتیب میتوان از شیء پالایه برای انتخاب زیرمجموعهای از نمادهای ارائهشده توسط شیء name استفاده کرد.
برخی از پیوندسازهای قدیمیتر از گزینهٔ -F در سراسر زنجیره ابزار کامپایل برای تعیین قالب فایل شیء برای هر دو فایل شیء ورودی و خروجی استفاده میکردند. پیوندساز GNU از سازوکارهای دیگری برای این منظور استفاده میکند: گزینههای -b، --format، --oformat، دستور "TARGET" در اسکریپتهای پیوندساز، و متغیر محیطی "GNUTARGET". پیوندساز GNU در صورتی که مشغول ایجاد شیء مشترک ELF نباشد، گزینهٔ -F را نادیده خواهد گرفت..IP -fini=name 4 هنگام ایجاد یک فایل اجرایی یا شیء اشتراکی 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) گنجانده خواهد شد.
- -M
- --print-map
- یک نگاشت پیوند (link map) را در خروجی استاندارد چاپ میکند. یک نگاشت پیوند، اطلاعاتی درباره پیوند شامل موارد زیر فراهم میکند:
- نحوه تخصیص نمادهای مشترک (common symbols).
- تمامی اعضای آرشیو که در پیوند گنجانده شدهاند، همراه با ذکر نمادی که باعث وارد شدن آن عضو آرشیو شده است.
- مقادیر
تخصیصیافته
به نمادها.
نکته - نمادهایی که مقدار آنها توسط عبارتی شامل ارجاع به مقدار قبلی همان نماد محاسبه میشود، ممکن است نتیجه درستی در نقشهی پیوند (link map) نمایش ندهند. دلیل این امر آن است که پیونددهنده نتایج میانی را دور ریخته و تنها مقدار نهایی یک عبارت را نگه میدارد. در چنین شرایطی، پیونددهنده مقدار نهایی را درون قلابها (کروشهها) نمایش میدهد. بنابراین برای مثال یک اسکریپت پیونددهنده شامل:
foo = 1 foo = foo * 4 foo = foo + 8
در صورت استفاده از گزینه -M، خروجی زیر را در نقشهی پیوند تولید خواهد کرد:
0x00000001 foo = 0x1 [0x0000000c] foo = (foo * 0x4) [0x0000000c] foo = (foo + 0x8)
برای اطلاعات بیشتر درباره عبارات در اسکریپتهای پیونددهنده، Expressions را ببینید.
- نحوه ادغام
ویژگیهای
GNU.
هنگامی که پیونددهنده بخشهای ورودی .note.gnu.property را در یک بخش خروجی .note.gnu.property ادغام میکند، برخی از ویژگیها حذف یا بهروزرسانی میشوند. این اقدامات در نقشهی پیوند گزارش میشوند. برای مثال:
Removed property 0xc0000002 to merge foo.o (0x1) and bar.o (not found)
این نشان میدهد که ویژگی 0xc0000002 در هنگام ادغام ویژگیها در foo.o (که مقدار ویژگی 0xc0000002 آن 0x1 است) و bar.o (که فاقد ویژگی 0xc0000002 است) از خروجی حذف شده است.
Updated property 0xc0010001 (0x1) to merge foo.o (0x1) and bar.o (0x1)
این نشان میدهد که مقدار ویژگی 0xc0010001 در هنگام ادغام ویژگیها در foo.o (که مقدار ویژگی 0xc0010001 آن 0x1 است) و bar.o (که مقدار ویژگی 0xc0010001 آن 0x1 است)، در خروجی به 0x1 بهروزرسانی شده است.
- در برخی از
مقصدهای ELF،
فهرستی از
اصلاحات (fixups)
درجشده
توسط --relax
foo.o: Adjusting branch at 0x00000008 towards "far" in section .text
این نشان میدهد که انشعاب در نشانی 0x00000008 در foo.o به سمت نماد "far" در بخش .text، با یک ترامپولین (trampoline) جایگزین شده است.
- --print-map-discarded
- --no-print-map-discarded
- چاپ (یا عدم چاپ) فهرست بخشهای کنار گذاشتهشده و جمعآوریشده بهوسیلهی بازیافت حافظه در نقشهی پیوند. بهطور پیشفرض فعال است.
- --print-map-locals
- --no-print-map-locals
- چاپ (یا عدم چاپ) نمادهای محلی در نقشهی پیوند. نمادهای محلی عبارت (local) را پیش از نام خود خواهند داشت و پس از تمام نمادهای سراسری در یک بخش معین فهرست میشوند. نمادهای محلی موقت (معمولاً آنهایی که با .L آغاز میشوند) در خروجی گنجانده نخواهند شد. بهطور پیشفرض غیرفعال است.
- -n
- --nmagic
- غیرفعال کردن تراز صفحهای (page alignment) بخشها، و غیرفعال کردن پیوند با کتابخانههای اشتراکی. اگر قالب خروجی از اعداد جادویی سبک یونیکس پشتیبانی کند، خروجی را با عنوان "NMAGIC" نشانهگذاری میکند.
- -N
- --omagic
- تنظیم بخشهای text و data به صورت خواندنی و نوشتنی. همچنین، سگمنت data را از نظر صفحهای تراز نمیکند و پیوند با کتابخانههای اشتراکی را غیرفعال میسازد. اگر قالب خروجی از اعداد جادویی سبک یونیکس پشتیبانی کند، خروجی را با عنوان "OMAGIC" نشانهگذاری میکند. نکته: با اینکه یک بخش text قابلنوشتن برای مقصدهای PE-COFF مجاز است، اما با مشخصات قالبی که توسط مایکروسافت منتشر شده مطابقت ندارد.
- --no-omagic
- این گزینه اکثر اثرات گزینه -N را خنثی میکند. این گزینه بخش text را فقطخواندنی کرده و سگمنت data را مجبور به تراز صفحهای میکند. نکته - این گزینه پیوند با کتابخانههای اشتراکی را فعال نمیکند؛ برای این منظور از -Bdynamic استفاده کنید.
- -o output
- --output=output
- استفاده از
output به عنوان
نام
برنامهی
تولیدشده
توسط ld؛ در
صورتی که
این گزینه
مشخص نشود،
نام a.out
بهطور
پیشفرض
استفاده
میشود.
دستور
اسکریپت
"OUTPUT" نیز
میتواند
نام فایل
خروجی را
تعیین کند.
نکته - پیونددهنده پیش از آغاز نوشتن در فایل خروجی، آن را حذف خواهد کرد. این کار حتی در صورتی که مشخص شود فرآیند پیوند به دلیل خطاها کامل نمیشود نیز انجام خواهد شد.
نکته - پیونددهنده بررسی میکند تا نام فایل خروجی با هیچیک از فایلهای ورودی یکسان نباشد، اما این تمام ماجراست. به طور ویژه اگر فایل خروجی یک فایل منبع یا فایلی مهم را بازنویسی (overwrite) کند، هشداری نخواهد داد. بنابراین در سامانههای ساخت توصیه میشود که از گزینه -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
نام فایل
مطلق
افزونه است.
معمولاً
این
پارامتر
هنگام
استفاده از
بهینهسازی
زمان پیوند
(LTO)، بهطور
خودکار
توسط
کامپایلر
اضافه
میشود،
اما
کاربران
نیز
میتوانند
در صورت
تمایل
افزونههای
خود را
اضافه کنند.
توجه داشته باشید که مکان افزونههای ارائهشده از سمت کامپایلر با محلی که برنامههای ar، nm و ranlib برای یافتن افزونههایشان جستجو میکنند متفاوت است. برای اینکه آن دستورها بتوانند از یک افزونهی مبتنی بر کامپایلر استفاده کنند، ابتدا باید آن را در دایرکتوری ${libdir}/bfd-plugins کپی کرد. تمامی افزونههای پیونددهندهی مبتنی بر gcc با نگارشهای پیشین سازگار هستند (backward compatible)، بنابراین تنها کپی کردن جدیدترین نسخه کافی است..IP --push-state 4 گزینهٔ --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
- --pop-state
- اثر --push-state را خنثی کرده و مقادیر قبلی پرچمهای کنترلکنندهٔ رفتار با فایلهای ورودی را بازیابی میکند.
- -q
- --emit-relocs
- بخشها و
محتویات
بازنشانی
(relocation) را در
فایلهای
اجرایی
کاملاً
پیوندخورده
باقی
میگذارد.
ابزارهای
تحلیل و
بهینهسازی
پس از پیوند
ممکن است
برای اعمال
تغییرات
صحیح روی
فایلهای
اجرایی به
این
اطلاعات
نیاز داشته
باشند. این
کار منجر به
بزرگتر
شدن
اندازهٔ
فایلهای
اجرایی
میشود.
این گزینه در حال حاضر تنها روی سکوهای ELF پشتیبانی میشود.
- --force-dynamic
- فایل خروجی را ملزم به داشتن بخشهای پویا (dynamic sections) میکند. این گزینه مختص اهداف VxWorks است.
- -r
- --relocatable
- تولید
خروجی
بازنشانیپذیر
(relocatable)---یعنی
ایجاد یک
فایل خروجی
که خود
میتواند
متقابلاً
بهعنوان
ورودی برای
ld به کار
رود. این
عمل
معمولاً
پیوند
جزئی (partial linking)
نامیده
میشود.
بهعنوان
یک اثر
جانبی، در
محیطهایی
که از
شمارههای
جادویی
استاندارد
یونیکس
پشتیبانی
میکنند،
این گزینه
همچنین
شمارهٔ
جادویی
فایل خروجی
را روی
"OMAGIC"
تنظیم
میکند. اگر
این گزینه
مشخص نشود،
یک فایل
مطلق (absolute)
تولید
میشود.
هنگام
پیوند
برنامههای
++C، این
گزینه
ارجاعات به
سازندهها
(constructors) را حل
نخواهد
کرد؛ برای
انجام این
کار، از -Ur
استفاده
کنید.
هنگامی که قالب یک فایل ورودی با فایل خروجی یکسان نباشد، پیوند جزئی تنها در صورتی پشتیبانی میشود که آن فایل ورودی حاوی هیچ بازنشانیای نباشد. قالبهای خروجی مختلف میتوانند محدودیتهای بیشتری داشته باشند؛ به عنوان مثال برخی قالبهای مبتنی بر "a.out" اصلاً از پیوند جزئی با فایلهای ورودی در قالبهای دیگر پشتیبانی نمیکنند.
هنگامی که خروجیِ بازنشانیپذیر حاوی هر دو نوع محتویاتِ نیازمند بهینهسازی زمان پیوند (LTO) و محتویات بینیاز از LTO باشد، یک بخش .gnu_object_only برای نگهداری یک فایل شیء بازنشانیپذیر ایجاد خواهد شد، گویی -r روی تمام ورودیهای بازنشانیپذیری که نیازمند LTO نیستند اعمال شده است. هنگام پردازش یک ورودی بازنشانیپذیر دارای بخش .gnu_object_only، پیونددهنده بخش .gnu_object_only را به عنوان یک ورودی جداگانه استخراج خواهد کرد.
توجه داشته باشید از آنجا که -r برخی از بخشهای فایلهای ورودی مختلف را با یکدیگر گروهبندی میکند، ممکن است تأثیر منفی بر اندازهٔ کد و محلیبودن (locality) آن در فایل اجرایی نهایی یا کتابخانهٔ اشتراکی بگذارد.
این گزینه همان کارکرد -i را دارد.
- -R filename
- --just-symbols=filename
- نامهای
نمادها و
آدرسهای
آنها را از
filename
میخواند،
اما آن را
بازنشانی
نکرده و در
خروجی قرار
نمیدهد.
این به فایل
خروجی شما
اجازه
میدهد تا
بهصورت
نمادین به
مکانهای
مطلقی از
حافظه که در
سایر
برنامهها
تعریف
شدهاند
ارجاع دهد.
میتوانید
از این
گزینه بیش
از یک بار
استفاده
کنید.
بهمنظور سازگاری با سایر پیونددهندههای ELF، اگر پس از گزینهٔ -R بهجای نام فایل، یک نام دایرکتوری بیاید، مانند گزینهٔ -rpath با آن رفتار میشود.
- --rosegment
- --no-rosegment
- تلاش
میکند تا
اطمینان
حاصل شود که
تنها یک
قطعهٔ (segment)
فقطخواندنی
و غیرکد
ایجاد
میشود. فقط
زمانی
کاربرد
دارد که
همراه با
گزینهٔ -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 ساخته میشود) حائز اهمیت باشد..IP "-u symbol" 4
- --undefined=symbol
- درج اجباری
symbol در فایل
خروجی به
عنوان یک
نماد
تعریفنشده
(undefined). برای
مثال،
انجام این
کار ممکن
است پیوند
دادن
ماژولهای
اضافی از
کتابخانههای
استاندارد
را فعال
کند. -u
میتواند
با
آرگومانهای
مختلف
تکرار شود
تا نمادهای
تعریفنشدهٔ
بیشتری
وارد شوند.
این گزینه
معادل
دستور
اسکریپت
پیونددهندهٔ
"EXTERN" است.
اگر از این گزینه برای وادار کردن ماژولهای اضافی جهت کشیده شدن به فرآیند پیوند استفاده میشود، و اگر تعریفنشده باقی ماندن نماد یک خطا محسوب میشود، باید به جای آن از گزینهٔ --require-defined استفاده شود.
- --require-defined=symbol
- الزام میکند که symbol در فایل خروجی تعریف شده باشد. این گزینه مانند گزینهٔ --undefined عمل میکند، با این تفاوت که اگر symbol در فایل خروجی تعریف نشده باشد، پیونددهنده خطا صادر کرده و خارج میشود. همین اثر را میتوان در یک اسکریپت پیونددهنده با استفادهٔ همزمان از "EXTERN"، "ASSERT" و "DEFINED" به دست آورد. این گزینه میتواند چندین بار برای الزام نمادهای بیشتر استفاده شود.
- -Ur
- برای
برنامههایی
که از
سازندهها
(constructors) یا
نابودکنندهها
(destructors) استفاده
نمیکنند،
یا برای
سیستمهای
مبتنی بر ELF،
این گزینه
معادل -r
است: خروجی
با قابلیت
جابهجایی
(relocatable) تولید
میکند---یعنی،
یک فایل
خروجی که به
نوبهٔ خود
میتواند
به عنوان
ورودی برای
ld عمل کند.
با این حال
برای سایر
فایلهای
باینری،
گزینهٔ -Ur
مشابه -r
است اما
مراجع به
سازندهها
و
نابودکنندهها
را نیز
حلوفصل
میکند.
برای آن دسته از سیستمهایی که -r و -Ur در آنها رفتار متفاوتی دارند، استفاده از -Ur روی فایلهایی که خودشان با -Ur پیوند یافتهاند کار نمیکند؛ هنگامی که جدول سازندهها ساخته شد، نمیتوان چیزی به آن افزود. از -Ur تنها برای آخرین پیوند جزئی، و از -r برای بقیه استفاده کنید.
- --orphan-handling=MODE
- نحوهٔ
مدیریت
بخشهای
یتیم (orphan sections) را
کنترل
میکند. بخش
یتیم بخشی
است که
صراحتاً در
اسکریپت
پیونددهنده
نام برده
نشده است.
MODE میتواند هر یک از مقادیر زیر را داشته باشد:
- "place"
- بخشهای یتیم با پیروی از راهبرد شرح داده شده در Orphan Sections درون یک بخش خروجی مناسب قرار میگیرند. گزینهٔ --unique نیز بر نحوهٔ قرارگیری بخشها تأثیر میگذارد.
- "discard"
- همهٔ بخشهای یتیم با قرار گرفتن در بخش /DISCARD/ دور ریخته میشوند.
- "warn"
- پیونددهنده بخش یتیم را مانند "place" قرار میدهد و همچنین یک هشدار صادر میکند.
- "error"
- در صورت یافتن هرگونه بخش یتیم، پیونددهنده با یک خطا خارج میشود.
اگر --orphan-handling مشخص نشود، مقدار پیشفرض "place" است.
- --unique[=SECTION]
- برای هر بخش ورودی منطبق با SECTION، یا در صورت نبود آرگومان اختیاری عامهنویس (wildcard) SECTION، برای هر بخش ورودی یتیم، یک بخش خروجی مجزا ایجاد میکند. بخش یتیم بخشی است که صراحتاً در یک اسکریپت پیونددهنده ذکر نشده است. میتوانید از این گزینه چندین بار در خط فرمان استفاده کنید؛ این گزینه از ادغام معمول بخشهای ورودی همنام جلوگیری کرده و بر تخصیصهای بخش خروجی در اسکریپت پیونددهنده برتری مییابد.
- -v
- --version
- -V
- نمایش شمارهٔ نسخهٔ ld. گزینهٔ -V همچنین شبیهسازیهای (emulations) پشتیبانیشده را فهرست میکند. همچنین توضیحات --enable-linker-version را در Options,,Command-line Options ببینید که میتواند برای درج رشتهٔ نسخهٔ پیونددهنده در یک باینری استفاده شود.
- -x
- --discard-all
- حذف تمام نمادهای محلی.
- -X
- --discard-locals
- حذف تمام نمادهای محلی موقت. (این نمادها با پیشوندهای برچسب محلی مختص سیستم شروع میشوند، معمولاً .L برای سیستمهای ELF یا L برای سیستمهای سنتی a.out.)
- -y symbol
- --trace-symbol=symbol
- چاپ نام هر
فایل
پیوندشده
که در آن symbol
ظاهر
میشود. این
گزینه
میتواند
به هر تعداد
بار
استفاده
شود. در
بسیاری از
سیستمها
افزودن یک
زیرخط (underscore) به
ابتدای آن
الزامی است.
این گزینه زمانی مفید است که شما یک نماد تعریفنشده در پیوند خود دارید اما نمیدانید ارجاع به آن از کجا آمده است.
- -Y path
- افزودن path به مسیر پیشفرض جستجوی کتابخانه. این گزینه برای سازگاری با Solaris وجود دارد.
- -z keyword
- کلیدواژههای شناختهشده عبارتند از:
- call-nop=prefix-addr
- call-nop=suffix-nop
- call-nop=prefix-byte
- call-nop=suffix-byte
- تعیین لایهٔ پرکنندهٔ (padding) یکبایتی "NOP" هنگام تبدیل فراخوانی غیرمستقیم به یک تابع محلی تعریفشده مانند foo از طریق شیار (slot) GOT آن. call-nop=prefix-addr مقدار "0x67 call foo" را تولید میکند. call-nop=suffix-nop مقدار "call foo 0x90" را تولید میکند. call-nop=prefix-byte مقدار "byte call foo" را تولید میکند. call-nop=suffix-byte مقدار "call foo byte" را تولید میکند. برای i386 و x86_64 پشتیبانی میشود.
- cet-report=none
- cet-report=warning
- cet-report=error
- نحوهٔ گزارش ویژگیهای ناموجود GNU_PROPERTY_X86_FEATURE_1_IBT و GNU_PROPERTY_X86_FEATURE_1_SHSTK را در بخش ورودی .note.gnu.property مشخص میکند. مقدار cet-report=none، که پیشفرض است، باعث میشود پیونددهنده ویژگیهای ناموجود در فایلهای ورودی را گزارش نکند. cet-report=warning باعث میشود پیونددهنده برای ویژگیهای ناموجود در فایلهای ورودی هشدار صادر کند. cet-report=error باعث میشود پیونددهنده برای ویژگیهای ناموجود در فایلهای ورودی خطا صادر کند. توجه داشته باشید که ibt گزارش ویژگی ناموجود GNU_PROPERTY_X86_FEATURE_1_IBT را غیرفعال میکند و shstk گزارش ویژگی ناموجود GNU_PROPERTY_X86_FEATURE_1_SHSTK را غیرفعال خواهد کرد. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- combreloc
- nocombreloc
- ترکیب چندین بخش بازنشانی (relocation) پویا و مرتبسازی به منظور بهبود کشکردن جستجوی نمادهای پویا. در صورت استفاده از nocombreloc این کار انجام نمیشود.
- common
- nocommon
- تولید نمادهای عمومی (common symbols) با نوع STT_COMMON در طول یک پیوند با قابلیت جابهجایی (relocatable link). در صورت استفاده از nocommon از نوع STT_OBJECT استفاده میشود.
- common-page-size=value
- اندازهٔ صفحهای را که بیشترین کاربرد را دارد روی value تنظیم میکند. در صورتی که سیستم از صفحاتی با این اندازه استفاده کند، چیدمان تصویر حافظه برای به حداقل رساندن صفحات حافظه بهینهسازی خواهد شد..IP defs 4 ارجاعهای حلنشدهٔ نماد از فایلهای شیء عادی را گزارش میدهد. این کار حتی در صورتی که پیونددهنده در حال ایجاد یک کتابخانهٔ اشتراکی غیرنمادین باشد نیز انجام میشود. این گزینه معکوس -z undefs است.
- dynamic-undefined-weak
- nodynamic-undefined-weak
- هنگام ساخت یک شیء پویا، نمادهای ضعیف تعریفنشده را در صورتی که از یک فایل شیء عادی ارجاع داده شده باشند و به دلیل نمایانیِ نماد یا نسخهبندی محلی نشده باشند، به صورت پویا درمیآورد. با انتخاب nodynamic-undefined-weak آنها را پویا نمیکند. اگر هیچیک از گزینهها مشخص نشود، ممکن است پیشفرض یک هدف اِعمال هر یک از این گزینهها باشد، یا گزینش دیگری از نمادهای ضعیف تعریفنشده را پویا کند. همهٔ هدفها از این گزینهها پشتیبانی نمیکنند.
- execstack
- شیء را به عنوان نیازمند پشتهٔ قابل اجرا نشانهگذاری میکند.
- global
- این گزینه تنها هنگام ساخت یک شیء اشتراکی معنا دارد. این کار نمادهای تعریفشده توسط این شیء اشتراکی را برای حل نماد کتابخانههایی که بعداً بارگذاری میشوند در دسترس قرار میدهد.
- globalaudit
- این گزینه تنها هنگام ساخت یک فایل اجرایی پویا معنا دارد. این گزینه با تنظیم بیت "DF_1_GLOBAUDIT" در برچسب پویای "DT_FLAGS_1"، فایل اجرایی را به عنوان نیازمند حسابرسی سراسری نشانهگذاری میکند. حسابرسی سراسری مستلزم آن است که هر کتابخانهٔ حسابرسی تعریفشده از طریق گزینههای خط فرمان --depaudit یا -P برای تمام اشیاء پویای بارگذاریشده توسط برنامه اجرا شود.
- ibtplt
- مدخلهای PLT فعالشده با قابلیت Intel Indirect Branch Tracking (IBT) را تولید میکند. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- ibt
- ویژگی GNU_PROPERTY_X86_FEATURE_1_IBT را در بخش .note.gnu.property برای نشان دادن سازگاری با IBT ایجاد میکند. این گزینه همچنین متضمن ibtplt است. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- indirect-extern-access
- noindirect-extern-access
- ویژگی
GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS را
در بخش .note.gnu.property
ایجاد
میکند تا
نشان دهد
فایل شیء به
اشارهگرهای
تابع
استاندارد
نیاز دارد و
نمیتواند
همراه با
بازنشانی
کپی
استفاده
شود. این
گزینه
همچنین
متضمن noextern-protected-data
و nocopyreloc است.
برای i386 و x86-64
پشتیبانی
میشود.
گزینهٔ noindirect-extern-access ویژگی GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS را از بخش .note.gnu.property حذف میکند.
- initfirst
- این گزینه تنها هنگام ساخت یک شیء اشتراکی معنا دارد. این گزینه شیء را طوری نشانهگذاری میکند که مقداردهی اولیهٔ زمان اجرای آن، پیش از مقداردهی اولیهٔ زمان اجرای هر شیء دیگری که همزمان به فرایند آورده شده است رخ دهد. به همین ترتیب، نهاییسازی زمان اجرای این شیء پس از نهاییسازی زمان اجرای هر شیء دیگری رخ خواهد داد.
- interpose
- مشخص میکند که بارگذار پویا باید ترتیب جستجوی نماد خود را طوری تغییر دهد که نمادهای موجود در این کتابخانهٔ اشتراکی، جایگزین نمادهای تمام کتابخانههای اشتراکی دیگری شوند که به این صورت نشانهگذاری نشدهاند.
- unique
- nounique
- هنگام ایجاد یک کتابخانهٔ اشتراکی یا سایر اشیاء ELF با قابلیت بارگذاری پویا، آن را طوری نشانهگذاری میکند که (به طور پیشفرض) تنها یک بار و فقط در فضای نام اصلی (هنگام استفاده از "dlmopen") بارگذاری شود. این گزینه اساساً برای نشانهگذاری کتابخانههای بنیادینی مانند libc، libpthread و غیره استفاده میشود که معمولاً تا زمانی که تنها نمونهٔ موجود از خود نباشند به درستی کار نمیکنند. این رفتار میتواند توسط فراخوانندهٔ "dlmopen" لغو شود و در مورد برخی سازوکارهای بارگذاری (مانند کتابخانههای حسابرسی) اعمال نمیشود.
- lam-u48
- ویژگی GNU_PROPERTY_X86_FEATURE_1_LAM_U48 را در بخش .note.gnu.property ایجاد میکند تا سازگاری با Intel LAM_U48 را نشان دهد. برای Linux/x86_64 پشتیبانی میشود.
- lam-u57
- ویژگی GNU_PROPERTY_X86_FEATURE_1_LAM_U57 را در بخش .note.gnu.property ایجاد میکند تا سازگاری با Intel LAM_U57 را نشان دهد. برای Linux/x86_64 پشتیبانی میشود.
- lam-u48-report=none
- lam-u48-report=warning
- lam-u48-report=error
- نحوهٔ گزارشدهی ویژگی مفقود GNU_PROPERTY_X86_FEATURE_1_LAM_U48 در بخش ورودی .note.gnu.property را مشخص میکند. گزینهٔ lam-u48-report=none که پیشفرض است، باعث میشود پیونددهنده ویژگیهای مفقود در فایلهای ورودی را گزارش نکند. گزینهٔ lam-u48-report=warning باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی هشدار صادر کند. lam-u48-report=error باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی خطا صادر کند. برای Linux/x86_64 پشتیبانی میشود.
- lam-u57-report=none
- lam-u57-report=warning
- lam-u57-report=error
- نحوهٔ گزارشدهی ویژگی مفقود GNU_PROPERTY_X86_FEATURE_1_LAM_U57 در بخش ورودی .note.gnu.property را مشخص میکند. گزینهٔ lam-u57-report=none که پیشفرض است، باعث میشود پیونددهنده ویژگیهای مفقود در فایلهای ورودی را گزارش نکند. گزینهٔ lam-u57-report=warning باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی هشدار صادر کند. lam-u57-report=error باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی خطا صادر کند. برای Linux/x86_64 پشتیبانی میشود.
- lam-report=none
- lam-report=warning
- lam-report=error
- نحوهٔ گزارشدهی ویژگیهای مفقود GNU_PROPERTY_X86_FEATURE_1_LAM_U48 و GNU_PROPERTY_X86_FEATURE_1_LAM_U57 در بخش ورودی .note.gnu.property را مشخص میکند. lam-report=none که پیشفرض است، باعث میشود پیونددهنده ویژگیهای مفقود در فایلهای ورودی را گزارش نکند. گزینهٔ lam-report=warning باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی هشدار صادر کند. lam-report=error باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی خطا صادر کند. برای Linux/x86_64 پشتیبانی میشود.
- lazy
- هنگام تولید یک فایل اجرایی یا کتابخانهٔ اشتراکی، آن را طوری نشانهگذاری میکند که به پیونددهندهٔ پویا اعلام کند حل فراخوانی توابع را به جای زمان بارگذاری، به لحظهٔ فراخوانی تابع (مقیدسازی تنبل) موکول کند. مقیدسازی تنبل حالت پیشفرض است.
- loadfltr
- مشخص میکند که فیلترهای شیء بیدرنگ در زمان اجرا پردازش شوند.
- max-page-size=value
- حداکثر اندازهٔ صفحهٔ حافظهٔ پشتیبانیشده را بر روی value تنظیم میکند.
- mark-plt
- nomark-plt
- مدخلهای PLT را با برچسبهای پویای DT_X86_64_PLT، DT_X86_64_PLTSZ و DT_X86_64_PLTENT علامتگذاری میکند. از آنجا که این گزینه مقداری غیرصفر را در فیلد r_addend بازنشانیهای R_X86_64_JUMP_SLOT ذخیره میکند، فایلهای اجرایی و کتابخانههای اشتراکی حاصل با پیونددهندههای پویایی که فیلد 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
- مشخص میکند که شیء نباید در زمان اجرا تخلیه شود..IP nodlopen 4 مشخص میکند که این شیء برای "dlopen" در دسترس نیست.
- nodump
- مشخص میکند که از این شیء نمیتوان توسط "dldump" روگرفت (dump) تهیه کرد.
- noexecstack
- شیء را بهگونهای علامتگذاری میکند که نیازی به پشتهٔ (stack) قابل اجرا نداشته باشد.
- noextern-protected-data
- هنگام ساخت یک کتابخانهٔ اشتراکی، با نمادهای دادهای حفاظتشده (protected) بهعنوان نمادهای خارجی رفتار نمیکند. این گزینه پیشفرض پسانهٔ پیونددهنده را لغو میکند. میتوان از آن برای رفع مشکل بازنشانیهای نادرست تولیدشده توسط کامپایلر روی نمادهای دادهای حفاظتشده استفاده کرد. بهروزرسانیهای انجامشده روی نمادهای دادهای حفاظتشده توسط ماژولهای دیگر، در کتابخانهٔ اشتراکی حاصل قابل مشاهده نخواهند بود. در i386 و x86-64 پشتیبانی میشود.
- noreloc-overflow
- بررسی سرریز بازنشانی (relocation overflow) را غیرفعال میکند. اگر در زمان اجرا هیچ سرریز بازنشانی پویایی رخ ندهد، میتوان از این گزینه برای غیرفعال کردن بررسی سرریز بازنشانی استفاده کرد. در x86_64 پشتیبانی میشود.
- memory-seal
- nomemory-seal
- به فایل اجرایی یا کتابخانهٔ اشتراکی دستور میدهد که تمام بخشهای (segments) "PT_LOAD" باید مهروموم (seal) شوند تا از دستکاریهای بعدی (مانند تغییر پرچمهای حفاظت، اندازهٔ سگمنت، یا حذف نگاشت) جلوگیری شود. این یک مقاومسازی امنیتی است که به پشتیبانی سیستم نیاز دارد. این گزینه "GNU_PROPERTY_MEMORY_SEAL" را در بخش ".note.gnu.property" ایجاد میکند.
- now
- هنگام تولید یک فایل اجرایی یا کتابخانهٔ اشتراکی، آن را نشانهگذاری میکند تا پیونددهندهٔ پویا ملزم شود تمام نمادها را در هنگام شروع برنامه یا هنگام بارگذاری کتابخانهٔ اشتراکی توسط "dlopen" حل (resolve) کند، بهجای اینکه حل فراخوانی توابع را به زمان اولین فراخوانی آنها موکول کند.
- origin
- مشخص میکند که شیء نیازمند پردازش $ORIGIN در مسیرها است.
- pack-relative-relocs
- nopack-relative-relocs
- تولید بازنشانیهای نسبی فشرده در فایلهای اجرایی مستقل از موقعیت (PIE) و کتابخانههای اشتراکی. این گزینه مدخلهای "DT_RELR"، "DT_RELRSZ" و "DT_RELRENT" را به بخش پویا (dynamic section) اضافه میکند. این گزینه هنگام ساخت فایل اجرایی وابسته به موقعیت و خروجی با قابلیت بازنشانی، نادیده گرفته میشود. 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
- تولید سرآیند بخشها (section header). در صورت استفاده از nosectionheader سرآیند بخشها تولید نمیشود. گزینهٔ sectionheader حالت پیشفرض است.
- separate-code
- noseparate-code
- یک سرآیند سگمنت کدِ مجزای "PT_LOAD" در شیء ایجاد میکند. این گزینه سگمنتی از حافظه را مشخص میکند که فقط باید شامل دستورالعملها (کد) باشد و باید در صفحاتی کاملاً مجزا از هرگونه دادهٔ دیگر قرار گیرد. در صورت استفاده از noseparate-code سگمنت کدِ مجزای "PT_LOAD" ایجاد نمیشود.
- shstk
- شناسهٔ GNU_PROPERTY_X86_FEATURE_1_SHSTK را در بخش .note.gnu.property تولید میکند تا سازگاری با Intel Shadow Stack را نشان دهد. در Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- stack-size=value
- تعیین اندازهٔ پشته برای یک سگمنت ELF از نوع "PT_GNU_STACK". تعیین مقدار صفر، هرگونه ایجاد پیشفرض سگمنت "PT_GNU_STACK" با اندازهٔ غیرصفر را لغو میکند.
- start-stop-gc
- nostart-stop-gc
- هنگامی که --gc-sections فعال باشد، ارجاع از یک بخش نگهداشتهشده به "__start_SECNAME" یا "__stop_SECNAME" باعث میشود تمام بخشهای ورودی با نام "SECNAME" نیز حفظ شوند، مشروط بر اینکه "SECNAME" بهعنوان یک شناسهٔ زبان C قابل نمایش باشد و هر یک از "__start_SECNAME" یا "__stop_SECNAME" توسط پیونددهنده سنتز (ایجاد) شده باشند. گزینهٔ -z start-stop-gc این اثر را غیرفعال میکند و اجازه میدهد بخشها بهگونهای توسط فرایند بازیافت حافظه (garbage collection) جمعآوری شوند که گویی نمادهای سنتزشدهٔ خاص تعریف نشدهاند. گزینهٔ -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 استفاده شود تا این نمادها بین اشیای اشتراکی صادر (export) نشوند، چرا که این موضوع معمولاً مد نظر نیست.
- 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 نادیده گرفته میشوند.
- --no-gnu-tls-tag
- در صورت پیوند با glibc، چنانچه فایلهای شیءِ بازآراییپذیر (relocatable) ورودی تابع "___tls_get_addr" را فراخوانی کنند، وابستگی برچسب نسخهٔ "GLIBC_ABI_GNU_TLS" را به برنامهها و کتابخانههای اشتراکی خروجی اضافه میکند. خروجی در زمان اجرا با نسخهای از 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، چنانچه فایلهای شیءِ بازآراییپذیر ورودی دارای بازآرایی (relocation) "R_386_TLS_DESC_CALL" یا "R_X86_64_TLSDESC_CALL" باشند، وابستگی برچسب نسخهٔ "GLIBC_ABI_GNU2_TLS" را به برنامهها و کتابخانههای اشتراکی خروجی اضافه میکند. خروجی در زمان اجرا با نسخهای از 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 مراجعه کنید.
- --add-needed
- --no-add-needed
- این دو گزینه به دلیل شباهت نامهایشان با گزینههای --as-needed و --no-as-needed منسوخ شدهاند. آنها با گزینههای --copy-dt-needed-entries و --no-copy-dt-needed-entries جایگزین شدهاند.
- -assert keyword
- این گزینه برای سازگاری با SunOS نادیده گرفته میشود.
- -Bdynamic
- -dy
- پیوند با کتابخانههای پویا. این گزینه تنها در بسترهایی معنادار است که از کتابخانههای اشتراکی پشتیبانی میکنند. این گزینه بهطور معمول در چنین بسترهایی پیشفرض است. گونههای مختلف این گزینه برای سازگاری با سیستمهای گوناگون در نظر گرفته شدهاند. میتوانید این گزینه را چندین بار در خط فرمان به کار ببرید: این گزینه بر جستجوی کتابخانه برای گزینههای -l پس از خود اثر میگذارد.
- -Bgroup
- تنظیم پرچم "DF_1_GROUP" در مدخل "DT_FLAGS_1" در بخش پویا (dynamic section). این امر باعث میشود پیونددهندهٔ زمان اجرا جستجوها در این شیء و وابستگیهای آن را تنها درون گروه انجام دهد. گزینهٔ --unresolved-symbols=report-all بهطور ضمنی اعمال میشود. این گزینه تنها در بسترهای ELF با پشتیبانی از کتابخانههای اشتراکی معنادار است.
- -Bstatic
- -dn
- -static
- عدم پیوند با کتابخانههای اشتراکی. این گزینه تنها در بسترهایی معنادار است که از کتابخانههای اشتراکی پشتیبانی میکنند. گونههای مختلف این گزینه برای سازگاری با سیستمهای گوناگون است. میتوانید از این گزینه چندین بار در خط فرمان استفاده کنید: این گزینه بر جستجوی کتابخانه برای گزینههای -l پس از خود اثر میگذارد. این گزینه همچنین بهطور ضمنی --unresolved-symbols=report-all را فعال میکند. این گزینه را میتوان همراه با -shared استفاده کرد. انجام این کار به این معناست که یک کتابخانهٔ اشتراکی ایجاد میشود، اما تمام ارجاعات خارجی کتابخانه باید با گنجاندن مدخلهایی از کتابخانههای ایستا حل شوند.
- -Bsymbolic
- هنگام ایجاد یک کتابخانهٔ اشتراکی، ارجاعات به نمادهای سراسری را در صورت وجود به تعریف درون همان کتابخانهٔ اشتراکی پیوند میدهد (bind). بهطور معمول، این امکان برای برنامهای که با یک کتابخانهٔ اشتراکی پیوند یافته وجود دارد که تعریف درون کتابخانهٔ اشتراکی را بازتعریف (override) کند. این گزینه تنها در بسترهای ELF با پشتیبانی از کتابخانههای اشتراکی معنادار است.
- -Bsymbolic-functions
- هنگام ایجاد یک کتابخانهٔ اشتراکی، ارجاعات به نمادهای توابع سراسری را در صورت وجود به تعریف درون همان کتابخانهٔ اشتراکی پیوند میدهد. این گزینه تنها در بسترهای ELF با پشتیبانی از کتابخانههای اشتراکی معنادار است.
- -Bno-symbolic
- این گزینه میتواند گزینههای -Bsymbolic و -Bsymbolic-functions مشخصشدهٔ قبلی را لغو کند.
- --dynamic-list=dynamic-list-file
- نام یک فایل
فهرست پویا
را به
پیونددهنده
اعلام
میکند. این
گزینه
معمولاً
هنگام
ایجاد
کتابخانههای
اشتراکی
برای تعیین
فهرستی از
نمادهای
سراسری که
ارجاعات
آنها
نباید به
تعریف درون
کتابخانهٔ
اشتراکی
پیوند داده
شود، یا
هنگام ساخت
فایلهای
اجرایی
پیوندیافتهٔ
پویا برای
تعیین
فهرستی از
نمادها که
باید به
جدول
نمادهای
فایل
اجرایی
اضافه
شوند،
کاربرد
دارد. این
گزینه تنها
در بسترهای
ELF با
پشتیبانی
از
کتابخانههای
اشتراکی
معنادار
است.
قالب فهرست پویا همانند گره نسخه (version node) بدون حوزه (scope) و نام گره است. برای اطلاعات بیشتر VERSION را ببینید.
- --dynamic-list-data
- گنجاندن تمام نمادهای دادهای سراسری در فهرست پویا.
- --dynamic-list-cpp-new
- ارائهٔ فهرست پویای توکار برای عملگرهای new و delete در ++C. این گزینه عمدتاً برای ساخت libstdc++ به صورت اشتراکی مفید است..IP --dynamic-list-cpp-typeinfo 4 فهرست پویای توکار را برای شناسایی نوع زمان اجرای ++C (یا همان RTTI) فراهم میکند.
- --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)
خروجی
میدهد. اگر
فایل نگاشت
پیونددهنده
(map file) در حال
تولید
باشد، جدول
ارجاع
متقابل در
آن فایل چاپ
میشود؛ در
غیر این
صورت، در
خروجی
استاندارد
چاپ خواهد
شد.
قالب جدول عمداً ساده است تا در صورت نیاز به آسانی توسط یک اسکریپت پردازش شود. نمادها به صورت مرتبشده بر اساس نام چاپ میشوند. برای هر نماد، فهرستی از نامهای فایل ارائه میشود. اگر نماد تعریف شده باشد، اولین فایل ذکرشده محل تعریف است. اگر نماد به عنوان یک مقدار مشترک (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 symbols)
میشود.
دستور
اسکریپت
"INHIBIT_COMMON_ALLOCATION"
نیز همین
اثر را
دارد.
گزینهٔ --no-define-common اجازه میدهد تصمیم برای تخصیص آدرس به نمادهای مشترک از انتخاب نوع فایل خروجی تفکیک شود؛ در غیر این صورت یک نوع خروجی بدون قابلیت بازآرایی (non-relocatable) تخصیص آدرس به نمادهای مشترک را اجباری میکند. استفاده از --no-define-common باعث میشود نمادهای مشترکی که از یک کتابخانهٔ مشترک به آنها ارجاع شده است، تنها در برنامهٔ اصلی آدرسدهی شوند. این امر فضای تکراری بلااستفاده را در کتابخانهٔ مشترک حذف کرده و همچنین از هرگونه سردرگمی احتمالی در حل به نسخهٔ تکراریِ اشتباه هنگام وجود ماژولهای پویای متعدد با مسیرهای جستجوی خاص جلوگیری میکند.
- --force-group-allocation
- این گزینه پیونددهنده را وادار میکند تا اعضای گروه بخش (section group) را مانند بخشهای ورودی عادی قرار دهد و گروههای بخش را حذف کند. این رفتار پیشفرض برای یک پیوند نهایی است اما میتوان از این گزینه برای تغییر رفتار پیوند با قابلیت بازآرایی (-r) استفاده کرد. دستور اسکریپت "FORCE_GROUP_ALLOCATION" اثری مشابه دارد.
- --defsym=symbol=expression
- یک نماد
سراسری (global symbol)
در فایل
خروجی
ایجاد
میکند که
حاوی آدرس
مطلقی است
که توسط expression
تعیین شده
است.
میتوانید
به تعداد
نیاز از این
گزینه برای
تعریف
نمادهای
متعدد در خط
فرمان
استفاده
کنید. شکل
محدودی از
محاسبات
ریاضی برای
expression در این
زمینه
پشتیبانی
میشود:
میتوانید
یک مقدار
ثابت
هگزادسیمال
یا نام یک
نماد موجود
را وارد
کنید، یا از
"+" و
"-" برای
جمع یا
تفریق
ثوابت
هگزادسیمال
یا نمادها
بهره ببرید.
اگر به
عبارات
پیچیدهتری
نیاز
دارید،
استفاده از
زبان
دستورات
پیونددهنده
از طریق
اسکریپت را
در نظر
بگیرید.
نکته:
نباید هیچ
فاصلهای
بین symbol،
علامت
مساوی («=»)
و expression وجود
داشته باشد.
پیونددهنده آرگومانهای --defsym و -T را به ترتیب پردازش میکند؛ قرار دادن --defsym قبل از -T نماد را پیش از پردازش اسکریپت پیونددهنده از -T تعریف میکند، در حالی که قرار دادن --defsym بعد از -T نماد را پس از پردازش اسکریپت پیونددهنده تعریف خواهد کرد. این تفاوت برای عباراتی در اسکریپت پیونددهنده که از نمادهای --defsym استفاده میکنند پیامدهایی دارد؛ انتخاب ترتیب صحیح به هدف مورد نظر شما بستگی دارد.
- --demangle[=style]
- --no-demangle
- این گزینهها تعیین میکنند که آیا نام نمادها در پیامهای خطا و سایر خروجیها ناهموارزدایی (demangle) شوند یا خیر. هنگامی که به پیونددهنده دستور ناهموارزدایی داده میشود، تلاش میکند نام نمادها را به شکلی خوانا نمایش دهد: اگر در قالب فایل شیء از زیرخطهای ابتدایی استفاده شده باشد آنها را حذف میکند و نامهای درهمریختهٔ (mangled) نمادهای ++C را به نامهای قابل خواندن برای کاربر تبدیل مینماید. کامپایلرهای مختلف شیوههای درهمریزی متفاوتی دارند. آرگومان اختیاری شیوه میتواند برای انتخاب شیوهٔ ناهموارزدایی متناسب با کامپایلر شما استفاده شود. پیونددهنده به طور پیشفرض ناهموارزدایی را انجام میدهد مگر اینکه متغیر محیطی COLLECT_NO_DEMANGLE تنظیم شده باشد. این گزینهها میتوانند برای بازنویسی رفتار پیشفرض به کار روند.
- -Ifile
- --dynamic-linker=file
- نام پیونددهندهٔ پویا را تعیین میکند. این گزینه تنها هنگام تولید فایلهای اجرایی ELF با پیوند پویا کاربرد دارد. پیونددهندهٔ پویای پیشفرض معمولاً صحیح است؛ از این گزینه استفاده نکنید مگر اینکه بدانید دقیقاً چه کاری انجام میدهید.
- --no-dynamic-linker
- هنگام تولید یک فایل اجرایی، درخواست پیونددهندهٔ پویا برای استفاده در زمان بارگذاری را نادیده میگیرد. این گزینه تنها برای فایلهای اجرایی ELF که شامل بازآراییهای پویا هستند کاربرد دارد، و معمولاً نیازمند کد نقطهٔ ورودی (entry point) است که قادر به پردازش این بازآراییها باشد.
- --embedded-relocs
- این گزینه مشابه گزینهٔ --emit-relocs است، با این تفاوت که بازآراییها در بخشی خاصِ هدف ذخیره میشوند. این گزینه تنها توسط هدفهای BFIN، CR16 و M68K پشتیبانی میشود.
- --disable-multiple-abs-defs
- تعاریف چندگانه برای نمادهای موجود در فایل فراخوانیشده توسط -R یا --just-symbols را مجاز نمیداند.
- --fatal-warnings
- --no-fatal-warnings
- تمام هشدارها را به عنوان خطا در نظر میگیرد. رفتار پیشفرض را میتوان با گزینهٔ --no-fatal-warnings بازگرداند..IP -w 4
- --no-warnings
- هیچ پیام هشدار یا خطایی را نمایش نمیدهد. این گزینه در صورت فعال بودن --fatal-warnings، اثر آن را لغو میکند. این گزینه زمانی میتواند به کار رود که مشخص است فایل باینری خروجی کار نخواهد کرد، اما همچنان نیاز به ایجاد آن وجود دارد.
- --force-exe-suffix
- اطمینان
حاصل
میکند که
فایل خروجی
دارای
پسوند .exe
باشد.
اگر یک فایل خروجی با پیوند کامل که با موفقیت ساخته شده است، پسوند ".exe" یا ".dll" نداشته باشد، این گزینه پیونددهنده را وادار میکند تا فایل خروجی را در فایلی با همان نام و پسوند ".exe" رونوشت کند. این گزینه هنگام استفاده از makefileهای دستنخوردهٔ Unix در یک میزبان Microsoft Windows مفید است، چرا که برخی نسخههای Windows یک ایمیج را اجرا نمیکنند مگر اینکه به پسوند ".exe" ختم شود.
- --gc-sections
- --no-gc-sections
- جمعآوری
زبالهٔ
بخشهای
ورودی
استفادهنشده
را فعال
میکند. این
گزینه روی
مقصدهایی
که از آن
پشتیبانی
نمیکنند
نادیده
گرفته
میشود.
رفتار
پیشفرض
(عدم انجام
این
جمعآوری
زباله) را
میتوان با
تعیین --no-gc-sections
در خط فرمان
بازگرداند.
توجه داشته
باشید که
جمعآوری
زباله برای
مقصدهای با
قالب COFF و PE
پشتیبانی
میشود،
اما
پیادهسازی
آن در حال
حاضر
آزمایشی در
نظر گرفته
میشود.
گزینهٔ --gc-sections با بررسی نمادها و بازنشانیها تصمیم میگیرد که کدام بخشهای ورودی استفاده شدهاند. بخشی که حاوی نماد ورود (entry symbol) است و تمام بخشهای حاوی نمادهایی که در خط فرمان تعریف نشدهاند نگهداشته خواهند شد، و همینطور بخشهایی که حاوی نمادهای ارجاعشده توسط اشیاء پویا هستند. توجه داشته باشید که هنگام ساخت کتابخانههای مشترک، پیونددهنده باید فرض کند که به هر نماد قابلمشاهدهای ارجاع داده شده است. پس از تعیین این مجموعهٔ اولیه از بخشها، پیونددهنده بهطور بازگشتی هر بخشی را که توسط بازنشانیهای آنها ارجاع داده شده باشد بهعنوان استفادهشده نشانهگذاری میکند. گزینههای --entry، --undefined، و --gc-keep-exported را ببینید.
این گزینه میتواند هنگام انجام یک پیوند جزئی (فعالشده با گزینهٔ -r) نیز تنظیم شود. در این حالت، ریشهٔ نمادهای نگهداشتهشده باید صراحتاً توسط یکی از گزینههای --entry، --undefined، یا --gc-keep-exported، و یا با دستور "ENTRY" در اسکریپت پیونددهنده مشخص شود.
بهعنوان یک افزونهٔ GNU، بخشهای ورودی ELF که با پرچم "SHF_GNU_RETAIN" علامتگذاری شده باشند مشمول جمعآوری زباله نخواهند شد.
- --print-gc-sections
- --no-print-gc-sections
- فهرست تمام بخشهای حذفشده توسط جمعآوری زباله را ارائه میدهد. این فهرست در stderr چاپ میشود. این گزینه تنها در صورتی مؤثر است که جمعآوری زباله از طریق گزینهٔ --gc-sections فعال شده باشد. رفتار پیشفرض (فهرست نکردن بخشهای حذفشده) را میتوان با تعیین --no-print-gc-sections در خط فرمان بازگرداند.
- --gc-keep-exported
- هنگامی که --gc-sections فعال باشد، این گزینه از جمعآوری زبالهٔ بخشهای ورودی استفادهنشدهای که حاوی نمادهای سراسری با پدیداری پیشفرض یا محافظتشده هستند جلوگیری میکند. این گزینه برای فایلهای اجرایی کاربرد دارد که در غیر این صورت، بخشهای ارجاعدادهنشده صرفنظر از پدیداری خارجی نمادهای موجود، جمعآوری زباله میشدند. توجه داشته باشید که این گزینه هنگام پیوند اشیاء مشترک (shared objects) هیچ تأثیری ندارد، زیرا این رفتار از پیش رفتار پیشفرض آنها است. این گزینه فقط برای مقصدهای با قالب ELF پشتیبانی میشود.
- --print-output-format
- نام قالب خروجی پیشفرض را چاپ میکند (که ممکن است تحت تأثیر دیگر گزینههای خط فرمان قرار گرفته باشد). این همان رشتهای است که در دستور اسکریپت پیونددهندهٔ "OUTPUT_FORMAT" ظاهر میشود.
- --print-memory-usage
- اندازهٔ
مصرفشده،
اندازهٔ
کل، و میزان
استفادهٔ
ناحیههای
حافظهٔ
ایجادشده
با دستور MEMORY
را چاپ
میکند. این
گزینه در
مقصدهای
تعبیهشده
برای داشتن
یک دید سریع
از مقدار
حافظهٔ
آزاد مفید
است. قالب
خروجی
دارای یک
سطر عنوان و
یک خط به
ازای هر
ناحیه است.
این خروجی
هم برای
انسان
خوانا است و
هم
بهراحتی
توسط
ابزارها
قابل تجزیه
است.
نمونهای
از خروجی به
شکل زیر
است:
Memory region Used Size Region Size %age Used ROM: 256 KB 1 MB 25.00% RAM: 32 B 2 GB 0.00%نکته: اگر میخواهید از میزان مصرف حافظه توسط خودِ پیونددهنده مطلع شوید، گزینهٔ --stats این کار را انجام میدهد.
- --help
- خلاصهای از گزینههای خط فرمان را در خروجی استاندارد چاپ کرده و خارج میشود.
- --target-help
- خلاصهای از تمام گزینههای ویژهٔ مقصد را در خروجی استاندارد چاپ کرده و خارج میشود.
- -Map=mapfile
- یک نگاشت
پیوند (link map) را
در فایل mapfile
چاپ میکند.
توضیحات
گزینهٔ -M
در بالا را
ببینید. اگر
mapfile صرفاً
نویسهٔ
"-"
باشد،
نگاشت در stdout
نوشته
خواهد شد.
مشخص کردن یک دایرکتوری به عنوان mapfile باعث میشود نگاشت پیونددهنده به صورت یک فایل در داخل آن دایرکتوری نوشته شود. معمولاً نام فایل در داخل دایرکتوری به صورت نام پایهٔ (basename) فایل output به همراه پسوند افزودهٔ ".map" محاسبه میشود. با این حال، اگر نویسهٔ ویژهٔ "%" استفاده شود، این نویسه با مسیر کامل فایل خروجی جایگزین خواهد شد. علاوه بر این، اگر نویسهای بعد از نماد % بیاید، دیگر ".map" اضافه نخواهد شد.
-o foo.exe -Map=bar [Creates ./bar] -o ../dir/foo.exe -Map=bar [Creates ./bar] -o foo.exe -Map=../dir [Creates ../dir/foo.exe.map] -o ../dir2/foo.exe -Map=../dir [Creates ../dir/foo.exe.map] -o foo.exe -Map=% [Creates ./foo.exe.map] -o ../dir/foo.exe -Map=% [Creates ../dir/foo.exe.map] -o foo.exe -Map=%.bar [Creates ./foo.exe.bar] -o ../dir/foo.exe -Map=%.bar [Creates ../dir/foo.exe.bar] -o ../dir2/foo.exe -Map=../dir/% [Creates ../dir/../dir2/foo.exe.map] -o ../dir2/foo.exe -Map=../dir/%.bar [Creates ../dir/../dir2/foo.exe.bar]
مشخص کردن بیش از یک نویسهٔ "%" خطا است.
اگر فایل نگاشت از قبل وجود داشته باشد، با این عملیات بازنویسی خواهد شد.
- --no-keep-memory
- ld به طور معمول با ذخیرهٔ جدول نمادهای فایلهای ورودی در حافظهٔ موقت، سرعت را بر میزان مصرف حافظه اولویت میدهد. این گزینه به ld اعلام میکند که در عوض، با خواندن دوبارهٔ جدولهای نماد در صورت نیاز، مصرف حافظه را بهینهسازی کند. این امر ممکن است زمانی که ld هنگام پیوند یک فایل اجرایی بزرگ با کمبود فضای حافظه مواجه میشود، لازم باشد.
- --no-undefined
- -z defs
- ارجاعهای
حلنشده به
نمادها را
از
فایلهای
شیء معمولی
گزارش
میکند. این
کار حتی اگر
پیونددهنده
در حال
ایجاد یک
کتابخانه
مشترک
غیرنمادین
(non-symbolic) باشد نیز
انجام
میشود.
سوئیچ
--[no-]allow-shlib-undefined
رفتار
گزارش
ارجاعهای
حلنشدهٔ
موجود در
کتابخانههای
مشترکِ در
حال پیوند
را کنترل
میکند.
اثرات این گزینه را میتوان با استفاده از "-z undefs" خنثی کرد.
- --allow-multiple-definition
- -z muldefs
- به طور معمول زمانی که یک نماد چندین بار تعریف شده باشد، پیونددهنده یک خطای مهلک گزارش میکند. این گزینهها تعریفهای چندگانه را مجاز میشمارند و از اولین تعریف استفاده خواهد شد.
- --allow-shlib-undefined
- --no-allow-shlib-undefined
- نمادهای
تعریفنشده
در
کتابخانههای
مشترک را
مجاز یا
غیرمجاز
میکند. این
سوئیچ شبیه
به --no-undefined است،
با این
تفاوت که
رفتار
مربوط به
زمانی را
مشخص
میکند که
نمادهای
تعریفنشده
در یک
کتابخانه
مشترک
هستند، نه
یک فایل شیء
معمولی. این
گزینه بر
نحوهٔ
رسیدگی به
نمادهای
تعریفنشده
در
فایلهای
شیء معمولی
اثری ندارد.
رفتار پیشفرض این است که اگر پیونددهنده برای ساخت یک فایل اجرایی به کار رود، برای هر نماد تعریفنشده که در کتابخانههای مشترک به آن ارجاع شده خطا گزارش کند، اما اگر پیونددهنده برای ایجاد یک کتابخانه مشترک به کار رود، آنها را مجاز بداند.
دلایل مجاز دانستن ارجاع به نمادهای تعریفنشده در کتابخانههای مشترک مشخصشده در زمان پیوند عبارتند از اینکه:
- •
- برخی
سیستمعاملها
مانند BeOS و HPPA
وجود دارند
که در آنها
نمادهای
تعریفنشده
در
کتابخانههای
اشتراکی
امری عادی
است.
به عنوان مثال، هسته BeOS کتابخانههای اشتراکی را در زمان بارگذاری پچ میکند تا هر تابعی را که برای معماری فعلی مناسبتر است انتخاب کند. این کار، برای نمونه، جهت انتخاب پویای یک تابع مناسب memset استفاده میشود.
- --error-handling-script=scriptname
- اگر این
گزینه مشخص
شود، هرگاه
خطایی رخ
دهد،
پیونددهنده
scriptname را
فراخوانی
میکند. با
این حال در
حال حاضر
تنها دو نوع
خطا
پشتیبانی
میشوند:
نمادهای
مفقود و
کتابخانههای
مفقود. دو
آرگومان به
اسکریپت
ارسال
خواهد شد:
کلیدواژه
"undefined-symbol" یا `missing-lib" و
name نماد
تعریفنشده
یا
کتابخانه
مفقود. هدف
این است که
اسکریپت
پیشنهادهایی
را در خصوص
اینکه نماد
یا
کتابخانه
ممکن است
کجا یافت
شود به
کاربر
ارائه دهد.
پس از پایان
اجرای
اسکریپت،
پیام خطای
معمول
پیونددهنده
نمایش داده
خواهد شد.
در دسترس بودن این گزینه توسط یک سوییچ در زمان پیکربندی کنترل میشود، بنابراین ممکن است در پیادهسازیهای خاصی موجود نباشد.
- --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
- ایجاد یک کتابخانه واردات در file متناظر با فایل اجرایی که پیونددهنده در حال تولید آن است (مانند یک DLL یا برنامه ELF). این کتابخانه واردات (که برای DLLها باید "*.dll.a" یا "*.a" نامیده شود) ممکن است برای پیوند دادن کلاینتها با فایل اجرایی تولیدشده استفاده شود؛ این رفتار امکان صرفنظر کردن از مرحله مجزای ایجاد کتابخانه واردات (مانند "dlltool" برای DLLها) را فراهم میسازد. این گزینه تنها برای پورتهای پیونددهندهای که هدف آنها i386 PE و ELF است در دسترس میباشد.
- -pie
- --pic-executable
- ایجاد یک فایل اجرایی مستقل از موقعیت. این قابلیت در حال حاضر تنها روی بسترهای ELF پشتیبانی میشود. فایلهای اجرایی مستقل از موقعیت توسط پیونددهنده پویا به نشانی مجازی که سیستمعامل برای آنها انتخاب میکند، بازنشانی میشوند که میتواند بین دفعات مختلف اجرا متفاوت باشد. آنها در سربرگ فایل ELF با ET_DYN علامتگذاری میشوند، اما از جهات متعددی با کتابخانههای اشتراکی تفاوت دارند. بهویژه، نمادهای تعریفشده در یک PIE بهطور پیشفرض برخلاف کتابخانههای اشتراکی نمیتوانند توسط شیء دیگری رونویسی شوند.
- -no-pie
- ایجاد یک فایل اجرایی وابسته به موقعیت. این حالت پیشفرض است.
- -qmagic
- این گزینه برای سازگاری با Linux نادیده گرفته میشود.
- -Qy
- این گزینه برای سازگاری با SVR4 نادیده گرفته میشود.
- --relax
- --no-relax
- گزینهای
با اثرات
وابسته به
ماشین. این
گزینه فقط
روی چند
مقصد
پشتیبانی
میشود.
در برخی بسترها، گزینه --relax بهینهسازیهای سراسری و مختص مقصدی را انجام میدهد که با حل کردن آدرسدهیها در برنامه توسط پیونددهنده ممکن میشوند؛ مانند سادهسازی حالتهای آدرسدهی، ایجاد دستورالعملهای جدید، انتخاب نسخههای کوتاهتر از دستورالعملهای فعلی، و ادغام مقادیر ثابت.
در برخی بسترها، این بهینهسازیهای سراسری در زمان پیوند ممکن است خطایابی نمادین فایل اجرایی حاصل را غیرممکن سازند. مشخص شده است که این مورد برای خانواده پردازندههای Matsushita MN10200 و MN10300 رخ میدهد.
در بسترهایی که این ویژگی پشتیبانی میشود، گزینه --no-relax آن را غیرفعال خواهد کرد.
در بسترهایی که این ویژگی پشتیبانی نمیشود، هر دو گزینه --relax و --no-relax پذیرفته میشوند، اما نادیده گرفته خواهند شد.
- --retain-symbols-file=filename
- فقط
نگهداشتن
نمادهای
فهرستشده
در فایل filename و
کنار
گذاشتن
سایر
نمادها. filename
صرفاً یک
فایل متنی
ساده است که
در هر خط آن
یک نام نماد
قرار دارد.
این گزینه
بهویژه در
محیطهایی
(مانند VxWorks) که
یک جدول
نمادهای
سراسری
بزرگ
بهتدریج
انباشته
میشود،
برای
صرفهجویی
در حافظه
زمان اجرا
مفید است.
گزینه --retain-symbols-file نمادهای تعریفنشده یا نمادهای مورد نیاز برای بازنشانیها را کنار نمیگذارد.
شما تنها میتوانید یک بار --retain-symbols-file را در خط فرمان مشخص کنید. این گزینه بر -s و -S اولویت دارد و آنها را لغو میکند.
- -rpath=dir
- افزودن یک
دایرکتوری
به مسیر
جستجوی
کتابخانه
در زمان
اجرا. این
گزینه
هنگام
پیوند دادن
یک فایل
اجرایی ELF با
اشیاء
اشتراکی
استفاده
میشود.
تمام
آرگومانهای
-rpath به
یکدیگر
الحاق شده و
به
پیونددهنده
زمان اجرا
ارسال
میشوند که
از آنها
برای
مکانیابی
اشیاء
اشتراکی در
زمان اجرا
استفاده
میکند.
گزینه -rpath همچنین هنگام مکانیابی اشیاء اشتراکی که مورد نیاز اشیاء اشتراکی صریحاً گنجاندهشده در پیوند هستند، به کار میرود؛ توضیحات مربوط به گزینه -rpath-link را ببینید. جستجوی -rpath به این روش تنها توسط پیونددهندههای بومی و پیونددهندههای متقاطع که با گزینه --with-sysroot پیکربندی شدهاند پشتیبانی میشود.
اگر هنگام پیوند یک فایل اجرایی ELF از -rpath استفاده نشود، در صورت تعریف بودن متغیر محیطی "LD_RUN_PATH"، محتویات آن به کار گرفته خواهد شد.
گزینه -rpath میتواند روی SunOS نیز استفاده شود. بهطور پیشفرض، در SunOS، پیونددهنده یک مسیر جستجوی زمان اجرا را از تمام گزینههای -L دادهشده به آن تشکیل میدهد. اگر گزینه -rpath استفاده شود، مسیر جستجوی زمان اجرا منحصراً با استفاده از گزینههای -rpath و بدون توجه به گزینههای -L تشکیل خواهد شد. این ویژگی میتواند هنگام استفاده از gcc مفید باشد، چرا که گزینههای -L زیادی را میافزاید که ممکن است روی سیستمهای فایل متصلشده از طریق NFS قرار داشته باشند.
برای سازگاری با سایر پیونددهندههای ELF، اگر پس از گزینه -R یک نام دایرکتوری بیاید نه یک نام فایل، با آن مانند گزینه -rpath رفتار میشود..IP -rpath-link=dir 4 هنگام استفاده از ELF یا SunOS، ممکن است یک کتابخانه اشتراکی به کتابخانه دیگری نیاز داشته باشد. این اتفاق زمانی رخ میدهد که یک پیوند "ld -shared" شامل یک کتابخانه اشتراکی به عنوان یکی از فایلهای ورودی باشد.
هنگامی که پیونددهنده در زمان انجام یک پیوند غیر اشتراکی و غیر قابل بازمکانیابی (non-relocatable) با چنین وابستگی مواجه میشود، در صورتی که کتابخانه اشتراکی مورد نیاز به صورت صریح گنجانده نشده باشد، به طور خودکار سعی میکند آن را پیدا کرده و در پیوند بگنجاند. در چنین حالتی، چندین دایرکتوری به شرح زیر جستجو میشوند. گزینه -rpath-link نخستین مجموعه از دایرکتوریها را برای جستجو مشخص میکند. این گزینه میتواند دنبالهای از نامهای دایرکتوری را چه با ارائه فهرستی از نامها که با دو نقطه از هم جدا شدهاند، یا با تکرار چندین باره این گزینه، مشخص کند.
نشانههای $ORIGIN و $LIB میتوانند در این دایرکتوریهای جستجو ظاهر شوند. این نشانهها با مسیر کامل به دایرکتوری حاوی برنامه یا شیء اشتراکی در مورد $ORIGIN، و با lib - برای باینریهای ۳۲ بیتی - یا lib64 - برای باینریهای ۶۴ بیتی - در مورد $LIB جایگزین خواهند شد.
فرم جایگزین این نشانهها - ${ORIGIN} و ${LIB} - نیز میتواند استفاده شود. نشانه $PLATFORM پشتیبانی نمیشود.
گزینه --rpath-link باید با احتیاط استفاده شود، چرا که مسیر جستجویی را که ممکن است به صورت سخت در یک کتابخانه اشتراکی کامپایل شده باشد بازنویسی میکند. در چنین حالتی این امکان وجود دارد که ناخواسته از مسیر جستجوی متفاوتی نسبت به آنچه پیونددهنده زمان اجرا استفاده میکرد، استفاده شود.
هنگامی که کتابخانههای اشتراکی اضافی مورد نیاز باشند، پیونددهنده دایرکتوریها را به ترتیبی که در زیر آمده است برای یافتن آنها جستجو میکند. با این حال توجه داشته باشید که این موضوع فقط برای کتابخانههای اضافیِ مورد نیاز جهت برآورده کردن وابستگیهای کتابخانههای اشتراکی از پیش گنجانده شده صدق میکند. این مورد شامل کتابخانههایی که از طریق گزینه خط فرمان -l گنجانده شدهاند نمیشود. جستجو برای کتابخانههای -l تنها در دایرکتوریهای مشخصشده توسط گزینه -L انجام میشود.
- 1.
- هر دایرکتوری مشخصشده با گزینههای -rpath-link.
- 2.
- هر دایرکتوری مشخصشده با گزینههای -rpath. تفاوت میان -rpath و -rpath-link در این است که دایرکتوریهای مشخصشده با گزینههای -rpath در فایل اجرایی گنجانده شده و در زمان اجرا استفاده میشوند، در حالی که گزینه -rpath-link تنها در زمان پیوند مؤثر است. جستجوی -rpath به این روش تنها توسط پیونددهندههای بومی (native) و پیونددهندههای متقاطع (cross linkers) که با گزینه --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=<path> پیکربندی شده باشد، هر رشته "prefix" نیز پیشوند آن خواهد شد.
- 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.*) } }مزیت فایل ترتیببندی بخش این است که میتوان از آن برای مرتبسازی آن بخشهایی که برای کاربر اهمیت دارند استفاده کرد، بدون نیاز به نگرانی درباره بخشهای دیگر، یا نواحی حافظه، یا هر چیز دیگری.
- یک کتابخانه اشتراکی ایجاد میکند. این مورد در حال حاضر تنها روی بسترهای ELF، XCOFF و SunOS پشتیبانی میشود. در SunOS، اگر از گزینه -e استفاده نشده باشد و نمادهای تعریفنشده در پیوند وجود داشته باشند، پیونددهنده به طور خودکار یک کتابخانه اشتراکی ایجاد میکند.
- --sort-common
- --sort-common=ascending
- --sort-common=descending
- این گزینه به ld میگوید که هنگام قرار دادن نمادهای عمومی (common symbols) در بخشهای خروجی مناسب، آنها را بر اساس تراز (alignment) به ترتیب صعودی یا نزولی مرتب کند. تراز نمادهای در نظر گرفته شده شانزده بایتی یا بزرگتر، هشت بایتی، چهار بایتی، دو بایتی و یک بایتی هستند. این کار برای جلوگیری از ایجاد شکاف بین نمادها به دلیل محدودیتهای تراز است. اگر هیچ ترتیبی برای مرتبسازی مشخص نشود، ترتیب نزولی در نظر گرفته میشود.
- --sort-section=name
- این گزینه "SORT_BY_NAME" را برای همه الگوهای نویسهعام بخش در اسکریپت پیونددهنده اعمال میکند.
- --sort-section=alignment
- این گزینه "SORT_BY_ALIGNMENT" را برای همه الگوهای نویسهعام بخش در اسکریپت پیونددهنده اعمال میکند.
- --spare-dynamic-tags=count
- این گزینه تعداد جایگاههای خالی برای باقی گذاشتن در بخش .dynamic از اشیاء اشتراکی ELF را مشخص میکند. ممکن است جایگاههای خالی توسط ابزارهای پسپردازش مانند prelinker مورد نیاز باشند. مقدار پیشفرض ۵ است..IP --split-by-file[=size] 4 مشابه --split-by-reloc است اما زمانی که به size برسد، یک بخش خروجی جدید برای هر فایل ورودی ایجاد میکند. در صورت مشخص نشدن، مقدار پیشفرض size برابر با ۱ است.
- --split-by-reloc[=count]
- تلاش میکند تا بخشهای اضافی در فایل خروجی ایجاد کند تا هیچ بخش خروجی منفردی در فایل شامل بیش از count بازآرایی (relocation) نباشد. این گزینه هنگام تولید فایلهای بازآراییپذیر بزرگ برای بارگذاری در برخی هستههای بلادرنگ (real-time) با قالب فایل شیء COFF مفید است؛ چرا که COFF نمیتواند بیش از ۶۵۵۳۵ بازآرایی را در یک بخش منفرد نمایش دهد. توجه داشته باشید که این گزینه برای قالبهای فایل شیء که از بخشهای دلخواه پشتیبانی نمیکنند کار نخواهد کرد. پیونددهنده بخشهای ورودی منفرد را برای توزیع مجدد تقسیم نمیکند، بنابراین اگر یک بخش ورودی منفرد شامل بیش از count بازآرایی باشد، یک بخش خروجی نیز شامل همان تعداد بازآرایی خواهد بود. مقدار پیشفرض count برابر با ۳۲۷۶۸ است.
- --stats[=filename]
- محاسبه و
نمایش
آماری
درباره
عملکرد
پیونددهنده،
مانند زمان
اجرا و
میزان مصرف
حافظه.
اگر آرگومان اختیاری filename ارائه نشود، تنها اطلاعات پایهای گزارش شده و به جریان خروجی خطای استاندارد ارسال میشود. اگر آرگومان filename داده شود، اطلاعات تکمیلی در فایل مشخصشده نوشته میشود. اگر filename صرفاً روی نماد - تنظیم شود، اطلاعات تکمیلی به جریان خروجی استاندارد فرستاده میشود. اگر filename با + آغاز شود، فایل بهجای بازنویسی، در حالت الحاق (append) باز میشود.
اگر گزینه -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 علامتگذاری میشود تا تضمین شود که نشانی نخستین بایت قطعه text در زمان اجرا حتماً org خواهد بود.
- -Trodata-segment=org
- هنگام ایجاد یک فایل اجرایی ELF یا یک شیء مشترک (shared object) برای مقصدی که در آن دادههای فقط-خواندنی در قطعهای جداگانه و مجزا از بخش کد اجرایی (text) قرار دارند، نشانی نخستین بایت قطعه دادههای فقط-خواندنی را تنظیم میکند.
- -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 میتواند این حالت را به یک هشدار تبدیل کند.
- --verbose[=NUMBER]
- شماره نسخهٔ ld را نمایش داده و شبیهسازیهای پیونددهندهٔ پشتیبانیشده را فهرست میکند. نمایش میدهد که کدام فایلهای ورودی را میتوان باز کرد و کدامها را نمیتوان باز کرد. اسکریپت پیونددهندهای که در حال استفاده توسط پیونددهنده است را نمایش میدهد. اگر آرگومان اختیاری NUMBER بزرگتر از ۱ باشد (> 1)، وضعیت نمادهای پلاگین نیز نمایش داده خواهد شد.
- --version-script=version-scriptfile
- نام یک اسکریپت نسخه را برای پیونددهنده مشخص میکند. این گزینه معمولاً هنگام ایجاد کتابخانههای اشتراکی برای مشخص کردن اطلاعات بیشتر دربارهٔ سلسلهمراتب نسخه برای کتابخانهٔ در حال ایجاد به کار میرود. این گزینه تنها روی بسترهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند به طور کامل پشتیبانی میشود؛ بخش VERSION را ببینید. در بسترهای PE پشتیبانی جزئی دارد، که میتوانند از اسکریپتهای نسخه برای پالایش پدیداری نمادها در حالت auto-export استفاده کنند: هر نمادی که در اسکریپت نسخه با عنوان local علامتگذاری شده باشد صادر نخواهد شد.
- --warn-common
- هنگامی که
یک نماد
مشترک با یک
نماد مشترک
دیگر یا با
تعریف یک
نماد ترکیب
میشود،
هشدار
میدهد.
پیونددهندههای
یونیکس این
شیوهٔ تا
حدی نادقیق
را مجاز
میدانند،
اما
پیونددهندهها
در برخی از
سیستمعاملهای
دیگر
اجازهٔ آن
را
نمیدهند.
این گزینه
به شما
امکان
میدهد
مشکلات
بالقوه
ناشی از
ترکیب
نمادهای
سراسری را
بیابید.
متأسفانه
برخی از
کتابخانههای
C از این
شیوه
استفاده
میکنند،
بنابراین
ممکن است
هشدارهایی
دربارهٔ
نمادهای
موجود در
کتابخانهها
و همچنین در
برنامههای
خود دریافت
کنید.
سه نوع نماد سراسری وجود دارد که در اینجا با مثالهای C نشان داده شدهاند:
- int i = 1;
- یک تعریف، که در بخش دادههای مقداردهیشدهٔ فایل خروجی قرار میگیرد.
- extern int i;
- یک ارجاع تعریفنشده، که فضایی تخصیص نمیدهد. باید در جایی تعریفی یا نمادی مشترک برای این متغیر وجود داشته باشد.
- int i;
- یک نماد مشترک. اگر برای یک متغیر تنها (یک یا چند) نماد مشترک وجود داشته باشد، در ناحیهٔ دادههای مقداردهینشدهٔ فایل خروجی قرار میگیرد. پیونددهنده چندین نماد مشترک برای یک متغیر یکسان را در یک نماد واحد ادغام میکند. اگر اندازههای متفاوتی داشته باشند، بزرگترین اندازه را انتخاب میکند. در صورتی که تعریفی از همان متغیر وجود داشته باشد، پیونددهنده نماد مشترک را به یک اعلان تبدیل میکند.
گزینهٔ --warn-common میتواند پنج نوع هشدار تولید کند. هر هشدار شامل یک جفت خط است: خط نخست نمادی را توصیف میکند که بهتازگی با آن مواجه شده است، و خط دوم نماد قبلی مواجهشده با همان نام را توصیف میکند. یک یا هر دو نماد، یک نماد مشترک خواهند بود.
- 1.
- تبدیل یک
نماد مشترک
به یک
ارجاع،
زیرا
پیشتر
تعریفی
برای این
نماد وجود
دارد.
<file>(<section>): warning: common of `<symbol>' overridden by definition <file>(<section>): warning: defined here
- 2.
- تبدیل یک
نماد مشترک
به یک
ارجاع،
زیرا بعداً
تعریفی
برای این
نماد دیده
میشود. این
حالت مانند
مورد قبلی
است، با این
تفاوت که
ترتیب
مواجهه با
نمادها
متفاوت است.
<file>(<section>): warning: definition of `<symbol>' overriding common <file>(<section>): warning: common is here
- 3.
- ادغام یک
نماد مشترک
با یک نماد
مشترک
قبلیِ
هماندازه.
<file>(<section>): warning: multiple common of `<symbol>' <file>(<section>): warning: previous common is here
- 4.
- ادغام یک
نماد مشترک
با یک نماد
مشترک
قبلیِ
بزرگتر.
<file>(<section>): warning: common of `<symbol>' overridden by larger common <file>(<section>): warning: larger common is here
- 5.
- ادغام یک
نماد مشترک
با یک نماد
مشترک
قبلیِ
کوچکتر.
این حالت
مانند مورد
قبلی است،
با این
تفاوت که
ترتیب
مواجهه با
نمادها
متفاوت است.
<file>(<section>): warning: common of `<symbol>' overriding smaller common <file>(<section>): warning: smaller common is here
- --warn-constructors
- اگر از هرگونه سازندهٔ سراسری استفاده شده باشد، هشدار میدهد. این گزینه تنها برای معدودی از قالبهای فایل شیء مفید است. برای قالبهایی مانند COFF یا ELF، پیونددهنده نمیتواند استفاده از سازندههای سراسری را تشخیص دهد.
- --warn-execstack
- --warn-execstack-objects
- --no-warn-execstack
- در بسترهای ELF، اگر از پیونددهنده خواسته شود فایلی خروجی ایجاد کند که حاوی یک پشتهٔ قابل اجرا باشد، ممکن است پیامهای هشدار تولید کند. سه حالت ممکن وجود دارد:
- 1.
- هیچ هشداری تولید نشود.
- 2.
- همیشه هشدار تولید شود، حتی اگر پشتهٔ قابل اجرا از طریق گزینهٔ خط فرمان -z execstack درخواست شده باشد.
- 3.
- تنها زمانی هشدار تولید شود که یک فایل شیء درخواست پشتهٔ قابل اجرا کند، اما نه در حالتی که از گزینهٔ -z execstack استفاده شده باشد.
وضعیت پیشفرض به نحوهٔ پیکربندی پیونددهنده در زمان ساخت بستگی دارد. گزینهٔ --no-warn-execstack همیشه پیونددهنده را در وضعیت بدون هشدار قرار میدهد. گزینهٔ --warn-execstack پیونددهنده را در وضعیت هشدار همیشگی قرار میدهد. گزینهٔ --warn-execstack-objects پیونددهنده را در وضعیت هشدار فقط برای فایلهای شیء قرار میدهد.
نکته: فایلهای ورودی با قالب ELF میتوانند با داشتن یک بخش .note.GNU-stack که بیت قابل اجرا در پرچمهای بخش آن تنظیم شده است، مشخص کنند که به یک پشتهٔ قابل اجرا نیاز دارند. آنها میتوانند با داشتن همان بخش بدون تنظیم بودن بیت پرچم قابل اجرا، مشخص کنند که به پشتهٔ قابل اجرا نیازی ندارند. اگر یک فایل ورودی بخش .note.GNU-stack را نداشته باشد، رفتار پیشفرض وابسته به معماری هدف است. برای برخی اهداف، نبود چنین بخشی به این معناست که یک پشتهٔ قابل اجرا مورد نیاز است. این مورد اغلب برای فایلهای اسمبلی دستنویس مشکلساز میشود.
- --error-execstack
- --no-error-execstack
- اگر قرار
باشد
پیونددهنده
یک پیام
هشدار
دربارهٔ
پشتهٔ قابل
اجرا تولید
کند،
گزینهٔ --error-execstack
در عوض آن
هشدار را به
یک خطا
تبدیل
میکند.
توجه کنید -
این گزینه
وضعیت
تولید
هشدار execstack
پیونددهنده
را تغییر
نمیدهد.
برای تنظیم
یک وضعیت
هشدار خاص
از --warn-execstack یا
--warn-execstack-objects
استفاده
کنید.
گزینهٔ --no-error-execstack رفتار پیشفرضِ تولید پیامهای هشدار را بازمیگرداند.
- --warn-multiple-gp
- اگر در فایل خروجی به چندین مقدار اشارهگر سراسری نیاز باشد، هشدار میدهد. این گزینه تنها برای پردازندههای خاصی معنادار است، مانند Alpha. بهطور خاص، برخی پردازندهها ثابتهای با مقادیر بزرگ را در یک بخش ویژه قرار میدهند. یک ثبات ویژه (اشارهگر سراسری) به میانهٔ این بخش اشاره میکند، تا بتوان ثابتها را از طریق حالت آدرسدهی نسبی به ثبات پایه به شکلی بهینه بارگذاری کرد. از آنجا که آفست در حالت نسبی به ثبات پایه ثابت و نسبتاً کوچک است (برای مثال ۱۶ بیت)، این امر حداکثر اندازهٔ مخزن ثابتها را محدود میکند. بنابراین، در برنامههای بزرگ، اغلب لازم است که از چندین مقدار اشارهگر سراسری استفاده شود تا بتوان به تمام ثابتهای ممکن دسترسی داشت. این گزینه باعث میشود هر زمان که چنین حالتی رخ داد، هشداری صادر شود.
- --warn-once
- به جای اینکه برای هر پیمانهای که به یک نماد تعریفنشده ارجاع میدهد یک بار هشدار صادر شود، برای هر نماد تعریفنشده فقط یک بار هشدار میدهد..IP --warn-rwx-segments 4
- --no-warn-rwx-segments
- اگر
پیونددهنده
یک قطعهٔ (segment)
بارگذاریپذیر
و با
اندازهٔ
غیرصفر
بسازد که هر
سه پرچم
مجوز
خواندن،
نوشتن و
اجرا در آن
تنظیم شده
باشد،
هشدار
میدهد.
چنین
قطعهای
نمایانگر
یک
آسیبپذیری
امنیتی
بالقوه است.
علاوه بر
این، اگر یک
قطعهٔ
حافظهٔ
محلی رشته (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 فعال میشوند.
- --warn-section-align
- اگر نشانی یک بخش خروجی به دلیل ترازسازی (alignment) تغییر کند، هشدار میدهد. معمولاً ترازسازی توسط یک بخش ورودی تعیین میشود. نشانی تنها در صورتی تغییر میکند که بهصراحت مشخص نشده باشد؛ یعنی اگر دستور "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" قرار دهید؛ چرا که اگر این کار را بکنید، ممکن است اسمبلر پیش از آنکه پیونددهنده فرصتی برای پیچیدن (wrap) آن به "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 info) در ".eh_frame" برای بخشهای کدِ ایجادشده توسط پیونددهنده مانند PLT. این گزینه در صورتی که اطلاعات بازگشایی تولیدشده توسط پیونددهنده پشتیبانی شود، بهطور پیشفرض فعال است. این گزینه همچنین تولید اطلاعات ردگیری پشته در ".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 در پیونددهنده تعیین کرد..IP --reduce-memory-overheads 4 این گزینه نیازمندیهای حافظه را در زمان اجرای ld به قیمت کاهش سرعت پیوند کاهش میدهد. این گزینه برای انتخاب الگوریتم قدیمی O(n^2) جهت تولید فایل نگاشت پیوند (link map) به جای الگوریتم جدید O(n) معرفی شده است که حدود ۴۰٪ حافظه بیشتری برای ذخیره نمادها مصرف میکند.
اثر دیگر این سوئیچ، تنظیم اندازه پیشفرض جدول درهمسازی (hash table) به 1021 است، که مجدداً با افزایش زمان اجرای پیونددهنده در مصرف حافظه صرفهجویی میکند. با این حال اگر از سوئیچ --hash-size استفاده شده باشد، این کار انجام نمیشود.
سوئیچ --reduce-memory-overheads ممکن است در نسخههای آینده پیونددهنده برای فعالسازی موازنههای (tradeoffs) دیگر نیز استفاده شود.
- --max-cache-size=size
- ld بهطور معمول اطلاعات بازآرایی (relocation) و جدولهای نماد فایلهای ورودی را با اندازه نامحدود در حافظه نهانسازی میکند. این گزینه حداکثر اندازه حافظه موقت (cache) را روی size تنظیم میکند.
- --build-id
- --build-id=style
- درخواست
ایجاد یک
بخش
یادداشت ELF
با نام
".note.gnu.build-id" یا
یک بخش COFF با
نام ".buildid".
محتویات
این
یادداشت
بیتهای
یکتایی
هستند که
این فایل
پیوند
خورده را
شناسایی
میکنند.
مقدار style
میتواند
"uuid" برای
استفاده از
۱۲۸ بیت
تصادفی؛
"sha1" برای
استفاده از
یک
درهمسازی
۱۶۰ بیتی SHA1؛
"md5" برای
استفاده از
یک
درهمسازی
۱۲۸ بیتی MD5؛
یا "xx"
برای
استفاده از
یک XXHASH صد و
بیست و هشت
بیتی بر روی
بخشهای
هنجارین (normative)
محتوای
خروجی
باشد؛ یا
"0xhexstring"
برای
استفاده از
یک رشته
بیتی
برگزیده
مشخصشده
به صورت
تعداد زوجی
از ارقام
هگزادسیمال
(نویسههای
"-" و
":" میان
جفت ارقام
نادیده
گرفته
میشوند).
اگر style حذف
شود، از
"sha1"
استفاده
میشود.
سبکهای "md5"، "sha1" و "xx" شناسهای تولید میکنند که در یک فایل خروجی همسان همواره یکسان است، اما تقریباً بهطور قطعی در میان تمام فایلهای خروجی ناهمسان یکتاست. این شناسه برای مقایسه بهعنوان جمع کنترلی (checksum) محتویات فایل در نظر گرفته نشده است. یک فایل پیوندخورده ممکن است بعداً توسط ابزارهای دیگر تغییر کند، اما رشته بیتی شناسه ساخت (build ID) که فایل پیوندخورده اصلی را مشخص میکند تغییر نخواهد کرد.
ارسال "none" برای style، تنظیمات ناشی از هر گزینه قبلی "--build-id" در خط فرمان را غیرفعال میکند.
- --package-metadata=JSON
- درخواست ایجاد یک بخش یادداشت ELF با نام ".note.package". محتویات یادداشت، مطابق با مشخصات متادیتای بسته، در قالب JSON است. برای اطلاعات بیشتر ببینید: https://systemd.io/ELF_PACKAGE_METADATA آرگومان JSON از کدگذاری درصدی (percent-encoding) و کدگذاریهای %[string] زیر (که در آن string به نام در ارجاعات نویسههای نامگذاریشده HTML اشاره دارد) پشتیبانی میکند: %[comma] برای ,، %[lbrace] برای {، %[quot] برای "، %[rbrace] برای }، و %[space] برای نویسه فاصله. اگر آرگومان JSON مفقود یا خالی باشد، در صورتی که ایجاد یادداشت متادیتا توسط رخداد پیشین گزینه --package-metadata فعال شده باشد، آن را غیرفعال میکند. اگر پیونددهنده با libjansson ساخته شده باشد، رشته JSON اعتبارسنجی خواهد شد.
پیونددهنده i386 PE از گزینه -shared پشتیبانی میکند که باعث میشود خروجی به جای یک فایل اجرایی معمولی، یک کتابخانه پیوندشده پویا (DLL) باشد. هنگامی که از این گزینه استفاده میکنید، باید نام خروجی را "*.dll" بگذارید. علاوه بر این، پیونددهنده بهطور کامل از فایلهای استاندارد "*.def" پشتیبانی میکند، که میتوان آنها را مانند یک فایل شیء در خط فرمان پیونددهنده مشخص کرد (در واقع، باید پیش از آرشیوهایی که نمادهایی را از آنها صادر میکند قرار گیرد، تا اطمینان حاصل شود که درست مانند یک فایل شیء معمولی پیوند میخورند).
علاوه بر گزینههای مشترک میان تمام هدفها، پیونددهنده i386 PE از گزینههای خط فرمان اضافی خاص هدف i386 PE نیز پشتیبانی میکند. گزینههایی که مقدار میگیرند ممکن است با یک فاصله یا یک علامت مساوی از مقادیر خود جدا شوند.
- --add-stdcall-alias
- در صورت مشخص شدن، نمادهای دارای پسوند stdcall (@nn) هم به همان صورت که هستند و هم با حذف پسوند صادر خواهند شد. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --base-file file
- از file بهعنوان نام فایلی برای ذخیره آدرسهای پایه تمام بازآراییهای مورد نیاز جهت تولید DLL با استفاده از dlltool استفاده میکند. [این یک گزینه مختص i386 PE است]
- --dll
- ایجاد یک DLL به جای یک فایل اجرایی معمولی. همچنین میتوانید از -shared استفاده کنید یا یک "LIBRARY" در یک فایل ".def" مشخص نمایید. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --enable-long-section-names
- --disable-long-section-names
- انواع PE از قالب شیء COFF، افزونهای اضافه میکنند که اجازه میدهد از نامهای بخش طولانیتر از هشت نویسه (محدودیت معمول برای COFF) استفاده شود. بهطور پیشفرض، این نامها تنها در فایلهای شیء مجاز هستند، زیرا ایمیجهای اجرایی کاملاً پیوندخورده، جدول رشته COFF لازم برای پشتیبانی از نامهای طولانیتر را حمل نمیکنند. بهعنوان یک افزونه GNU، میتوان با استفاده از این دو گزینه، استفاده از آنها را در ایمیجهای اجرایی نیز مجاز کرد یا (احتمالاً بیفایده!) در فایلهای شیء غیرمجاز ساخت. ایمیجهای اجرایی تولید شده با این نامهای بخش طولانی تا حدی غیراستاندارد هستند، زیرا حامل یک جدول رشته میباشند و هنگام بررسی با ابزارهای ناآشنا با GNU ولی آگاه از PE (مانند بینندهها و دامپرهای فایل) ممکن است خروجی گیجکنندهای ایجاد کنند. با این حال، GDB برای یافتن بخشهای اطلاعات اشکالزدایی Dwarf-2 در زمان اجرا در یک ایمیج اجرایی، به استفاده از نامهای بخش طولانی PE متکی است؛ بنابراین اگر هیچکدام از این دو گزینه در خط فرمان مشخص نشده باشند، هرگاه ld هنگام پیوند یک ایمیج اجرایی بدون حذف نمادها وجود اطلاعات اشکالزدایی را تشخیص دهد، رفتار پیشفرض و از نظر فنی درست را نادیده گرفته و نامهای طولانی بخش را فعال میکند. [این گزینه برای تمام پورتهای هدف PE پیونددهنده معتبر است]
- --enable-stdcall-fixup
- --disable-stdcall-fixup
- اگر پیوند نمادی را پیدا کند که قادر به حل آن نباشد، تلاش میکند با جستجو برای نماد تعریفشده دیگری که تنها در قالب نام نماد (cdecl در مقابل stdcall) تفاوت دارد، «پیوند فازی» انجام دهد و آن نماد را با پیوند به مورد منطبق حل کند. برای نمونه، نماد تعریفنشده "_foo" ممکن است به تابع "_foo@12" پیوند داده شود، یا نماد تعریفنشده "_bar@16" ممکن است به تابع "_bar" پیوند بخورد. هنگامی که پیونددهنده این کار را انجام میدهد، یک هشدار چاپ میکند، زیرا معمولاً پیوند باید ناموفق میبود، اما گاهی اوقات کتابخانههای وارداتی (import libraries) تولید شده از dllهای متفرقه برای قابل استفاده بودن به این ویژگی نیاز دارند. اگر --enable-stdcall-fixup را مشخص کنید، این ویژگی بهطور کامل فعال میشود و هشدارها چاپ نمیشوند. اگر --disable-stdcall-fixup را مشخص کنید، این ویژگی غیرفعال شده و چنین عدم تطابقهایی خطا در نظر گرفته میشوند. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --leading-underscore
- --no-leading-underscore
- برای اکثر هدفها، پیشوند نماد پیشفرض یک خط زیر (underscore) است و در شرح هدف تعریف شده است. با این گزینه میتوان پیشوند نماد پیشفرض خط زیر را غیرفعال/فعال کرد.
- --export-all-symbols
- در صورت مشخص شدن، تمام نمادهای سراسری موجود در اشیائی که برای ساخت یک DLL استفاده شدهاند، توسط DLL صادر خواهند شد. توجه داشته باشید که اگر در غیر این صورت هیچ نماد صادرشدهای وجود نداشته باشد، این حالت پیشفرض است. هنگامی که نمادها بهطور صریح از طریق فایلهای DEF یا بهطور ضمنی از طریق ویژگیهای توابع صادر میشوند، پیشفرض این است که هیچ چیز دیگری صادر نشود مگر اینکه این گزینه مشخص شده باشد. توجه داشته باشید که نمادهای "DllMain@12"، "DllEntryPoint@0"، "DllMainCRTStartup@12" و "impure_ptr" بهطور خودکار صادر نخواهند شد. همچنین، نمادهای وارد شده از سایر DLLها دوباره صادر نخواهند شد، و نه نمادهایی که چیدمان داخلی DLL را مشخص میکنند، مانند آنهایی که با "_head_" آغاز میشوند یا با "_iname" پایان مییابند. علاوه بر این، هیچ نمادی از "libgcc"، "libstd++"، "libmingw32" یا "crtX.o" صادر نخواهد شد. نمادهایی که نام آنها با "__rtti_" یا "__builtin_" شروع میشود، برای کمک به DLLهای ++C صادر نخواهند شد. در نهایت، فهرست گستردهای از نمادهای خصوصی cygwin وجود دارد که صادر نمیشوند (بدیهی است که این مورد هنگام ساخت DLLها برای هدفهای cygwin اعمال میشود). این استثناهای cygwin عبارتند از: "_cygwin_dll_entry@12"، "_cygwin_crt0_common@8"، "_cygwin_noncygwin_dll_entry@12"، "_fmode"، "_impure_ptr"، "cygwin_attach_dll"، "cygwin_premain0"، "cygwin_premain1"، "cygwin_premain2"، "cygwin_premain3" و "environ". [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --exclude-symbols symbol,symbol,...
- فهرستی از نمادها را مشخص میکند که نباید بهطور خودکار صادر شوند. نامهای نمادها میتوانند با کاما یا دو نقطه از هم جدا شوند. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --exclude-all-symbols
- مشخص میکند که هیچ نمادی نباید بهطور خودکار صادر شود. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --file-alignment
- همترازی فایل را مشخص میکند. بخشهای موجود در فایل همواره در آفستهایی از فایل شروع میشوند که مضربی از این عدد باشند. مقدار پیشفرض آن 512 است. [این گزینه مختص پورت هدف i386 PE پیونددهنده است].IP "--heap reserve" 4
- --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
- شمارهٔ اصلی (major) از «نسخهٔ تصویر» (image version) را تنظیم میکند. مقدار پیشفرض 1 است. [این گزینه مختص پورت هدفگیریشده برای i386 PE پیونددهنده است]
- --major-os-version value
- شمارهٔ اصلی (major) از «نسخهٔ سیستمعامل» (os version) را تنظیم میکند. مقدار پیشفرض 4 است. [این گزینه مختص پورت هدفگیریشده برای i386 PE پیونددهنده است]
- --major-subsystem-version value
- شمارهٔ اصلی (major) از «نسخهٔ زیرسیستم» (subsystem version) را تنظیم میکند. مقدار پیشفرض 4 است. [این گزینه مختص پورت هدفگیریشده برای i386 PE پیونددهنده است]
- --minor-image-version value
- شمارهٔ فرعی (minor) از «نسخهٔ تصویر» (image version) را تنظیم میکند. مقدار پیشفرض 0 است. [این گزینه مختص پورت هدفگیریشده برای i386 PE پیونددهنده است]
- --minor-os-version value
- شمارهٔ فرعی (minor) از «نسخهٔ سیستمعامل» (os version) را تنظیم میکند. مقدار پیشفرض 0 است. [این گزینه مختص پورت هدفگیریشده برای i386 PE پیونددهنده است]
- --minor-subsystem-version value
- شمارهٔ فرعی (minor) از «نسخهٔ زیرسیستم» (subsystem version) را تنظیم میکند. مقدار پیشفرض 0 است. [این گزینه مختص پورت هدفگیریشده برای i386 PE پیونددهنده است]
- --output-def file
- پیونددهنده فایل file را ایجاد خواهد کرد که حاوی یک پروندهٔ DEF متناظر با DLL در حال تولید توسط پیونددهنده خواهد بود. این پروندهٔ DEF (که باید به نام "*.def" نامگذاری شود) میتواند جهت ایجاد یک کتابخانهٔ واردات (import library) با "dlltool" به کار رود یا به عنوان مرجعی برای نمادهای بهطور خودکار یا ضمنی برونریزیشده استفاده شود. [این گزینه مختص پورت هدفگیریشده برای i386 PE پیونددهنده است]
- --enable-auto-image-base
- --enable-auto-image-base=value
- به طور خودکار پایهٔ تصویر (image base) را برای DLLها انتخاب میکند، بهصورت اختیاری با شروع از پایهٔ value، مگر اینکه مقداری با استفاده از آرگومان "--image-base" مشخص شده باشد. با استفاده از هَش تولیدشده از نام DLL برای ایجاد پایههای تصویر یکتا برای هر DLL، از تداخلها و بازنشانیهای (relocations) درون حافظه که میتوانند اجرای برنامه را با تأخیر مواجه کنند، جلوگیری میشود. [این گزینه مختص پورت هدفگیریشده برای i386 PE پیونددهنده است]
- --disable-auto-image-base
- پایهٔ تصویر یکتا را بهطور خودکار تولید نمیکند. اگر پایهٔ تصویری توسط کاربر مشخص نشده باشد ("--image-base")، آنگاه از مقدار پیشفرض پلتفرم استفاده میشود. [این گزینه مختص پورت هدفگیریشده برای i386 PE پیونددهنده است]
- --dll-search-prefix string
- هنگام پیوند پویا به یک DLL بدون کتابخانهٔ واردات (import library)، جستوجو برای "<string><basename>.dll" در اولویت نسبت به "lib<basename>.dll" قرار میگیرد. این رفتار امکان تمایز آسان بین DLLهای ساختهشده برای «زیرپلتفرمهای» گوناگون را فراهم میکند: native، cygwin، uwin، pw و غیره. برای نمونه، DLLهای cygwin معمولاً از "--dll-search-prefix=cyg" استفاده میکنند. [این گزینه مختص پورت هدفگیریشده برای i386 PE پیونددهنده است]
- --enable-auto-import
- پیوند
پیشرفتهٔ
"_symbol" به
"__imp__symbol" را
برای
واردات DATA از
DLLها انجام
میدهد،
بدین ترتیب
امکان دور
زدن
سازوکار dllimport
در سمت
کاربر و
ارجاع به
نامهای
نماد بدون
تغییر (unmangled)
فراهم
میشود.
[این گزینه
مختص پورت
هدفگیریشده
برای i386 PE
پیونددهنده
است]
نکات زیر مربوط به پیادهسازی اولیهٔ این ویژگی هستند و امروزه برای اهداف Cygwin و MinGW منسوخ شدهاند.
توجه: استفاده از افزونهٔ 'auto-import' موجب میشود بخش text از پروندهٔ تصویر قابل نوشتن شود. این امر با مشخصات قالب PE-COFF منتشرشده توسط مایکروسافت مطابقت ندارد.
توجه - استفاده از افزونهٔ 'auto-import' همچنین موجب میشود دادههای فقطخواندنی که معمولاً در بخش .rdata قرار میگرفتند، در بخش .data قرار داده شوند. این امر به منظور دور زدن مشکلی در مورد constها است که در اینجا توضیح داده شده است: http://www.cygwin.com/ml/cygwin/2004-09/msg01101.html
استفاده از 'auto-import' عموماً «بدون مشکل کار خواهد کرد» -- اما گاهی ممکن است این پیام را مشاهده کنید:
"variable '<var>' can't be auto-imported. Please read the documentation for ld's "--enable-auto-import" for details."
این پیام زمانی رخ میدهد که یک (زیر)عبارت به نشانیای دسترسی پیدا میکند که در نهایت از حاصل جمع دو مقدار ثابت به دست میآید (جدولهای واردات Win32 فقط یک مقدار را مجاز میدانند). مواردی که ممکن است این وضعیت در آنها رخ دهد شامل دسترسی به فیلدهای عضو متغیرهای struct واردشده از یک DLL، و نیز استفاده از یک اندیس ثابت در یک متغیر آرایهای واردشده از یک DLL است. هر متغیر چندکلمهای (آرایهها، ساختارها، 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] }برای ساختارها (و بیشتر انواع دادههای چندکلمهای دیگر) تنها گزینه این است که خودِ ساختار (یا 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ها با آفست غیرصفر شبهبازمکانی ایجاد نکن. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --enable-extra-pe-debug
- اطلاعات اشکالزدایی اضافی مربوط به ثانککردن نمادهای auto-import را نمایش بده. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --section-alignment
- ترازبندی بخشها (section alignment) را تنظیم میکند. بخشها در حافظه همیشه از آدرسهایی آغاز میشوند که مضربی از این عدد هستند. پیشفرض 0x1000 است. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --stack reserve
- --stack reserve,commit
- تعداد بایتهای حافظه را جهت رزرو (و به طور اختیاری تخصیص/commit) به عنوان پشته (stack) برای این برنامه مشخص کنید. پیشفرض ۲ مگابایت رزرو، و ۴ کیلوبایت تخصیصیافته است. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --subsystem which
- --subsystem which:major
- --subsystem which:major.minor
- زیرسیستمی
را که
برنامهٔ
شما تحت آن
اجرا خواهد
شد مشخص
میکند.
مقادیر
مجاز برای
which عبارتند
از "native"،
"windows"،
"console"،
"posix" و
"xbox".
همچنین
میتوانید
به صورت
اختیاری
نسخهٔ
زیرسیستم
را نیز
تنظیم کنید.
مقادیر
عددی نیز
برای which
پذیرفته
میشوند.
[این گزینه
مختص پورت
هدف i386 PE در
پیونددهنده
است]
گزینههای زیر پرچمهایی را در فیلد "DllCharacteristics" از سرایند فایل PE تنظیم میکنند: [این گزینهها مختص پورتهای هدف PE در پیونددهنده هستند]
- --high-entropy-va
- --disable-high-entropy-va
- تصویر با
تصادفیسازی
چیدمان
فضای آدرس
۶۴ بیتی (ASLR)
سازگار است.
این گزینه
به طور
پیشفرض
برای
تصاویر PE
شصت و چهار
بیتی در
مقصدهای MinGW
فعال است.
این گزینه همچنین شامل --dynamicbase و --enable-reloc-section نیز میشود.
- --dynamicbase
- --disable-dynamicbase
- آدرس پایهٔ تصویر میتواند با استفاده از تصادفیسازی چیدمان فضای آدرس (ASLR) جابهجا (بازمکانی) شود. این قابلیت با MS Windows Vista برای اهداف i386 PE معرفی شد. این گزینه به طور پیشفرض برای مقصدهای MinGW فعال است اما میتواند از طریق گزینهٔ --disable-dynamicbase غیرفعال شود. این گزینه همچنین --enable-reloc-section را نیز در بر دارد.
- --forceinteg
- --disable-forceinteg
- بررسیهای یکپارچگی کد تحمیل میشوند. این گزینه به طور پیشفرض غیرفعال است.
- --nxcompat
- --disable-nxcompat
- تصویر با ویژگی جلوگیری از اجرای داده (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 aware). این گزینه به طور پیشفرض غیرفعال است.
- --insert-timestamp
- --no-insert-timestamp
- یک برچسب
زمانی (timestamp)
واقعی در
تصویر درج
کن. این
رفتار
پیشفرض
است، زیرا
با کدهای
موروثی
مطابقت
دارد و بدین
معناست که
تصویر با
سایر
ابزارهای
اختصاصی
کار خواهد
کرد. مشکل
این رفتار
پیشفرض آن
است که هر
بار که همان
سورسکدها
پیوند داده
میشوند،
تصاویر کمی
متفاوت
تولید
خواهد شد.
گزینهٔ
--no-insert-timestamp
میتواند
برای درج
مقدار صفر
برای برچسب
زمانی
استفاده
شود، که
اطمینان
میدهد
فایلهای
باینری
تولید شده
از
سورسکدهای
یکسان،
کاملاً
یکسان
مقایسه
میشوند.
اگر --insert-timestamp فعال باشد، زمان درجشده یا زمانی است که پیونددهی انجام میشود یا در صورتی که متغیر محیطی "SOURCE_DATE_EPOCH" تعریف شده باشد، تعداد ثانیههای سپریشده از مبدأ زمانی یونیکس (Unix epoch) خواهد بود که توسط آن متغیر مشخص شده است..IP --enable-reloc-section 4
- --disable-reloc-section
- جدول بازآرایی پایه (base relocation table) را ایجاد میکند؛ این جدول در صورتی که ایمیج در پایهای متفاوت از آنچه در سرایند PE مشخص شده بارگذاری شود، ضروری است. این گزینه بهطور پیشفرض فعال است.
هدف C6X uClinux از یک قالب باینری به نام DSBT برای پشتیبانی از کتابخانههای اشتراکی استفاده میکند. هر کتابخانه اشتراکی در سیستم باید یک نمایه (index) یکتا داشته باشد؛ تمام فایلهای اجرایی از نمایه 0 استفاده میکنند.
- --dsbt-size size
- این گزینه تعداد مدخلهای جدول DSBT فایل اجرایی فعلی یا کتابخانه اشتراکی را روی size تنظیم میکند. پیشفرض، ایجاد جدولی با ۶۴ مدخل است.
- --dsbt-index index
- این گزینه
نمایه DSBT
فایل
اجرایی یا
کتابخانه
اشتراکی
فعلی را روی
index تنظیم
میکند.
پیشفرض 0
است که برای
تولید
فایلهای
اجرایی
مناسب است.
اگر یک
کتابخانه
اشتراکی با
نمایه DSBT
برابر با 0
تولید شود،
بازآراییهای
"R_C6000_DSBT_INDEX" در
فایل خروجی
کپی
میشوند.
سوئیچ --no-merge-exidx-entries ادغام مدخلهای مجاور exidx را در اطلاعات unwind فریم غیرفعال میکند.
- --branch-stub
- این گزینه با درج بخشهای استاب انشعاب (branch stub) در صورت نیاز به گسترش دامنه انشعابها، branch relaxation پیونددهنده را فعال میکند. این گزینه معمولاً لازم نیست، زیرا C-SKY از دستورالعملهای branch و call پشتیبانی میکند که میتوانند به کل محدوده حافظه دسترسی داشته باشند، و branch relaxation معمولاً توسط کامپایلر یا اسمبلر انجام میشود.
- --stub-group-size=N
- این گزینه امکان کنترل دقیقتر ایجاد استابهای انشعاب پیونددهنده را فراهم میکند. این گزینه حداکثر اندازه گروهی از بخشهای ورودی را که میتوانند توسط یک بخش استاب مدیریت شوند تعیین میکند. مقدار منفی برای N، بخشهای استاب را پس از انشعابهای آنها قرار میدهد، در حالی که مقدار مثبت اجازه میدهد بخشهای استاب قبل یا بعد از انشعابها ظاهر شوند. مقادیر 1 یا -1 نشان میدهند که پیونددهنده باید پیشفرضهای مناسب را انتخاب کند.
پیونددهندههای 68HC11 و 68HC12 از گزینههای خاصی برای کنترل نگاشت تعویض بانک حافظه (memory bank switching) و تولید کد ترامپولین (trampoline) پشتیبانی میکنند.
- --no-trampoline
- این گزینه تولید ترامپولین را غیرفعال میکند. بهطور پیشفرض، برای هر تابع دور (far function) که با استفاده از یک دستورالعمل "jsr" فراخوانی شود، یک ترامپولین تولید میشود (این اتفاق زمانی رخ میدهد که اشارهگری به یک تابع دور گرفته شود).
- --bank-window name
- این گزینه نام ناحیه حافظه در مشخصات MEMORY را که پنجره بانک حافظه را توصیف میکند، به پیونددهنده اعلام میدارد. سپس تعریف این ناحیه توسط پیونددهنده برای محاسبه صفحهبندی و آدرسها درون پنجره حافظه استفاده میشود.
گزینههای زیر برای کنترل مدیریت تولید GOT هنگام پیوند برای اهداف 68K پشتیبانی میشوند.
- --got=type
- این گزینه به پیونددهنده اعلام میکند که از کدام طرح تولید GOT استفاده کند. type باید یکی از مقادیر single، negative، multigot یا target باشد. برای اطلاعات بیشتر به مدخل Info برای ld مراجعه کنید.
گزینههای زیر برای کنترل تولید دستورالعملهای microMIPS و بررسیهای بازآرایی انشعاب برای گذار حالت ISA هنگام پیوند برای اهداف MIPS پشتیبانی میشوند.
- --insn32
- --no-insn32
- این گزینهها انتخاب دستورالعملهای microMIPS استفادهشده در کدهای تولیدشده توسط پیونددهنده، مانند کدهای موجود در PLT یا استابهای lazy binding، یا در relaxation را کنترل میکنند. اگر --insn32 استفاده شود، پیونددهنده تنها از کدگذاریهای دستورالعمل ۳۲-بیتی استفاده میکند. بهطور پیشفرض یا اگر --no-insn32 استفاده شود، تمام کدگذاریهای دستورالعمل، شامل ۱۶-بیتی در صورت امکان، به کار گرفته میشوند.
- --ignore-branch-isa
- --no-ignore-branch-isa
- این گزینهها بررسیهای بازآرایی انشعاب را برای گذارهای نامعتبر حالت ISA کنترل میکنند. اگر --ignore-branch-isa استفاده شود، پیونددهنده هرگونه بازآرایی انشعاب را میپذیرد و هر گذار حالت ISA مورد نیاز در محاسبات بازآرایی نادیده گرفته میشود؛ به جز در برخی موارد از دستورالعملهای "BAL" که شرایط relaxation را برآورده کرده و همزمان با محاسبه بازآرایی مرتبط، به دستورالعملهای معادل "JALX" تبدیل میشوند. بهطور پیشفرض یا اگر --no-ignore-branch-isa استفاده شود، بررسی انجام گرفته و نادیده گرفته شدن یک گذار حالت ISA منجر به بروز خطا میشود.
- --compact-branches
- --no-compact-branches
- این گزینهها تولید دستورالعملهای فشرده (compact instructions) توسط پیونددهنده را در مدخلهای PLT برای MIPS R6 کنترل میکنند.
برای هدف pdp11-aout، سه گونه از قالب خروجی را میتوان با گزینههای زیر انتخاب و تولید کرد. گونه پیشفرض برای pdp11-aout گزینه --omagic است، در حالی که برای سایر اهداف --nmagic پیشفرض است. گزینه --imagic تنها برای هدف pdp11-aout تعریف شده است، در حالی که سایر گزینهها در اینجا بر اساس کاربردشان در هدف pdp11-aout شرح داده شدهاند.
- -N
- --omagic
- خروجی را در سرایند a.out به عنوان "OMAGIC" (0407) علامتگذاری میکند تا نشان دهد بخش کد (text segment) نباید در برابر نوشتن محافظتشده (write-protected) و اشتراکی باشد. از آنجا که بخشهای کد (text) و داده (data) هر دو خواندنی و نوشتنی هستند، بخش داده بلافاصله و بهصورت پیوسته پس از بخش کد تخصیص مییابد. این قدیمیترین قالب برای برنامههای اجرایی PDP11 است و پیشفرض ld در سیستمهای PDP11 Unix از آغاز تا 2.11BSD بوده است.
- -n
- --nmagic
- خروجی را در سرایند a.out به عنوان "NMAGIC" (0410) علامتگذاری میکند تا نشان دهد هنگام اجرای فایل خروجی، بخش کد فقطخواندنی و بین تمام فرایندهایی که همان فایل را اجرا میکنند قابل اشتراک خواهد بود. این کار مستلزم انتقال نواحی داده به اولین مرز ممکن صفحه ۸ کیلوبایتی پس از انتهای بخش کد است. این گزینه یک قالب اجرایی محض (pure executable) ایجاد میکند.
- -z
- --imagic
- خروجی را در سرایند a.out به عنوان "IMAGIC" (0411) علامتگذاری میکند تا نشان دهد هنگام اجرای فایل خروجی، نواحی کد و داده برنامه با استفاده از ویژگی فضای مجزای دستورالعمل و داده در واحد مدیریت حافظه مدلهای بزرگتر PDP11، در فضاهای آدرس جداگانه بارگذاری خواهند شد. این ویژگی فضای آدرس در دسترس برنامه را دو برابر میکند. بخش کد مجدداً محض، محافظتشده در برابر نوشتن و اشتراکپذیر است. تنها تفاوت در قالب خروجی بین این گزینه و سایرین، علاوه بر شماره جادویی (magic number)، این است که هر دو بخش کد و داده از مکان 0 شروع میشوند. گزینه -z در 2.11BSD این قالب را انتخاب میکرد. این گزینه یک قالب اجرایی مجزا (separate executable) ایجاد میکند.
- --no-omagic
- معادل با --nmagic برای pdp11-aout..SH "محیط (ENVIRONMENT)" شما میتوانید رفتار ld را با متغیرهای محیطی "GNUTARGET"، "LDEMULATION" و "COLLECT_NO_DEMANGLE" تغییر دهید.
متغیر محیطی "GNUTARGET" در صورتی که از گزینهٔ -b (یا همارز آن --format) استفاده نکنید، قالب شیء (object format) فایل ورودی را تعیین میکند. مقدار آن باید یکی از نامهای BFD برای یک قالب ورودی باشد. اگر "GNUTARGET" در محیط وجود نداشته باشد، ld از قالب طبیعی مقصد (target) استفاده میکند. اگر "GNUTARGET" روی "default" تنظیم شده باشد، BFD با بررسی فایلهای ورودی دودویی تلاش میکند قالب ورودی را تشخیص دهد؛ این روش اغلب موفق میشود، اما ممکن است ابهاماتی به وجود آید، زیرا هیچ روشی برای تضمین یکتا بودن عدد جادویی (magic number) بهکاررفته برای تعیین قالبهای فایل شیء وجود ندارد. با این حال، فرایند پیکربندی BFD روی هر سیستم، قالب مرسوم آن سیستم را در ابتدای فهرست جستجو قرار میدهد، بنابراین ابهامات به نفع شیوهٔ مرسوم برطرف میشوند.
متغیر "LDEMULATION" در صورتی که از گزینهٔ -m استفاده نکنید، شبیهسازی (emulation) پیشفرض را تعیین میکند. شبیهسازی میتواند بر جنبههای گوناگون رفتار پیونددهنده، بهویژه اسکریپت پیشفرض پیونددهنده تأثیر بگذارد. میتوانید شبیهسازیهای موجود را با گزینههای --verbose یا -V فهرست کنید. اگر گزینهٔ -m استفاده نشود و متغیر محیطی "LDEMULATION" تعریف نشده باشد، شبیهسازی پیشفرض به نحوهٔ پیکربندی پیونددهنده بستگی خواهد داشت.
در حالت عادی، پیونددهنده بهطور پیشفرض نمادها را رازگشایی (demangle) میکند. با این حال، اگر "COLLECT_NO_DEMANGLE" در محیط تنظیم شده باشد، حالت پیشفرض بر عدم رازگشایی نمادها قرار میگیرد. این متغیر محیطی به روشی مشابه توسط برنامهٔ پوششدهندهٔ پیونددهنده در "gcc" استفاده میشود. این رفتار پیشفرض را میتوان با گزینههای --demangle و --no-demangle لغو کرد.
اگر گزینهٔ --insert-timestamp که مخصوص PE/COFF است فعال باشد و متغیر محیطی SOURCE_DATE_EPOCH تعریف شده باشد، مقدار برچسب زمانی موجود در این متغیر بهجای زمان کنونی در سرایند COFF درج خواهد شد.
اگر متغیر محیطی "LD_STATS" تعریف شده باشد، اطلاعات استفادهٔ پیونددهنده از منابع ثبت خواهد شد؛ دقیقاً مانند اینکه گزینهٔ --stats استفاده شده باشد. اگر متغیر "LD_STATS" دارای یک مقدار رشتهای باشد، از آن به عنوان نام فایلی که اطلاعات باید در آن ذخیره شوند استفاده میشود. در غیر این صورت، اطلاعات به جریان خروجی استاندارد ارسال خواهد شد.
همچنین ببینید (SEE ALSO)
ar(1)، nm(1)، objcopy(1)، objdump(1)، readelf(1) و مدخلهای Info برای binutils و ld.
کپیرایت و تکثیر (COPYRIGHT)
حق نشر (c) 1991-2025 Free Software Foundation, Inc.
اجازهٔ نسخهبرداری، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نسخهٔ ۱.۳ یا هر نسخهٔ بعدی منتشرشده توسط بنیاد نرمافزارهای آزاد اعطا میشود؛ بدون بخشهای تغییرناپذیر، بدون متون روی جلد، و بدون متون پشت جلد. نسخهای از این مجوز در بخشی با عنوان "GNU Free Documentation License" گنجانده شده است.
| 2025-11-10 | binutils-2.45.1 |