| LD(1) | GNU Development Tools | LD(1) |
نام (NAME)
ld - پیونددهنده گنو
خلاصه دستور (SYNOPSIS)
ld [گزینهها] objfile ...
توضیحات (DESCRIPTION)
ld تعدادی از فایلهای شیء (object) و آرشیو را ترکیب کرده، دادههای آنها را بازنشانی (relocate) میکند و ارجاعات نمادها را برقرار میسازد. معمولاً آخرین گام در کامپایل یک برنامه، اجرای ld است.
ld فایلهای «زبان فرمان پیونددهنده» (Linker Command Language) را که در یک ابرمجموعه از نحو Link Editor Command Language متعلق به AT&T نوشته شدهاند میپذیرد تا کنترلی صریح و کامل بر فرایند پیونددهی فراهم سازد.
این صفحهٔ راهنما زبان فرمان را توضیح نمیدهد؛ برای جزئیات کامل در مورد زبان فرمان و سایر جنبههای پیونددهنده گنو، مدخل ld را در "info" ببینید.
این نسخه از ld از کتابخانههای چندمنظورهٔ BFD برای کار با فایلهای شیء بهره میبرد. این امر به ld امکان میدهد فایلهای شیء را در قالبهای بسیار متفاوتی بخواند، ترکیب کند و بنویسد---برای نمونه، COFF یا "a.out". قالبهای مختلف را میتوان با یکدیگر پیوند داد تا هر نوع فایل شیء موجودی تولید شود.
پیونددهنده گنو صرفنظر از انعطافپذیریاش، در ارائهٔ اطلاعات تشخیصی بسیار سودمندتر از سایر پیونددهندهها عمل میکند. بسیاری از پیونددهندهها بلافاصله پس از مواجهه با یک خطا، اجرا را متوقف میکنند؛ اما ld در صورت امکان به اجرا ادامه میدهد و به شما اجازه میدهد سایر خطاها را نیز شناسایی کنید (یا در برخی موارد، حتی با وجود خطا یک فایل خروجی به دست آورید).
پیونددهندهٔ گنو ld با این هدف طراحی شده است که طیف گستردهای از موقعیتها را پوشش دهد و تا جای ممکن با سایر پیونددهندهها سازگار باشد. در نتیجه، شما گزینههای متعددی برای کنترل رفتار آن در اختیار دارید..SH "گزینهها (OPTIONS)" پیونددهنده از خیل عظیمی از گزینههای خط فرمان پشتیبانی میکند، اما در عمل در هر زمینهٔ خاص تنها تعداد کمی از آنها به کار گرفته میشوند. برای نمونه، یکی از کاربردهای رایج ld پیوند دادن فایلهای شیء استاندارد Unix در یک سیستم Unix استاندارد و پشتیبانیشده است. در چنین سیستمی، برای پیوند دادن یک فایل "hello.o":
ld -o <output> /lib/crt0.o hello.o -lc
این دستور به ld میگوید که فایلی به نام output را به عنوان نتیجهٔ پیوند دادن فایل "/lib/crt0.o" با "hello.o" و کتابخانهٔ "libc.a"، که از دایرکتوریهای جستجوی استاندارد دریافت میشود، تولید کند. (توضیحات مربوط به گزینهٔ -l در ادامه را ببینید.)
برخی از گزینههای خط فرمان ld را میتوان در هر جایی از خط فرمان مشخص کرد. با این حال، گزینههایی که به فایلها ارجاع میدهند، مانند -l یا -T، باعث میشوند که فایل دقیقاً در همان نقطهای که گزینه در خط فرمان ظاهر شده است، نسبت به فایلهای شیء و دیگر گزینههای فایلی خوانده شود. تکرار گزینههای غیرفایلی با آرگومانی متفاوت، یا هیچ اثر دیگری نخواهد داشت یا موارد پیشین آن گزینه (مواردی که در سمت چپ خط فرمان قرار دارند) را بازنویسی میکند. گزینههایی که مشخص کردن بیش از یک بارهٔ آنها معنادار است، در توضیحات زیر قید شدهاند.
آرگومانهای غیرگزینهای، فایلهای شیء یا آرشیوهایی هستند که باید به یکدیگر پیوند داده شوند. این آرگومانها میتوانند پس از گزینههای خط فرمان، پیش از آنها، یا آمیخته با آنها بیایند، به جز اینکه یک آرگومان فایل شیء نباید میان یک گزینه و آرگومانش قرار گیرد.
معمولاً پیونددهنده با حداقل یک فایل شیء فراخوانی میشود، اما میتوانید اشکال دیگری از فایلهای ورودی باینری را با استفاده از -l، -R و زبان دستورات اسکریپت مشخص کنید. اگر در کل هیچ فایل ورودی باینری مشخص نشده باشد، پیونددهنده هیچ خروجی تولید نمیکند و پیام No input files را صادر مینماید.
اگر پیونددهنده نتواند قالب یک فایل شیء را تشخیص دهد، فرض میکند که آن یک اسکریپت پیونددهنده (linker script) است. اسکریپتی که به این روش مشخص شود، اسکریپت اصلی پیونددهنده را که برای پیوند استفاده شده است (خواه اسکریپت پیشفرض پیونددهنده یا اسکریپتی که با استفاده از -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 با نویسههای فاصله از یکدیگر جدا میشوند. یک نویسهٔ فاصله را میتوان با قرار دادن کل گزینه درون علامتهای نقلقول تکی یا دوتایی در آن گزینه گنجاند. هر نویسهای (از جمله ممیز وارونه - backslash) را میتوان با درج یک پیشوند backslash قبل از آن نویسه وارد کرد. خود file ممکن است حاوی گزینههای @file دیگری نیز باشد؛ هر گزینهٔ اینچنینی به صورت بازگشتی پردازش خواهد شد.
- -a keyword
- این گزینه برای سازگاری با HP/UX پشتیبانی میشود. آرگومان keyword باید یکی از رشتههای archive، shared یا default باشد. گزینهٔ -aarchive از نظر عملکردی معادل -Bstatic است، و دو کلمه کلیدی دیگر از نظر عملکردی معادل -Bdynamic هستند. از این گزینه میتوان به هر تعداد دفعات استفاده کرد.
- --audit AUDITLIB
- مقدار AUDITLIB را به مدخل "DT_AUDIT" در بخش پویا (dynamic section) اضافه میکند. وجود داشتن AUDITLIB بررسی نمیشود، و از DT_SONAME مشخصشده در کتابخانه نیز استفاده نخواهد کرد. اگر چندین بار مشخص شود، "DT_AUDIT" شامل فهرستی جداشده با دونقطه از رابطهای حسابرسی برای استفاده خواهد بود. اگر پیونددهنده هنگام جستجو برای کتابخانههای اشتراکی شیئی با مدخل حسابرسی پیدا کند، مدخل متناظر "DT_DEPAUDIT" را در فایل خروجی اضافه میکند. این گزینه تنها بر روی پلتفرمهای ELF که از رابط rtld-audit پشتیبانی میکنند معنادار است.
- -b input-format
- --format=input-format
- برنامهٔ ld
ممکن است
طوری
پیکربندی
شده باشد که
از بیش از
یک نوع فایل
شیء
پشتیبانی
کند. اگر ld
شما به این
صورت
پیکربندی
شده باشد،
میتوانید
از گزینهٔ
-b برای
مشخص کردن
قالب
باینری
فایلهای
شیء ورودی
که پس از
این گزینه
در خط فرمان
میآیند
استفاده
کنید. حتی
زمانی که ld
برای
پشتیبانی
از
قالبهای
شیء
جایگزین
پیکربندی
شده است،
معمولاً
نیازی به
مشخص کردن
این گزینه
ندارید،
زیرا ld
باید طوری
پیکربندی
شده باشد که
به عنوان
قالب ورودی
پیشفرض،
معمولترین
قالب را در
هر ماشین
انتظار
داشته باشد.
آرگومان
input-format یک رشته
متنی است؛
نام قالبی
خاص که توسط
کتابخانههای
BFD پشتیبانی
میشود.
(میتوانید
قالبهای
باینری
موجود را با
objdump -i فهرست
کنید.)
اگر فایلهایی را با یک قالب باینری غیرمعمول پیوند میدهید، ممکن است بخواهید از این گزینه استفاده کنید. همچنین میتوانید با قرار دادن -b input-format پیش از هر گروه از فایلهای شیء با یک قالب خاص، از -b برای تغییر صریح قالبها (هنگام پیوند دادن فایلهای شیء با قالبهای گوناگون) بهره ببرید.
قالب پیشفرض از متغیر محیطی "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" شامل فهرستی از رابطهای حسابرسی جداشده با دونقطه خواهد بود. این گزینه تنها در بسترهای ELF که از رابط rtld-audit پشتیبانی میکنند معنیدار است. گزینه -P برای سازگاری با Solaris ارائه شده است.
- --enable-linker-version
- دستورالعمل
اسکریپت
پیونددهنده
"LINKER_VERSION" را
که در Output Section Data
شرح داده
شده است،
فعال
میکند. اگر
این
دستورالعمل
در یک
اسکریپت
پیونددهنده
استفاده
شود و این
گزینه فعال
شده باشد،
رشتهای
حاوی نسخه
پیونددهنده
در نقطه
جاری درج
خواهد شد.
نکته - مکان قرارگیری این گزینه در خط فرمان پیونددهنده اهمیت دارد. این گزینه تنها بر اسکریپتهای پیونددهندهای تأثیر میگذارد که پس از آن در خط فرمان میآیند، یا در پیونددهنده تعبیه شدهاند.
- --disable-linker-version
- دستورالعمل اسکریپت پیونددهنده "LINKER_VERSION" را غیرفعال میکند تا رشته نسخه را درج نکند. این حالت پیشفرض است.
- --enable-non-contiguous-regions
- این گزینه
از ایجاد
خطا در
صورتی که یک
بخش ورودی
در بخش
خروجی
متناظر
نگنجد،
جلوگیری
میکند.
پیونددهنده
تلاش
میکند تا
بخش ورودی
را به
بخشهای
خروجی
متناظر
بعدی تخصیص
دهد و تنها
در صورتی
خطا ایجاد
میکند که
هیچ بخش
خروجی به
اندازه
کافی بزرگ
نباشد. این
ویژگی
زمانی مفید
است که
چندین
ناحیه
حافظه
غیرپیوسته
در دسترس
باشند و بخش
ورودی به
ناحیه خاصی
وابسته
نباشد.
ترتیبی که
بخشهای
ورودی بر
اساس آن
ارزیابی
میشوند
تغییر
نمیکند،
برای نمونه:
MEMORY { MEM1 (rwx) : ORIGIN = 0x1000, LENGTH = 0x14 MEM2 (rwx) : ORIGIN = 0x1000, LENGTH = 0x40 MEM3 (rwx) : ORIGIN = 0x2000, LENGTH = 0x40 } SECTIONS { mem1 : { *(.data.*); } > MEM1 mem2 : { *(.data.*); } > MEM2 mem3 : { *(.data.*); } > MEM3 } with input sections: .data.1: size 8 .data.2: size 0x10 .data.3: size 4 results in .data.1 affected to mem1, and .data.2 and .data.3 affected to mem2, even though .data.3 would fit in mem3.این گزینه با دستورهای INSERT ناسازگار است زیرا نحوه نگاشت بخشهای ورودی به بخشهای خروجی را تغییر میدهد.
- --enable-non-contiguous-regions-warnings
- این گزینه هشدارهایی را فعال میکند که در هنگام نگاشت بخشها، زمانی رخ میدهند که "--enable-non-contiguous-regions" اجازه تطبیقهای احیاناً غیرمنتظرهای را میدهد؛ وضعیتی که ممکن است به جای شکست به دلیل عدم تطابق با هیچ ناحیه خروجی، به دور انداختن بیسروصدای یک بخش منجر شود.
- -e entry
- --entry=entry
- به جای نقطه ورود پیشفرض، از entry به عنوان نماد صریح برای شروع اجرای برنامه خود استفاده کنید. اگر نمادی با نام entry وجود نداشته باشد، پیونددهنده تلاش خواهد کرد تا entry را به عنوان یک عدد تجزیه کند و از آن به عنوان نشانی ورود استفاده نماید (عدد در مبنای ۱۰ تفسیر خواهد شد؛ میتوانید از یک 0x ابتدایی برای مبنای ۱۶، یا یک 0 ابتدایی برای مبنای ۸ استفاده کنید). برای i386 PE، مقدار entry همچنین میتواند نام اصلی تابع باشد (در صورت وجود، بدون خط زیرین ابتدایی و/یا پسوند stdcall به صورت @number).
- --exclude-libs lib,lib,...
- فهرستی از کتابخانههای آرشیو را مشخص میکند که نمادهای آنها نباید بهطور خودکار برونریزی شوند. نام کتابخانهها میتواند با کاما یا دونقطه از یکدیگر جدا شود. مشخص کردن "--exclude-libs ALL" نمادهای موجود در تمام کتابخانههای آرشیو را از برونریزی خودکار مستثنی میکند. این گزینه فقط برای پورت با مقصد i386 PE پیونددهنده و پورتهای با مقصد ELF در دسترس است. برای i386 PE، نمادهایی که صراحتاً در یک فایل .def فهرست شدهاند، صرفنظر از این گزینه همچنان برونریزی میشوند. برای پورتهای با مقصد ELF، با نمادهای متأثر از این گزینه به عنوان پنهان رفتار خواهد شد.
- --exclude-modules-for-implib module,module,...
- فهرستی از فایلهای شیء یا اعضای آرشیو را مشخص میکند که نمادهای آنها نباید بهطور خودکار برونریزی شوند، بلکه باید بهطور کامل در کتابخانه واردسازی در حال تولید حین پیوند کپی شوند. نام پودمانها را میتوان با کاما یا دونقطه از هم جدا کرد و باید دقیقاً با نام فایلهایی که توسط ld برای باز کردن فایلها استفاده شده مطابقت داشته باشند؛ برای اعضای آرشیو، این صرفاً نام عضو است، اما برای فایلهای شیء، نام فهرستشده باید دقیقاً شامل هر مسیری باشد که برای مشخص کردن فایل ورودی در خط فرمان پیونددهنده استفاده شده است. این گزینه تنها برای پورت پیونددهنده با مقصد i386 PE در دسترس است. نمادهایی که صراحتاً در یک فایل .def فهرست شدهاند، صرفنظر از این گزینه همچنان برونریزی میشوند.
- -E
- --export-dynamic
- --no-export-dynamic
- هنگام ساخت
یک فایل
اجرایی با
پیوند
پویا،
استفاده از
گزینه -E یا
گزینه --export-dynamic
باعث
میشود
پیونددهنده
تمام
نمادها را
به جدول
نمادهای
پویا اضافه
کند. جدول
نمادهای
پویا
مجموعهای
از نمادها
است که در
زمان اجرا
از اشیاء
پویا قابل
مشاهده
هستند.
اگر از هیچکدام از این گزینهها استفاده نکنید (یا از گزینه --no-export-dynamic برای بازگرداندن رفتار پیشفرض استفاده کنید)، جدول نمادهای پویا معمولاً فقط شامل نمادهایی خواهد بود که توسط شیء پویای ذکرشده در فرایند پیوند مورد ارجاع قرار گرفتهاند.
اگر از "dlopen" برای بارگذاری شیء پویایی استفاده میکنید که به جای ارجاع به یک شیء پویای دیگر، نیاز به ارجاع به نمادهای تعریفشده توسط خود برنامه دارد، احتمالاً در هنگام پیوند دادن خود برنامه باید از این گزینه استفاده کنید.
همچنین در صورتی که قالب خروجی پشتیبانی کند، میتوانید از فهرست پویا برای کنترل نمادهایی که باید به جدول نمادهای پویا اضافه شوند استفاده کنید. توضیحات مربوط به --dynamic-list را ببینید.
توجه داشته باشید که این گزینه مختص پورتهای با مقصد ELF است. مقصدهای PE از یک عملکرد مشابه برای برونریزی تمام نمادها از یک DLL یا EXE پشتیبانی میکنند؛ توضیحات --export-all-symbols را در زیر ببینید.
- --export-dynamic-symbol=glob
- هنگام ساخت یک فایل اجرایی با پیوند پویا، نمادهای منطبق با glob به جدول نمادهای پویا اضافه خواهند شد. هنگام ساخت یک کتابخانه مشترک، ارجاعات به نمادهای منطبق با glob به تعاریف درون کتابخانه مشترک مقید نخواهند شد. این گزینه هنگام ساخت کتابخانه مشترک در صورتی که -Bsymbolic یا --dynamic-list مشخص نشده باشند، بیاثر خواهد بود. این گزینه تنها در بسترهای ELF که از کتابخانههای مشترک پشتیبانی میکنند معنیدار است.
- --export-dynamic-symbol-list=file
- به ازای هر الگو در فایل، یک --export-dynamic-symbol تعیین میکند. قالب فایل مشابه گره نسخه بدون حوزه و نام گره است. برای اطلاعات بیشتر VERSION را ببینید.
- -EB
- پیوند دادن اشیاء بزرگپایان (big-endian). این گزینه بر قالب خروجی پیشفرض تأثیر میگذارد.
- -EL
- پیوند دادن اشیاء کوچکپایان (little-endian). این گزینه بر قالب خروجی پیشفرض تأثیر میگذارد.
- -f name
- --auxiliary=name
- هنگام ساخت
یک شیء
مشترک ELF،
فیلد داخلی
DT_AUXILIARY را روی
نام
مشخصشده
تنظیم
میکند. این
کار به
پیونددهنده
پویا اعلام
میکند که
جدول
نمادهای
شیء مشترک
باید به
عنوان یک
فیلتر کمکی
بر روی جدول
نمادهای
شیء مشترک
name استفاده
شود.
اگر بعداً برنامهای را در برابر این شیء فیلتر پیوند دهید، در زمان اجرای برنامه، پیونددهنده پویا فیلد DT_AUXILIARY را خواهد دید. اگر پیونددهنده پویا هر نمادی را از شیء فیلتر تفکیک کند، ابتدا بررسی میکند که آیا تعریفی در شیء مشترک name وجود دارد یا خیر. اگر تعریفی وجود داشته باشد، به جای تعریف موجود در شیء فیلتر از آن استفاده خواهد شد. لزومی ندارد شیء مشترک name وجود داشته باشد. بنابراین شیء مشترک name میتواند برای ارائه پیادهسازی جایگزینی از توابع خاص، مثلاً برای اشکالزدایی یا کارایی مختص ماشین، استفاده شود.
این گزینه ممکن است بیش از یک بار مشخص شود. مدخلهای DT_AUXILIARY به ترتیبی که در خط فرمان ظاهر میشوند ایجاد خواهند شد.
- -F name
- --filter=name
- هنگام ساخت
یک شیء
مشترک ELF،
فیلد داخلی
DT_FILTER را روی
نام
مشخصشده
تنظیم
میکند. این
کار به
پیونددهنده
پویا اعلام
میکند که
جدول
نمادهای
شیء مشترک
در حال
ایجاد باید
به عنوان یک
فیلتر بر
روی جدول
نمادهای
شیء مشترک
name استفاده
شود.
اگر بعداً برنامهای را در برابر این شیء فیلتر پیوند دهید، در زمان اجرای برنامه، پیونددهنده پویا فیلد DT_FILTER را خواهد دید. پیونددهنده پویا طبق معمول نمادها را بر اساس جدول نمادهای شیء فیلتر تفکیک میکند، اما در واقع به تعاریف یافتشده در شیء مشترک name پیوند خواهد زد. بنابراین، شیء فیلتر میتواند برای انتخاب زیرمجموعهای از نمادهای ارائهشده توسط شیء name استفاده شود.
برخی از پیونددهندههای قدیمیتر از گزینه -F در سراسر زنجیره ابزار کامپایل برای مشخص کردن قالب فایل شیء برای هر دو فایلهای شیء ورودی و خروجی استفاده میکردند. پیونددهنده GNU برای این منظور از سازوکارهای دیگری استفاده میکند: گزینههای -b، --format، --oformat، دستور "TARGET" در اسکریپتهای پیونددهنده، و متغیر محیطی "GNUTARGET". پیونددهنده GNU در صورتی که در حال ساخت یک شیء مشترک ELF نباشد، گزینه -F را نادیده خواهد گرفت..IP -fini=name 4 هنگام ساخت یک فایل اجرایی یا شیء مشترک ELF، با تنظیم DT_FINI روی آدرس تابع، NAME را هنگام تخلیه شدن فایل اجرایی یا شیء مشترک از حافظه فراخوانی میکند. بهطور پیشفرض، پیونددهنده از "_fini" به عنوان تابع فراخوانی استفاده میکند.
- -g
- نادیده گرفته میشود. برای سازگاری با سایر ابزارها ارائه شده است.
- -G value
- --gpsize=value
- حداکثر اندازه اشیایی که قرار است با استفاده از ثبات GP بهینهسازی شوند را روی value تنظیم میکند. این مورد فقط برای قالبهای فایل شیء نظیر 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 را مشخص میسازد.
پیونددهنده یک بایگانی را تنها یک بار و در همان مکانی که در خط فرمان مشخص شده است جستجو میکند. اگر بایگانی نمادی را تعریف کند که در یک شیء ظاهرشده پیش از بایگانی در خط فرمان، تعریفنشده بود، پیونددهنده فایل(های) مناسب را از بایگانی در بر خواهد گرفت. با این حال، یک نماد تعریفنشده در شیئی که بعداً در خط فرمان ظاهر میشود، باعث نخواهد شد که پیونددهنده دوباره بایگانی را جستجو کند.
برای روشی جهت وادار کردن پیونددهنده به جستجوی چندینباره بایگانیها، گزینه -( را ببینید.
میتوانید یک بایگانی مشابه را چندین بار در خط فرمان فهرست کنید.
این نوع جستجوی بایگانی برای پیونددهندههای یونیکس استاندارد است. با این حال، اگر از 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، اجازه میدهد بازنگاشتها از یک فایل خوانده شوند. هر خط در فایل میتواند حاوی یک بازنگاشت واحد باشد. خطوط خالی نادیده گرفته میشوند. هر چیزی از یک نویسه هش (#) تا انتهای خط به عنوان توضیح (comment) در نظر گرفته شده و همچنین نادیده گرفته میشود. الگوی نگاشت میتواند با نویسه فاصله سفید یا یک علامت مساوی (=) از نام فایل جدا شود.
این گزینهها را میتوان چندین بار مشخص کرد. محتویات آنها انباشته میشود. بازنگاشتها به ترتیبی که در خط فرمان قرار دارند، و اگر از یک فایل آمده باشند، به ترتیبی که در فایل واقع شدهاند پردازش خواهند شد. در صورت یافتن تطابق، بررسی دیگری برای آن نام فایل انجام نخواهد شد.
اگر نام فایل جایگزین /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) گنجانده خواهد شد.
- -M
- --print-map
- یک نقشه پیوند (link map) را در خروجی استاندارد چاپ میکند. یک نقشه پیوند، اطلاعاتی درباره فرایند پیوند ارائه میدهد، از جمله موارد زیر:
- چگونگی تخصیص نمادهای عام (common symbols).
- تمام اعضای آرشیو که در پیوند گنجانده شدهاند، به همراه اشاره به نمادی که باعث وارد شدن عضو آرشیو شده است.
- مقادیر
اختصاصیافته
به نمادها.
نکته - نمادهایی که مقادیر آنها با عبارتی محاسبه میشود که شامل ارجاعی به مقدار قبلی همان نماد است، ممکن است نتیجهٔ درستی در نقشهٔ پیوند نمایش ندهند. دلیل این امر این است که پیونددهنده نتایج میانی را دور میریزد و تنها مقدار نهایی یک عبارت را حفظ میکند. در چنین شرایطی پیونددهنده مقدار نهایی را درون قلاب نمایش خواهد داد. بنابراین برای مثال یک اسکریپت پیونددهنده شامل:
foo = 1 foo = foo * 4 foo = foo + 8
در صورت استفاده از گزینهٔ -M، خروجی زیر را در نقشهٔ پیوند تولید خواهد کرد:
0x00000001 foo = 0x1 [0x0000000c] foo = (foo * 0x4) [0x0000000c] foo = (foo + 0x8)
برای اطلاعات بیشتر دربارهٔ عبارتها در اسکریپتهای پیونددهنده، Expressions را ببینید.
- نحوهٔ
ادغام
ویژگیهای
GNU.
هنگامی که پیونددهنده بخشهای ورودی .note.gnu.property را در یک بخش خروجی .note.gnu.property ادغام میکند، برخی ویژگیها حذف یا بهروزرسانی میشوند. این اقدامات در نقشهٔ پیوند گزارش میشوند. برای مثال:
Removed property 0xc0000002 to merge foo.o (0x1) and bar.o (not found)
این نشان میدهد که هنگام ادغام ویژگیها در foo.o، که مقدار ویژگی 0xc0000002 آن 0x1 است، و bar.o، که فاقد ویژگی 0xc0000002 است، ویژگی 0xc0000002 از خروجی حذف شده است.
Updated property 0xc0010001 (0x1) to merge foo.o (0x1) and bar.o (0x1)
این نشان میدهد که هنگام ادغام ویژگیها در foo.o، که مقدار ویژگی 0xc0010001 آن 0x1 است، و bar.o، که مقدار ویژگی 0xc0010001 آن 0x1 است، مقدار ویژگی 0xc0010001 در خروجی به 0x1 بهروزرسانی شده است.
- در برخی
مقصدهای ELF،
فهرستی از
تصحیحها (fixups)
که توسط --relax
درج
شدهاند
foo.o: Adjusting branch at 0x00000008 towards "far" in section .text
این نشان میدهد که انشعاب در 0x00000008 در foo.o، که نماد "far" را در بخش .text هدف قرار داده است، با یک ترامپولین (trampoline) جایگزین شده است.
- --print-map-discarded
- --no-print-map-discarded
- چاپ (یا عدم چاپ) فهرست بخشهای کنار گذاشتهشده و زبالهروبیشده در نقشهٔ پیوند. بهطور پیشفرض فعال است.
- --print-map-locals
- --no-print-map-locals
- چاپ (یا عدم چاپ) نمادهای محلی در نقشهٔ پیوند. پیش از نام نمادهای محلی، متن (local) چاپ خواهد شد، و پس از تمام نمادهای سراسریِ یک بخش معین فهرست میشوند. نمادهای محلی موقت (معمولاً آنهایی که با .L شروع میشوند) در خروجی گنجانده نخواهند شد. بهطور پیشفرض غیرفعال است.
- -n
- --nmagic
- تراز صفحهای بخشها را خاموش کرده، و پیوند با کتابخانههای مشترک را غیرفعال میکند. اگر قالب خروجی از اعداد جادویی به سبک یونیکس پشتیبانی کند، خروجی را با عنوان "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" نیز
میتواند
نام فایل
خروجی را
مشخص کند.
نکته - پیونددهنده پیش از شروع نوشتن در فایل خروجی، آن را حذف خواهد کرد. حتی اگر مشخص شود که پیوند به دلیل خطاها نمیتواند کامل شود، این کار انجام خواهد شد.
نکته - پیونددهنده بررسی میکند تا مطمئن شود نام فایل خروجی با نام هیچیک از فایلهای ورودی مطابقت نداشته باشد، اما فقط همین. بهویژه، اگر فایل خروجی روی یک فایل منبع یا فایل مهم دیگری بازنویسی شود، هیچ اعتراضی نخواهد کرد. بنابراین در سیستمهای ساخت توصیه میشود از گزینهٔ -o به عنوان آخرین گزینه در خط فرمان پیونددهنده استفاده شود. برای مثال در نظر بگیرید:
ld -o $(EXE) $(OBJS) ld $(OBJS) -o $(EXE)
اگر متغیر EXE به هر دلیلی تعریف نشده باشد، نسخهٔ اول دستور پیونددهنده ممکن است منجر به حذف یکی از فایلهای شیء شود (اولین مورد در فهرست OBJS)، در حالی که نسخهٔ دوم دستور پیونددهنده یک پیام خطا تولید کرده و هیچ چیزی را حذف نمیکند.
- --dependency-file=depfile
- یک فایل وابستگی در depfile مینویسد. این فایل شامل قاعدهای مناسب برای "make" است که فایل خروجی و تمام فایلهای ورودی خواندهشده برای تولید آن را شرح میدهد. این خروجی شبیه به خروجی کامپایلر با -M -MP است. توجه داشته باشید که گزینهای مانند -MM کامپایلر وجود ندارد که "فایلهای سیستم" را مستثنی کند (که بر خلاف "سرفایلهای سیستم" در کامپایلر، مفهومی با تعریف دقیق در پیونددهنده نیست). بنابراین خروجی حاصل از --dependency-file همیشه مختص به وضعیت دقیق همان نصبی است که در آن تولید شده، و نباید بدون ویرایش دقیق در makefileهای توزیعشده کپی شود.
- -O level
- اگر level یک مقدار عددی بزرگتر از صفر باشد، ld خروجی را بهینهسازی میکند. این کار ممکن است زمان بسیار بیشتری ببرد و بنابراین احتمالاً فقط باید برای باینری نهایی فعال شود. در حال حاضر این گزینه فقط بر تولید کتابخانهٔ مشترک ELF تأثیر میگذارد. نگارشهای آیندهٔ پیونددهنده ممکن است استفادهٔ بیشتری از این گزینه بکنند. همچنین در حال حاضر تفاوتی در رفتار پیونددهنده برای مقادیر ناصفر مختلف این گزینه وجود ندارد. این مورد نیز ممکن است در نگارشهای آینده تغییر کند.
- -plugin name
- بهکارگیری
یک افزونه
در فرایند
پیوند.
پارامتر name
نام فایل
مطلق
افزونه است.
معمولاً
این
پارامتر
هنگام
استفاده از
بهینهسازی
زمان
پیوند،
بهطور
خودکار
توسط
کامپایلر
اضافه
میشود،
اما
کاربران
نیز
میتوانند
در صورت
تمایل
افزونههای
خود را
اضافه کنند.
توجه داشته باشید که محل افزونههای نشئتگرفته از کامپایلر با مکانی که برنامههای ar، nm و ranlib برای افزونههای خود جستجو میکنند متفاوت است. برای اینکه آن دستورها بتوانند از افزونهٔ مبتنی بر کامپایلر استفاده کنند، باید ابتدا در دایرکتوری ${libdir}/bfd-plugins کپی شود. تمام افزونههای پیونددهندهٔ مبتنی بر gcc دارای سازگاری رو به عقب هستند، بنابراین فقط کپی کردن جدیدترین آنها کافی است..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
- فایل خروجی را مجبور میکند که دارای بخشهای پویا باشد. این گزینه مختص هدفهای VxWorks است.
- -r
- --relocatable
- خروجی قابل
بازنشانی
تولید
میکند---یعنی،
فایل
خروجیای
تولید
میکند که
میتواند
به نوبهٔ
خود به
عنوان
ورودی برای
ld به کار
رود. این
عمل اغلب
پیوند
جزئی (partial linking)
نامیده
میشود. به
عنوان یک
اثر جانبی،
در
محیطهایی
که از
شمارههای
جادویی (magic numbers)
استاندارد
یونیکس
پشتیبانی
میکنند،
این گزینه
همچنین
شمارهٔ
جادویی
فایل خروجی
را روی
"OMAGIC"
تنظیم
میکند. اگر
این گزینه
مشخص نشود،
یک فایل
مطلق (absolute)
تولید
میشود.
هنگام
پیوند دادن
برنامههای
C++، این
گزینه
ارجاعات به
سازندهها
(constructors) را حل
نخواهد
کرد؛ برای
انجام این
کار، از -Ur
استفاده
کنید.
هنگامی که یک فایل ورودی قالبی یکسان با فایل خروجی ندارد، پیوند جزئی تنها در صورتی پشتیبانی میشود که آن فایل ورودی حاوی هیچ بازنشانیای نباشد. قالبهای خروجی مختلف ممکن است محدودیتهای بیشتری داشته باشند؛ به عنوان مثال برخی از قالبهای مبتنی بر "a.out" اصلاً از پیوند جزئی با فایلهای ورودی در سایر قالبها پشتیبانی نمیکنند.
هنگامی که خروجی قابل بازنشانی هم شامل محتوایی باشد که به بهینهسازی زمان پیوند (LTO) نیاز دارد و هم محتوایی که به LTO نیاز ندارد، یک بخش .gnu_object_only ایجاد میشود تا حاوی یک فایل شیء قابل بازنشانی باشد، گویی -r برای تمام ورودیهای قابل بازنشانی که نیازی به LTO ندارند اعمال شده است. پیونددهنده هنگام پردازش یک ورودی قابل بازنشانی دارای بخش .gnu_object_only، بخش .gnu_object_only را به عنوان یک ورودی مجزا استخراج خواهد کرد.
توجه داشته باشید که از آنجا که -r برخی از بخشها را از فایلهای ورودی مختلف با هم گروهبندی میکند، ممکن است اثرات منفی بر اندازهٔ کد و محلیبودن (locality) در فایل اجرایی نهایی یا کتابخانهٔ اشتراکی وجود داشته باشد.
این گزینه همان کاری را انجام میدهد که -i انجام میدهد.
- -R filename
- --just-symbols=filename
- نام نمادها
و آدرسهای
آنها را از
filename
میخواند،
اما آن را
بازنشانی
نکرده و در
خروجی قرار
نمیدهد.
این امکان
به فایل
خروجی شما
اجازه
میدهد تا
به صورت
نمادین به
مکانهای
مطلقی از
حافظه که در
سایر
برنامهها
تعریف
شدهاند
ارجاع دهد.
میتوانید
بیش از یک
بار از این
گزینه
استفاده
کنید.
جهت سازگاری با سایر پیونددهندههای ELF، اگر به دنبال گزینهٔ -R به جای نام یک فایل، نام یک دایرکتوری بیاید، همانند گزینهٔ -rpath با آن رفتار میشود.
- --rosegment
- --no-rosegment
- تلاش
میکند تا
اطمینان
حاصل شود که
تنها یک
سگمنت
فقطخواندنیِ
غیرکد
ایجاد
میشود.
تنها زمانی
مفید است که
همراه با
گزینهٔ -z separate-code
استفاده
شود.
باینریهای
حاصل باید
کوچکتر از
حالتی
باشند که -z
separate-code به
تنهایی
استفاده
شود. بدون
این گزینه،
یا اگر --no-rosegment
مشخص شده
باشد،
گزینهٔ -z separate-code
دو سگمنت
فقطخواندنی
ایجاد
میکند: یکی
پیش از
سگمنت کد و
دیگری پس از
آن.
نام این گزینهها گمراهکننده است، اما جهت سازگاری پیونددهنده با پیونددهندههای LLD و GOLD انتخاب شدهاند.
این گزینهها تنها توسط هدفهای ELF پشتیبانی میشوند.
- -s
- --strip-all
- تمام اطلاعات نمادها را از فایل خروجی حذف میکند.
- -S
- --strip-debug
- اطلاعات نمادهای اشکالزدا (اما نه همهٔ نمادها) را از فایل خروجی حذف میکند.
- --strip-discarded
- --no-strip-discarded
- نمادهای سراسری تعریفشده در بخشهای دور انداختهشده را حذف میکند (یا حذف نمیکند). به طور پیشفرض فعال است.
- -plugin-save-temps
- فایلهای میانی «موقت» افزونه را به صورت دائمی ذخیره میکند.
- -t
- --trace
- نام فایلهای ورودی را همزمان با پردازش آنها توسط ld چاپ میکند. اگر -t دو بار داده شود، اعضای درون آرشیوها نیز چاپ میشوند. خروجی -t برای ایجاد فهرستی از تمام فایلهای شیء و اسکریپتهای درگیر در پیوند، برای مثال هنگام بستهبندی فایلها برای گزارش اشکال پیونددهنده، مفید است.
- -T scriptfile
- --script=scriptfile
- از scriptfile به
عنوان
اسکریپت
پیونددهنده
استفاده
میکند. این
اسکریپت
جایگزین
اسکریپت
پیشفرض
پیونددهندهٔ
ld میشود
(به جای
افزودن به
آن)، مگر
اینکه
اسکریپت
حاوی
"INSERT"
باشد،
بنابراین
commandfile باید هر
آنچه را که
برای توصیف
فایل خروجی
لازم است
مشخص کند.
اگر scriptfile در دایرکتوری جاری وجود نداشته باشد، "ld" آن را در دایرکتوریهای مشخصشده توسط هر گزینهٔ پیشین -L جستجو میکند.
گزینههای خط فرمانی که قبل از گزینهٔ -T میآیند میتوانند بر اسکریپت تأثیر بگذارند، اما گزینههای خط فرمانی که پس از آن میآیند چنین نمیکنند.
اگر چندین گزینهٔ -T اسکریپت فعلی را تکمیل کنند، روی هم انباشته میشوند؛ در غیر این صورت، آخرین گزینهٔ -T غیرتکمیلی به کار خواهد رفت.
راههای دیگری برای تعیین اسکریپتهای پیونددهنده وجود دارد. رجوع کنید به
- -dT scriptfile
- --default-script=scriptfile
- از scriptfile به
عنوان
اسکریپت
پیشفرض
پیونددهنده
استفاده
میکند.
این گزینه مشابه گزینهٔ --script است، به جز اینکه پردازش اسکریپت تا پس از پردازش بقیهٔ خط فرمان به تعویق میافتد. این امر به گزینههایی که پس از گزینهٔ --default-script در خط فرمان قرار گرفتهاند امکان میدهد بر رفتار اسکریپت پیونددهنده تأثیر بگذارند؛ چیزی که میتواند هنگامی که خط فرمان پیونددهنده مستقیماً توسط کاربر قابل کنترل نیست مهم باشد (برای مثال، به این دلیل که خط فرمان توسط ابزار دیگری مانند gcc ساخته میشود)..IP "-u symbol" 4
- --undefined=symbol
- اجبار
میکند که
symbol به عنوان
یک نماد
تعریفنشده
در فایل
خروجی وارد
شود. انجام
این کار
برای مثال
ممکن است
پیوند زدن
پودمانهای
اضافی از
کتابخانههای
استاندارد
را فعال
کند. -u
میتواند
با
آرگومانهای
گزینهی
متفاوتی
تکرار شود
تا نمادهای
تعریفنشده
بیشتری
وارد شوند.
این گزینه
معادل با
دستور
اسکریپت
پیونددهنده
"EXTERN" است.
اگر از این گزینه برای کشیدن پودمانهای بیشتر به پیوند استفاده میشود، و اگر تعریفنشده باقی ماندن نماد یک خطا محسوب میشود، باید به جای آن از گزینه --require-defined استفاده شود.
- --require-defined=symbol
- الزام میکند که symbol در فایل خروجی تعریف شده باشد. این گزینه مشابه گزینه --undefined است با این تفاوت که اگر symbol در فایل خروجی تعریف نشده باشد، پیونددهنده یک خطا صادر کرده و خارج میشود. همین اثر را میتوان در یک اسکریپت پیونددهنده با استفاده از "EXTERN"، "ASSERT" و "DEFINED" در کنار هم به دست آورد. این گزینه میتواند چندین بار برای الزام نمادهای اضافی به کار رود.
- -Ur
- برای
برنامههایی
که از
سازندهها
یا
ویرانکنندهها
استفاده
نمیکنند،
یا برای
سیستمهای
مبتنی بر ELF
این گزینه
معادل -r
است: خروجی
با قابلیت
بازنشانی
(relocatable) تولید
میکند---یعنی
فایل خروجی
که به نوبه
خود
میتواند
به عنوان
ورودی برای
ld عمل کند.
با این حال
برای سایر
دودوییها،
گزینه -Ur
مشابه -r
است اما
ارجاعات به
سازندهها
و
ویرانکنندهها
را نیز حل
میکند.
برای سیستمهایی که در آنها -r و -Ur رفتار متفاوتی دارند، استفاده از -Ur روی فایلهایی که خودشان با -Ur پیوند داده شدهاند کارساز نخواهد بود؛ زمانی که جدول سازنده ساخته شد، نمیتوان به آن چیزی افزود. از -Ur فقط برای آخرین پیوند جزئی، و از -r برای بقیه استفاده کنید.
- --orphan-handling=MODE
- نحوه
رسیدگی به
بخشهای
یتیم (orphan sections) را
کنترل
میکند. یک
بخش یتیم،
بخشی است که
صراحتاً در
یک اسکریپت
پیونددهنده
ذکر نشده
باشد.
MODE میتواند هر یک از مقادیر زیر را داشته باشد:
- "place"
- بخشهای یتیم با پیروی از راهبرد شرح داده شده در Orphan Sections در یک بخش خروجی مناسب قرار میگیرند. گزینه --unique نیز بر نحوه قرارگیری بخشها تأثیر میگذارد.
- "discard"
- تمام بخشهای یتیم با قرار گرفتن در بخش /DISCARD/ دور ریخته میشوند.
- "warn"
- پیونددهنده بخش یتیم را مانند "place" قرار میدهد و همچنین یک هشدار صادر میکند.
- "error"
- در صورت یافتن هرگونه بخش یتیم، پیونددهنده با یک خطا خارج میشود.
در صورتی که --orphan-handling مشخص نشده باشد، پیشفرض "place" است.
- --unique[=SECTION]
- یک بخش خروجی مجزا برای هر بخش ورودی منطبق با SECTION، یا در صورت مشخص نشدن آرگومان نویسهعام اختیاری SECTION، برای هر بخش ورودی یتیم ایجاد میکند. بخش یتیم بخشی است که صراحتاً در یک اسکریپت پیونددهنده ذکر نشده باشد. میتوانید از این گزینه چندین بار در خط فرمان استفاده کنید؛ این گزینه از ادغام معمول بخشهای ورودی با نام یکسان جلوگیری کرده و تخصیص بخشهای خروجی در اسکریپت پیونددهنده را نادیده میگیرد.
- -v
- --version
- -V
- شماره نگارش ld را نمایش میدهد. گزینه -V همچنین شبیهسازیهای پشتیبانیشده را فهرست میکند. همچنین توضیحات مربوط به --enable-linker-version را در Options,,Command-line Options ببینید که میتواند برای درج رشته نگارش پیونددهنده در یک دودویی استفاده شود.
- -x
- --discard-all
- همه نمادهای محلی را حذف میکند.
- -X
- --discard-locals
- تمام نمادهای محلی موقت را حذف میکند. (این نمادها با پیشوندهای برچسب محلی مختص سیستم آغاز میشوند، معمولاً .L برای سیستمهای ELF یا L برای سیستمهای سنتی a.out.)
- -y symbol
- --trace-symbol=symbol
- نام هر فایل
پیوندشدهای
را که symbol در
آن ظاهر
میشود چاپ
میکند. این
گزینه
میتواند
به هر تعداد
بار مشخص
شود. در
بسیاری از
سیستمها
لازم است یک
زیرخط به
ابتدای آن
اضافه شود.
این گزینه زمانی مفید است که یک نماد تعریفنشده در پیوند خود دارید اما نمیدانید این ارجاع از کجا میآید.
- -Y path
- مسیر path را به مسیر جستجوی پیشفرض کتابخانه اضافه میکند. این گزینه برای سازگاری با Solaris وجود دارد.
- -z keyword
- کلیدواژههای شناختهشده عبارتند از:
- call-nop=prefix-addr
- call-nop=suffix-nop
- call-nop=prefix-byte
- call-nop=suffix-byte
- لایهگذاری ۱ بایتی "NOP" را هنگام تبدیل فراخوانی غیرمستقیم به یک تابع تعریفشده محلی (foo) از طریق خانه GOT آن مشخص میکند. call-nop=prefix-addr عبارت "0x67 call foo" را تولید میکند. call-nop=suffix-nop عبارت "call foo 0x90" را تولید میکند. call-nop=prefix-byte عبارت "byte call foo" را تولید میکند. call-nop=suffix-byte عبارت "call foo byte" را تولید میکند. برای i386 و x86_64 پشتیبانی میشود.
- cet-report=none
- cet-report=warning
- cet-report=error
- چگونگی گزارش ویژگیهای ناموجود GNU_PROPERTY_X86_FEATURE_1_IBT و GNU_PROPERTY_X86_FEATURE_1_SHSTK را در بخش ورودی .note.gnu.property تعیین میکند. گزینه cet-report=none که پیشفرض است، باعث میشود پیونددهنده ویژگیهای ناموجود در فایلهای ورودی را گزارش نکند. cet-report=warning باعث میشود پیونددهنده برای ویژگیهای ناموجود در فایلهای ورودی هشدار صادر کند. cet-report=error باعث میشود پیونددهنده برای ویژگیهای ناموجود در فایلهای ورودی خطا صادر کند. توجه داشته باشید که ibt گزارش ویژگی ناموجود GNU_PROPERTY_X86_FEATURE_1_IBT را خاموش میکند و shstk گزارش ویژگی ناموجود GNU_PROPERTY_X86_FEATURE_1_SHSTK را خاموش خواهد کرد. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- combreloc
- nocombreloc
- چندین بخش بازنشانی پویا را ترکیب کرده و مرتب میکند تا حافظه پنهان جستجوی نمادهای پویا بهبود یابد. در صورت استفاده از nocombreloc این کار انجام نمیشود.
- common
- nocommon
- تولید نمادهای عمومی با نوع STT_COMMON در طول یک پیوند با قابلیت بازنشانی. در صورت مشخص شدن nocommon از نوع STT_OBJECT استفاده میشود.
- common-page-size=value
- اندازه صفحهای که بیش از همه استفاده میشود را روی value تنظیم میکند. چیدمان تصویر حافظه بهینهسازی خواهد شد تا در صورت استفاده سیستم از صفحاتی با این اندازه، تعداد صفحات حافظه به حداقل برسد..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 با قابلیت «ردیابی انشعاب غیرمستقیم اینتل» (IBT) تولید میکند. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- ibt
- ویژگی GNU_PROPERTY_X86_FEATURE_1_IBT را در بخش .note.gnu.property تولید میکند تا سازگاری با IBT را مشخص کند. این گزینه همچنین متضمن ibtplt است. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- indirect-extern-access
- noindirect-extern-access
- ویژگی
GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS را
در بخش .note.gnu.property
تولید
میکند تا
مشخص کند
فایل شیء
نیازمند
اشارهگرهای
تابع
استاندارد
است و
نمیتواند
با
بازنشانی
کپی (copy relocation)
استفاده
شود. این
گزینه
همچنین
متضمن noextern-protected-data
و nocopyreloc است.
برای i386 و x86-64
پشتیبانی
میشود.
گزینهٔ noindirect-extern-access مقدار GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS را از بخش .note.gnu.property حذف میکند.
- initfirst
- این گزینه تنها هنگام ساخت یک شیء اشتراکی معنا دارد. شیء را طوری علامتگذاری میکند که مقداردهی اولیهٔ زمان اجرای آن قبل از مقداردهی اولیهٔ زمان اجرای هر شیء دیگری که همزمان به فرآیند آورده میشود، رخ دهد. به همین ترتیب، پایانپذیری زمان اجرای شیء پس از پایانپذیری زمان اجرای هر شیء دیگری رخ خواهد داد.
- interpose
- مشخص میکند که بارگذار پویا باید ترتیب جستجوی نمادها را تغییر دهد تا نمادهای موجود در این کتابخانهٔ اشتراکی، جایگزین (interpose) نمادهای سایر کتابخانههای اشتراکی که اینگونه علامتگذاری نشدهاند، شوند.
- unique
- nounique
- هنگام تولید یک کتابخانهٔ اشتراکی یا سایر اشیاء ELF با قابلیت بارگذاری پویا، آن را به گونهای علامتگذاری میکند که (بهطور پیشفرض) فقط یکبار و تنها در فضاینام اصلی (هنگام استفاده از "dlmopen") بارگذاری شود. این گزینه اساساً برای علامتگذاری کتابخانههای بنیادی نظیر libc، libpthread و غیره استفاده میشود که معمولاً بهدرستی کار نمیکنند مگر اینکه تنها نمونهٔ موجود از خود باشند. این رفتار میتواند توسط فراخوانندهٔ "dlmopen" بازنویسی شود و برای برخی سازوکارهای بارگذاری (مانند کتابخانههای حسابرسی) اعمال نمیشود.
- lam-u48
- ویژگی GNU_PROPERTY_X86_FEATURE_1_LAM_U48 را در بخش .note.gnu.property تولید میکند تا سازگاری با Intel LAM_U48 را نشان دهد. برای Linux/x86_64 پشتیبانی میشود.
- lam-u57
- ویژگی GNU_PROPERTY_X86_FEATURE_1_LAM_U57 را در بخش .note.gnu.property تولید میکند تا سازگاری با Intel LAM_U57 را نشان دهد. برای Linux/x86_64 پشتیبانی میشود.
- lam-u48-report=none
- lam-u48-report=warning
- lam-u48-report=error
- نحوهٔ گزارش عدم وجود ویژگی GNU_PROPERTY_X86_FEATURE_1_LAM_U48 در بخش ورودی .note.gnu.property را مشخص میکند. lam-u48-report=none که حالت پیشفرض است، باعث میشود پیونددهنده عدم وجود ویژگیها در فایلهای ورودی را گزارش نکند. lam-u48-report=warning باعث میشود پیونددهنده برای ویژگیهای ناموجود در فایلهای ورودی یک هشدار صادر کند. lam-u48-report=error باعث میشود پیونددهنده برای ویژگیهای ناموجود در فایلهای ورودی یک خطا صادر کند. برای Linux/x86_64 پشتیبانی میشود.
- lam-u57-report=none
- lam-u57-report=warning
- lam-u57-report=error
- نحوهٔ گزارش عدم وجود ویژگی GNU_PROPERTY_X86_FEATURE_1_LAM_U57 در بخش ورودی .note.gnu.property را مشخص میکند. lam-u57-report=none که حالت پیشفرض است، باعث میشود پیونددهنده عدم وجود ویژگیها در فایلهای ورودی را گزارش نکند. lam-u57-report=warning باعث میشود پیونددهنده برای ویژگیهای ناموجود در فایلهای ورودی یک هشدار صادر کند. lam-u57-report=error باعث میشود پیونددهنده برای ویژگیهای ناموجود در فایلهای ورودی یک خطا صادر کند. برای Linux/x86_64 پشتیبانی میشود.
- lam-report=none
- lam-report=warning
- lam-report=error
- نحوهٔ گزارش عدم وجود ویژگیهای GNU_PROPERTY_X86_FEATURE_1_LAM_U48 و GNU_PROPERTY_X86_FEATURE_1_LAM_U57 در بخش ورودی .note.gnu.property را مشخص میکند. lam-report=none که حالت پیشفرض است، باعث میشود پیونددهنده عدم وجود ویژگیها در فایلهای ورودی را گزارش نکند. lam-report=warning باعث میشود پیونددهنده برای ویژگیهای ناموجود در فایلهای ورودی یک هشدار صادر کند. lam-report=error باعث میشود پیونددهنده برای ویژگیهای ناموجود در فایلهای ورودی یک خطا صادر کند. برای Linux/x86_64 پشتیبانی میشود.
- lazy
- هنگام تولید یک فایل اجرایی یا کتابخانهٔ اشتراکی، آن را طوری علامتگذاری میکند که به پیونددهندهٔ پویا اعلام کند حل فراخوانی توابع را به جای زمان بارگذاری، به زمان فراخوانی تابع موکول کند (پیوند تنبل یا lazy binding). پیوند تنبل حالت پیشفرض است.
- loadfltr
- مشخص میکند که فیلترهای شیء بیدرنگ در زمان اجرا پردازش شوند.
- max-page-size=value
- حداکثر اندازهٔ صفحهٔ حافظهٔ پشتیبانیشده را روی value تنظیم میکند.
- mark-plt
- nomark-plt
- ورودیهای PLT را با برچسبهای پویای DT_X86_64_PLT ،DT_X86_64_PLTSZ و DT_X86_64_PLTENT علامتگذاری میکند. از آنجا که این گزینه یک مقدار غیرصفر را در فیلد r_addend از بازنشانیهای R_X86_64_JUMP_SLOT ذخیره میکند، فایلهای اجرایی و کتابخانههای اشتراکی حاصل با پیونددهندههای پویایی که فیلد r_addend از بازنشانیهای R_X86_64_JUMP_SLOT را نادیده نمیگیرند (مانند پیونددهندهها در نسخههای قدیمیتر glibc بدون تغییر نادیدهگرفتن r_addend در بازنشانیهای R_X86_64_GLOB_DAT و R_X86_64_JUMP_SLOT)، ناسازگار خواهند بود. برای x86_64 پشتیبانی میشود.
- muldefs
- تعریفهای چندگانه را مجاز میشمارد.
- nocopyreloc
- متغیرهای .dynbss تولیدشده توسط پیونددهنده را که به جای متغیرهای تعریفشده در کتابخانههای اشتراکی استفاده میشوند، غیرفعال میکند. ممکن است منجر به بازنشانیهای متنی پویا (dynamic text relocations) شود.
- nodefaultlib
- مشخص میکند که جستجوی بارگذار پویا برای وابستگیهای این شیء، باید هرگونه مسیر جستجوی پیشفرض کتابخانه را نادیده بگیرد.
- nodelete
- مشخص میکند که شیء نباید در زمان اجرا تخلیه شود..IP nodlopen 4 مشخص میکند که شیء برای "dlopen" در دسترس نیست.
- nodump
- مشخص میکند که امکان دامپگیری از شیء توسط "dldump" وجود ندارد.
- noexecstack
- شیء را بهگونهای علامتگذاری میکند که نیازی به پشتهٔ (stack) قابل اجرا نداشته باشد.
- noextern-protected-data
- هنگام ساخت یک کتابخانهٔ اشتراکی، با نمادهای دادهای محافظتشده مانند نمادهای خارجی رفتار نکن. این گزینه پیشفرض پسانهٔ پیونددهنده را لغو میکند. میتوان از آن برای رفع مشکل بازنشانیهای نادرست ایجادشده توسط کامپایلر روی نمادهای دادهای محافظتشده استفاده کرد. تغییرات اعمالشده بر نمادهای دادهای محافظتشده توسط پودمانی دیگر، برای کتابخانهٔ اشتراکی حاصل قابل مشاهده نخواهند بود. در i386 و x86-64 پشتیبانی میشود.
- noreloc-overflow
- بررسی سرریز بازنشانی را غیرفعال میکند. اگر در زمان اجرا هیچ سرریز بازنشانی پویایی وجود نداشته باشد، میتوان از این گزینه برای غیرفعال کردن بررسی سرریز بازنشانی استفاده کرد. در x86_64 پشتیبانی میشود.
- memory-seal
- nomemory-seal
- به فایل اجرایی یا کتابخانهٔ اشتراکی دستور میدهد که تمام بخشهای PT_LOAD باید مهروموم (seal) شوند تا از دستکاریهای بعدی (مانند تغییر پرچمهای حفاظت، اندازهٔ بخش، یا حذف نگاشت) جلوگیری شود. این یک مقاومسازی امنیتی است که به پشتیبانی سیستم نیاز دارد. این گزینه مقدار GNU_PROPERTY_MEMORY_SEAL را در بخش .note.gnu.property ایجاد میکند.
- now
- هنگام تولید یک فایل اجرایی یا کتابخانهٔ اشتراکی، آن را بهگونهای علامتگذاری میکند که به پیونددهندهٔ پویا اعلام کند در هنگام شروع برنامه، یا زمانی که کتابخانهٔ اشتراکی توسط dlopen بارگذاری میشود، همهٔ نمادها را بیدرنگ حل کند، بهجای اینکه حل فراخوانی توابع را به زمان اولین فراخوانی آنها موکول کند.
- origin
- مشخص میکند که شیء به پردازش $ORIGIN در مسیرها نیاز دارد.
- pack-relative-relocs
- nopack-relative-relocs
- تولید بازنشانیهای نسبی فشرده در فایل اجرایی مستقل از موقعیت و کتابخانهٔ اشتراکی. این گزینه ورودیهای "DT_RELR"، "DT_RELRSZ" و "DT_RELRENT" را به بخش پویا اضافه میکند. این گزینه هنگام ساخت فایل اجرایی وابسته به موقعیت و خروجیهای بازنشانیپذیر نادیده گرفته میشود. nopack-relative-relocs حالت پیشفرض است که بازنشانیهای نسبی فشرده را غیرفعال میکند. هنگامی که برنامه با کتابخانهٔ C گنو پیوند داده میشود، یک وابستگی نسخهٔ نماد GLIBC_ABI_DT_RELR به کتابخانهٔ C اشتراکی به خروجی افزوده میشود. در i386 و x86-64 پشتیبانی میشود.
- relro
- norelro
- یک سرآیند بخش ELF "PT_GNU_RELRO" در شیء ایجاد میکند. این کار یک بخش حافظه را مشخص میکند که در صورت پشتیبانی، باید پس از بازنشانی فقطخواندنی شود. تعیین مقدار common-page-size کوچکتر از اندازهٔ صفحهٔ سامانه این حفاظت را بیاثر خواهد کرد. در صورت استفاده از norelro، بخش ELF "PT_GNU_RELRO" ایجاد نمیشود.
- report-relative-reloc
- بازنشانیهای نسبی پویای تولیدشده توسط پیونددهنده را گزارش میدهد. در Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- sectionheader
- nosectionheader
- سرآیند بخش را تولید میکند. در صورت استفاده از nosectionheader، سرآیند بخش تولید نمیشود. sectionheader حالت پیشفرض است.
- separate-code
- noseparate-code
- یک سرآیند بخش "PT_LOAD" برای کد جداگانه در شیء ایجاد میکند. این کار یک بخش حافظه را مشخص میکند که فقط باید شامل دستورالعملها باشد و باید در صفحاتی کاملاً مجزا از هرگونه دادهٔ دیگری قرار گیرد. در صورت استفاده از noseparate-code، بخش "PT_LOAD" برای کد جداگانه ایجاد نمیشود.
- shstk
- برای نشان دادن سازگاری با Intel Shadow Stack، ورودی GNU_PROPERTY_X86_FEATURE_1_SHSTK را در بخش .note.gnu.property تولید میکند. در 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" توسط پیونددهنده ساخته (synthesized) شده باشند. گزینهٔ -z start-stop-gc این رفتار را غیرفعال میکند و اجازه میدهد بخشها بهگونهای جمعآوری زباله (garbage collect) شوند که گویی نمادهای ویژهٔ ساختهشده تعریف نشدهاند. گزینهٔ -z start-stop-gc هیچ تأثیری بر تعریف "__start_SECNAME" یا "__stop_SECNAME" در یک فایل شیء یا اسکریپت پیونددهنده ندارد. چنین تعریفی بهترتیب مانع از ارائهٔ "__start_SECNAME" یا "__stop_SECNAME" ساختهشده توسط پیونددهنده میشود و در نتیجه رفتار ویژهٔ جمعآوری زباله را برای آن ارجاعات لغو میکند.
- start-stop-visibility=value
- دیداری بودن (visibility) نماد ELF را برای نمادهای ساختهشدهٔ "__start_SECNAME" و "__stop_SECNAME" مشخص میکند. مقدار value باید دقیقاً یکی از موارد default، internal، hidden یا protected باشد. اگر هیچ گزینهٔ -z start-stop-visibility تعیین نشده باشد، جهت سازگاری با روال گذشته از protected استفاده میشود. با این حال، شدیداً توصیه میشود در برنامهها و کتابخانههای اشتراکی جدید از -z start-stop-visibility=hidden استفاده شود تا این نمادها بین اشیاء اشتراکی صادر (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_ABI_GNU_TLS" در برنامهها و کتابخانههای اشتراکی خروجی هنگام پیوند با glibc، در صورتی که فایلهای آبجکت جابهجاییپذیر ورودی "___tls_get_addr" را فراخوانی کنند. خروجی در زمان اجرا در برابر glibc که برچسب نگارش "GLIBC_ABI_GNU_TLS" را تعریف نمیکند، بارگذاری و اجرا نخواهد شد. مگر اینکه با گزینهٔ پیکربندی --disable-gnu-tls-tag در زمان ساخت پیونددهنده غیرفعال شده باشد، هنگامی که هیچ گزینهای مشخص نشده باشد، اگر ورودیها دارای فراخوانی "___tls_get_addr" باشند و libc.so برچسب نگارش "GLIBC_ABI_GNU_TLS" را تعریف کند، پیونددهنده وابستگی به برچسب نگارش "GLIBC_ABI_GNU_TLS" را اضافه خواهد کرد. برای Linux/i386 پشتیبانی میشود.
- --gnu2-tls-tag
- --no-gnu2-tls-tag
- افزودن وابستگی به برچسب نگارش "GLIBC_ABI_GNU2_TLS" در برنامهها و کتابخانههای اشتراکی خروجی هنگام پیوند با glibc، در صورتی که فایلهای آبجکت جابهجاییپذیر ورودی دارای جابهجایی "R_386_TLS_DESC_CALL" یا "R_X86_64_TLSDESC_CALL" باشند. خروجی در زمان اجرا در برابر glibc که برچسب نگارش "GLIBC_ABI_GNU2_TLS" را تعریف نمیکند، بارگذاری و اجرا نخواهد شد. مگر اینکه با گزینهٔ پیکربندی --disable-gnu2-tls-tag در زمان ساخت پیونددهنده غیرفعال شده باشد، هنگامی که هیچ گزینهای مشخص نشده باشد، اگر ورودیها دارای جابهجایی "R_386_TLS_DESC_CALL" یا "R_X86_64_TLSDESC_CALL" باشند و libc.so برچسب نگارش "GLIBC_ABI_GNU2_TLS" را تعریف کند، پیونددهنده وابستگی به برچسب نگارش "GLIBC_ABI_GNU2_TLS" را اضافه خواهد کرد. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- -( archives -)
- --start-group archives --end-group
- آرگومان archives
باید
فهرستی از
فایلهای
آرشیو باشد.
آنها
میتوانند
نامهای
صریح فایل
یا
گزینههای
-l باشند.
آرشیوهای مشخصشده بهطور مکرر جستجو میشوند تا زمانی که هیچ ارجاع تعریفنشدهٔ جدیدی ایجاد نشود. بهطور معمول، یک آرشیو تنها یک بار و به ترتیبی که در خط فرمان مشخص شده است جستجو میشود. اگر نمادی در آن آرشیو برای حل یک نماد تعریفنشده که توسط یک شیء در آرشیوی که بعداً در خط فرمان ظاهر میشود ارجاع داده شده لازم باشد، پیونددهنده قادر به حل آن ارجاع نخواهد بود. با گروهبندی آرشیوها، همهٔ آنها تا حل همهٔ ارجاعات ممکن بهطور مکرر جستجو خواهند شد.
استفاده از این گزینه هزینهٔ کارایی قابل توجهی دارد. بهتر است تنها زمانی استفاده شود که ارجاعات مدور اجتنابناپذیری بین دو یا چند آرشیو وجود داشته باشد.
- --accept-unknown-input-arch
- --no-accept-unknown-input-arch
- به پیونددهنده میگوید فایلهای ورودی را که معماری آنها قابل شناسایی نیست، بپذیرد. فرض بر این است که کاربر میداند چه میکند و عمداً میخواهد این فایلهای ورودی ناشناخته را پیوند دهد. این رفتار پیشفرض پیونددهنده پیش از انتشار 2.14 بود. رفتار پیشفرض از انتشار 2.14 به بعد رد کردن چنین فایلهای ورودی است، و از این رو گزینهٔ --accept-unknown-input-arch برای بازگرداندن رفتار پیشین اضافه شده است.
- --as-needed
- --no-as-needed
- این گزینه
بر
برچسبهای
DT_NEEDED در ELF برای
کتابخانههای
پویایی که
پس از
گزینهٔ --as-needed
در خط فرمان
ذکر
شدهاند
تأثیر
میگذارد.
بهطور
معمول
پیونددهنده
صرفنظر از
اینکه
کتابخانه
واقعاً
مورد نیاز
است یا خیر،
یک برچسب DT_NEEDED
برای هر
کتابخانه
پویایی که
در خط فرمان
ذکر شده است
اضافه
میکند. --as-needed
باعث
میشود
برچسب DT_NEEDED
تنها برای
کتابخانهای
صادر شود که
در همان
نقطه از
پیوند، یک
ارجاع نماد
تعریفنشدهٔ
غیرضعیف (non-weak)
را از یک
فایل آبجکت
معمولی
برآورده
کند یا، در
صورتی که
کتابخانه
در
فهرستهای
DT_NEEDED سایر
کتابخانههای
مورد نیاز
نباشد، یک
ارجاع نماد
تعریفنشدهٔ
غیرضعیف از
یک
کتابخانه
پویای مورد
نیازِ دیگر
را برآورده
سازد.
فایلهای
آبجکت یا
کتابخانههایی
که در خط
فرمان پس
از
کتابخانه
مورد نظر
ظاهر
میشوند،
تأثیری بر
اینکه آیا
کتابخانه
مورد نیاز
تشخیص داده
شود یا خیر
ندارند. این
شبیه به
قوانین
استخراج
فایلهای
آبجکت از
آرشیوها
است. --no-as-needed
رفتار
پیشفرض را
بازمیگرداند.
نکته: در سیستمهای مبتنی بر لینوکس، گزینهٔ --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
- هنگام ایجاد یک کتابخانه اشتراکی، ارجاعات به نمادهای سراسری را به تعریف درون همان کتابخانه اشتراکی متصل میکند، در صورتی که تعریفی وجود داشته باشد. بهطور معمول، این امکان برای برنامهای که با یک کتابخانه اشتراکی پیوند خورده وجود دارد که تعریف درون کتابخانه اشتراکی را بازنویسی (override) کند. این گزینه تنها در پلتفرمهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنادار است.
- -Bsymbolic-functions
- هنگام ایجاد یک کتابخانه اشتراکی، ارجاعات به نمادهای توابع سراسری را به تعریف درون همان کتابخانه اشتراکی متصل میکند، در صورتی که تعریفی وجود داشته باشد. این گزینه تنها در پلتفرمهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنادار است.
- -Bno-symbolic
- این گزینه میتواند گزینههای -Bsymbolic و -Bsymbolic-functions مشخصشدهٔ قبلی را لغو کند.
- --dynamic-list=dynamic-list-file
- نام یک فایل
فهرست پویا
را به
پیونددهنده
مشخص
میکند. این
گزینه
معمولاً
هنگام
ایجاد
کتابخانههای
اشتراکی
برای مشخص
کردن
فهرستی از
نمادهای
سراسری
استفاده
میشود که
ارجاعات
آنها
نباید به
تعریف درون
کتابخانه
اشتراکی
متصل شوند،
یا هنگام
ایجاد
فایلهای
اجرایی
پیوندیافته
بهصورت
پویا، برای
تعیین
فهرستی از
نمادها که
باید به
جدول
نمادها در
فایل
اجرایی
اضافه شوند.
این گزینه
تنها در
پلتفرمهای
ELF که از
کتابخانههای
اشتراکی
پشتیبانی
میکنند
معنادار
است.
قالب فهرست پویا همانند گره نگارش بدون حوزه (scope) و نام گره است. برای اطلاعات بیشتر VERSION را ببینید.
- --dynamic-list-data
- گنجاندن تمام نمادهای دادهای سراسری در فهرست پویا.
- --dynamic-list-cpp-new
- ارائهٔ فهرست پویای توکار برای عملگرهای new و delete در C++. این گزینه عمدتاً برای ساخت libstdc++ بهصورت اشتراکی کاربرد دارد..IP --dynamic-list-cpp-typeinfo 4 فهرست پویای توکار برای شناسایی نوع در زمان اجرای C++ را ارائه میدهد.
- --check-sections
- --no-check-sections
- از پیونددهنده میخواهد که پس از تخصیص آدرسهای بخشها، وجود هرگونه همپوشانی را بررسی نکند. در حالت عادی، پیونددهنده این بررسی را انجام میدهد و در صورت یافتن هرگونه همپوشانی، پیامهای خطای مناسبی تولید میکند. پیونددهنده بخشهای موجود در همپوشانها (overlays) را میشناسد و آنها را در نظر میگیرد. رفتار پیشفرض را میتوان با استفاده از سوییچ خط فرمان --check-sections بازگرداند. معمولاً همپوشانی بخشها برای پیوندهای بازآدرسپذیر بررسی نمیشود. در آن صورت میتوانید با استفاده از گزینهٔ --check-sections بررسی را اجباری کنید.
- --copy-dt-needed-entries
- --no-copy-dt-needed-entries
- این گزینه
بر نحوهٔ
برخورد با
کتابخانههای
پویایی که
توسط
برچسبهای
DT_NEEDED درون
کتابخانههای
پویای ELF
ذکرشده در
خط فرمان به
آنها
ارجاع داده
شده، تأثیر
میگذارد.
بهطور
معمول،
پیونددهنده
به ازای هر
کتابخانهای
که در یک
برچسب DT_NEEDED در
یک
کتابخانهٔ
پویای
ورودی ذکر
شده است،
برچسب DT_NEEDED را
به باینری
خروجی
اضافه
نخواهد کرد.
با این حال،
با مشخص
کردن --copy-dt-needed-entries
در خط
فرمان،
مدخلهای DT_NEEDED
هر
کتابخانهٔ
پویایی که
پس از آن
بیاید
اضافه
خواهد شد.
رفتار
پیشفرض را
میتوان با
--no-copy-dt-needed-entries
بازگرداند.
این گزینه همچنین بر حلوفصل نمادها در کتابخانههای پویا تأثیر دارد. با --copy-dt-needed-entries، کتابخانههای پویای ذکرشده در خط فرمان با دنبال کردن برچسبهای DT_NEEDED آنها به کتابخانههای دیگر، بهصورت بازگشتی جستجو میشوند تا نمادهای مورد نیاز باینری خروجی حلوفصل گردند. اما در تنظیمات پیشفرض، جستجوی کتابخانههای پویایی که پس از آن میآیند، در خود همان کتابخانهٔ پویا متوقف خواهد شد. هیچ پیوند DT_NEEDEDای برای حل نمادها پیمایش نمیشود.
- --cref
- یک جدول
ارجاع
متقابل
خروجی
میدهد. اگر
یک فایل
نقشهٔ
پیونددهنده
در حال
تولید
باشد، جدول
ارجاع
متقابل در
فایل نقشه
چاپ میشود.
در غیر این
صورت، در
خروجی
استاندارد
چاپ خواهد
شد.
قالب جدول عمداً ساده است تا در صورت لزوم توسط یک اسکریپت بهآسانی پردازش شود. نمادها به ترتیب نام چاپ میشوند. برای هر نماد، فهرستی از نامهای فایل ارائه میشود. اگر نماد تعریف شده باشد، اولین فایل فهرستشده محل تعریف آن است. اگر نماد بهصورت مقدار مشترک (common) تعریف شده باشد، هر فایلی که این اتفاق در آن رخ داده در ادامه میآید. در نهایت، هر فایلی که به نماد ارجاع میدهد فهرست میشود.
- --ctf-variables
- --no-ctf-variables
- قالب اشکالزدایی CTF از بخشی پشتیبانی میکند که نامها و انواع متغیرهای یافتشده در برنامه را که در هیچ جدول نمادی ظاهر نمیشوند، کدگذاری میکند. این متغیرها به وضوح نمیتوانند توسط اشکالزداهای سنتی بر اساس آدرس جستجو شوند، بنابراین فضای استفادهشده برای انواع و نامهای آنها معمولاً هدر میرود: انواع معمولاً کوچک هستند اما نامها اغلب اینگونه نیستند. --ctf-variables باعث ایجاد چنین بخشی میشود. رفتار پیشفرض را میتوان با --no-ctf-variables بازگرداند.
- --ctf-share-types=method
- روش مورد استفاده برای اشتراکگذاری انواع میان واحدهای ترجمه در CTF را تنظیم میکند.
- تمام انواعی را که تعاریف مبهم ندارند در فرهنگ لغت مشترک قرار میدهد، جایی که اشکالزداها میتوانند بهراحتی به آنها دسترسی داشته باشند، حتی اگر فقط در یک واحد ترجمه ظاهر شده باشند. این حالت پیشفرض است.
- فقط انواعی را در فرهنگ لغت مشترک قرار میدهد که در چندین واحد ترجمه ظاهر شدهاند: انواع با تنها یک تعریف به فرهنگهای لغت اختصاصی هر واحد ترجمه میروند. انواع با تعاریف مبهم در چندین واحد ترجمه همواره به فرهنگهای لغت اختصاصی هر واحد ترجمه میروند. این کار معمولاً اندازهٔ CTF را بزرگتر میکند، اما ممکن است حجم CTF در فرهنگ لغت مشترک را کاهش دهد. برای پروژههای بسیار بزرگ، این کار ممکن است سرعت باز کردن CTF را افزایش دهد و در زمان اجرا، حافظهٔ مصرفکنندهٔ CTF را ذخیره کند.
- --no-define-common
- این گزینه
مانع تخصیص
آدرس به
نمادهای
مشترک
میشود.
دستور
اسکریپت
"INHIBIT_COMMON_ALLOCATION"
اثر مشابهی
دارد.
گزینهٔ --no-define-common امکان تفکیک تصمیمگیری برای تخصیص آدرس به نمادهای مشترک از انتخاب نوع فایل خروجی را فراهم میکند؛ در غیر این صورت، یک نوع خروجی غیربازآدرسپذیر، تخصیص آدرس به نمادهای مشترک را اجباری میکند. استفاده از --no-define-common اجازه میدهد نمادهای مشترکی که از یک کتابخانهٔ مشترک ارجاع داده شدهاند، فقط در برنامهٔ اصلی آدرسدهی شوند. این امر فضای تکراری بلااستفاده در کتابخانهٔ مشترک را حذف میکند و همچنین از هرگونه سردرگمی احتمالی ناشی از حلوفصل به نسخهٔ تکراری اشتباه در زمان وجود چندین ماژول پویا با مسیرهای جستجوی خاص برای حل نماد در زمان اجرا، جلوگیری میکند.
- --force-group-allocation
- این گزینه باعث میشود پیونددهنده اعضای گروه بخش را همانند بخشهای ورودی عادی جایگذاری کند و گروههای بخش را حذف نماید. این رفتار پیشفرض برای یک پیوند نهایی است، اما میتوان از این گزینه برای تغییر رفتار پیوند بازآدرسپذیر (-r) استفاده کرد. دستور اسکریپت "FORCE_GROUP_ALLOCATION" اثر مشابهی دارد.
- --defsym=symbol=expression
- یک نماد
سراسری در
فایل خروجی
ایجاد
میکند که
حاوی آدرس
مطلقی است
که توسط expression
مشخص شده
است.
میتوانید
به تعداد
دفعات مورد
نیاز از این
گزینه برای
تعریف
چندین نماد
در خط فرمان
استفاده
کنید. شکل
محدودی از
محاسبات
برای expression در
این زمینه
پشتیبانی
میشود:
میتوانید
یک ثابت
هگزادسیمال
یا نام یک
نماد موجود
را بدهید،
یا از "+"
و "-"
برای جمع یا
تفریق
ثابتهای
هگزادسیمال
یا نمادها
استفاده
کنید. اگر
به
عبارتهای
پیچیدهتری
نیاز
دارید،
استفاده از
زبان دستور
پیونددهنده
از طریق یک
اسکریپت را
مد نظر قرار
دهید. نکته:
نباید هیچ
فاصلهٔ
سفیدی بین
symbol، علامت
مساوی ("=") و
expression وجود
داشته باشد.
پیونددهنده آرگومانهای --defsym و -T را به ترتیب پردازش میکند؛ قرار دادن --defsym پیش از -T نماد را پیش از پردازش اسکریپت پیونددهندهٔ حاصل از -T تعریف میکند، در حالی که قرار دادن --defsym پس از -T نماد را پس از پردازش اسکریپت پیونددهنده تعریف خواهد کرد. این تفاوت برای عبارتهایی درون اسکریپت پیونددهنده که از نمادهای --defsym استفاده میکنند پیامدهایی دارد؛ اینکه کدام ترتیب درست است به هدف مورد نظر شما بستگی دارد.
- --demangle[=style]
- --no-demangle
- این گزینهها نمادزدایی نام نمادها در پیامهای خطا و سایر خروجیها را کنترل میکنند. هنگامی که به پیونددهنده دستور نمادزدایی داده شود، تلاش میکند تا نام نمادها را به شیوهای خوانا نمایش دهد: زیرخطهای ابتدایی را در صورتی که توسط قالب فایل شیء استفاده شده باشند حذف میکند، و نامهای درهمریختهٔ نمادهای C++ را به نامهای خوانا برای کاربر تبدیل میکند. کامپایلرهای مختلف سبکهای درهمریزی متفاوتی دارند. از آرگومان اختیاری سبک نمادزدایی میتوان برای انتخاب سبک مناسب برای کامپایلر خود استفاده کرد. پیونددهنده بهطور پیشفرض نمادزدایی را انجام میدهد مگر اینکه متغیر محیطی COLLECT_NO_DEMANGLE تنظیم شده باشد. این گزینهها را میتوان برای لغو این رفتار پیشفرض به کار برد.
- -Ifile
- --dynamic-linker=file
- نام پیونددهندهٔ پویا را تعیین میکند. این گزینه تنها هنگام تولید فایلهای اجرایی ELF با پیوند پویا معنادار است. پیونددهندهٔ پویای پیشفرض معمولاً صحیح است؛ از این گزینه استفاده نکنید مگر اینکه بدانید چه میکنید.
- --no-dynamic-linker
- هنگام تولید یک فایل اجرایی، درخواست استفاده از پیونددهندهٔ پویا در زمان بارگذاری را حذف میکند. این گزینه فقط برای فایلهای اجرایی ELF که حاوی بازآدرسدهیهای پویا هستند معنا دارد و معمولاً نیازمند کد نقطهٔ ورودی است که قادر به پردازش این بازآدرسدهیها باشد.
- --embedded-relocs
- این گزینه مشابه گزینهٔ --emit-relocs است، با این تفاوت که بازآدرسدهیها در بخشی مختص به هدف ذخیره میشوند. این گزینه فقط توسط اهداف BFIN، CR16 و M68K پشتیبانی میشود.
- --disable-multiple-abs-defs
- اجازهٔ تعاریف چندگانه برای نمادهای موجود در فایلی که با -R یا --just-symbols فراخوانی شده است را نمیدهد.
- --fatal-warnings
- --no-fatal-warnings
- با همهٔ هشدارها مانند خطا رفتار میکند. رفتار پیشفرض را میتوان با گزینهٔ --no-fatal-warnings بازگرداند..IP -w 4
- --no-warnings
- هیچ پیام هشدار یا خطایی را نمایش نمیدهد. در صورت فعال بودن --fatal-warnings، این گزینه آن را لغو میکند. این گزینه زمانی میتواند استفاده شود که از پیش مشخص است باینری خروجی کار نخواهد کرد، اما همچنان نیاز به ساخت آن وجود دارد.
- --force-exe-suffix
- اطمینان
حاصل
میکند که
فایل خروجی
دارای
پسوند .exe
باشد.
اگر یک فایل خروجی کاملاً پیوندخورده که با موفقیت ساخته شده است پسوند ".exe" یا ".dll" نداشته باشد، این گزینه پیونددهنده را وادار میکند تا فایل خروجی را در فایلی با همان نام و پسوند ".exe" کپی کند. این گزینه هنگام استفاده از makefileهای دستنخوردهٔ Unix در یک میزبان Microsoft Windows مفید است، زیرا برخی از نسخههای Windows یک image را اجرا نمیکنند مگر اینکه به پسوند ".exe" ختم شود.
- --gc-sections
- --no-gc-sections
- جمعآوری
زبالهٔ (garbage collection)
بخشهای
ورودیِ
استفادهنشده
را فعال
میکند. در
مقصدهایی
که از این
گزینه
پشتیبانی
نمیکنند،
نادیده
گرفته
میشود.
رفتار
پیشفرض
(انجام
ندادن این
جمعآوری
زباله) را
میتوان با
تعیین --no-gc-sections
در خط فرمان
بازگرداند.
توجه داشته
باشید که
جمعآوری
زباله برای
مقصدهای با
قالب COFF و PE
پشتیبانی
میشود،
اما
پیادهسازی
آن در حال
حاضر
آزمایشی
تلقی
میشود.
گزینهٔ --gc-sections با بررسی نمادها و بازنشانیها (relocations) تصمیم میگیرد کدام بخشهای ورودی استفاده شدهاند. بخشی که شامل نماد نقطهٔ ورود (entry symbol) است و تمام بخشهای شامل نمادهای تعریفنشده در خط فرمان نگهداشته خواهند شد؛ همچنین بخشهایی که شامل نمادهای ارجاعشده توسط اشیاء پویا هستند نیز حفظ میشوند. توجه داشته باشید که هنگام ساخت کتابخانههای اشتراکی، پیونددهنده باید فرض کند هر نمادِ مرئی (visible) مورد ارجاع قرار گرفته است. پس از تعیین این مجموعهٔ اولیه از بخشها، پیونددهنده بهطور بازگشتی هر بخشی را که توسط بازنشانیهای آنها ارجاع داده شده، بهعنوان استفادهشده علامتگذاری میکند. --entry، --undefined و --gc-keep-exported را ببینید.
این گزینه را میتوان هنگام انجام پیوند جزئی (که با گزینهٔ -r فعال میشود) تنظیم کرد. در این حالت، ریشهٔ نمادهای نگهداشتهشده باید صراحتاً توسط یکی از گزینههای --entry، --undefined یا --gc-keep-exported یا با یک دستور "ENTRY" در اسکریپت پیونددهنده مشخص شود.
بهعنوان یک افزونهٔ GNU، بخشهای ورودی ELF که با پرچم "SHF_GNU_RETAIN" علامتگذاری شده باشند، جمعآوری زباله نخواهند شد.
- --print-gc-sections
- --no-print-gc-sections
- فهرست تمام بخشهای حذفشده توسط جمعآوری زباله را نمایش میدهد. این فهرست در stderr چاپ میشود. این گزینه تنها در صورتی مؤثر است که جمعآوری زباله از طریق گزینهٔ (--gc-sections فعال شده باشد. رفتار پیشفرض (فهرست نکردن بخشهای حذفشده) را میتوان با تعیین --no-print-gc-sections در خط فرمان بازگرداند.
- --gc-keep-exported
- هنگامی که --gc-sections فعال است، این گزینه از جمعآوری زبالهٔ بخشهای ورودیِ استفادهنشدهای که شامل نمادهای سراسری با پدیداری (visibility) پیشفرض یا محافظتشده هستند، جلوگیری میکند. این گزینه برای فایلهای اجرایی در نظر گرفته شده است که در غیر این صورت، بخشهای بدون ارجاع آنها صرفنظر از پدیداری خارجی نمادهای موجود، جمعآوری زباله میشدند. توجه داشته باشید که این گزینه هنگام پیوند اشیاء اشتراکی هیچ تأثیری ندارد، زیرا پیشاپیش رفتار پیشفرض همین است. این گزینه فقط برای مقصدهای با قالب ELF پشتیبانی میشود.
- --print-output-format
- نام قالب خروجی پیشفرض را چاپ میکند (که ممکن است تحت تأثیر دیگر گزینههای خط فرمان قرار گیرد). این همان رشتهای است که در دستور اسکریپت پیونددهندهٔ "OUTPUT_FORMAT" ظاهر میشود.
- --print-memory-usage
- اندازهٔ
استفادهشده،
اندازهٔ کل
و میزان
استفاده از
ناحیههای
حافظهٔ
ایجادشده
با دستور MEMORY
را چاپ
میکند. این
ویژگی در
مقصدهای
تعبیهشده
(embedded targets) برای
مشاهدهٔ
سریع میزان
حافظهٔ
آزاد
کاربردی
است. قالب
خروجی
دارای یک
سربرگ و یک
سطر به ازای
هر ناحیه
است؛ هم
برای انسان
خواناست و
هم
بهسادگی
توسط
ابزارها
قابل تجزیه
است. در
اینجا
نمونهای
از خروجی
آمده است:
Memory region Used Size Region Size %age Used ROM: 256 KB 1 MB 25.00% RAM: 32 B 2 GB 0.00%نکته: اگر میخواهید از میزان مصرف حافظه توسط خود پیونددهنده مطلع شوید، گزینهٔ --stats این کار را انجام میدهد.
- --help
- خلاصهای از گزینههای خط فرمان را در خروجی استاندارد چاپ کرده و خارج میشود.
- --target-help
- خلاصهای از تمام گزینههای مختص مقصد را در خروجی استاندارد چاپ کرده و خارج میشود.
- -Map=mapfile
- یک نگاشت
پیوند (link map) را
در فایل mapfile
چاپ میکند.
توضیحات
گزینهٔ -M
در بالا را
ببینید. اگر
mapfile فقط
نویسهٔ
"-"
باشد،
نگاشت در stdout
نوشته
خواهد شد.
تعیین یک دایرکتوری به عنوان mapfile باعث میشود نگاشت پیونددهنده به عنوان یک فایل در داخل آن دایرکتوری نوشته شود. به طور معمول نام فایل درون دایرکتوری از نام پایه (basename) فایل خروجی (output) به همراه پسوند ".map" تشکیل میشود. با این حال اگر نویسهٔ ویژهٔ "%" استفاده شود، با مسیر کامل فایل خروجی جایگزین خواهد شد. علاوه بر این، اگر نویسهای بعد از نماد % وجود داشته باشد، پسوند ".map" دیگر اضافه نخواهد شد.
-o foo.exe -Map=bar [Creates ./bar] -o ../dir/foo.exe -Map=bar [Creates ./bar] -o foo.exe -Map=../dir [Creates ../dir/foo.exe.map] -o ../dir2/foo.exe -Map=../dir [Creates ../dir/foo.exe.map] -o foo.exe -Map=% [Creates ./foo.exe.map] -o ../dir/foo.exe -Map=% [Creates ../dir/foo.exe.map] -o foo.exe -Map=%.bar [Creates ./foo.exe.bar] -o ../dir/foo.exe -Map=%.bar [Creates ./foo.exe.bar] -o ../dir2/foo.exe -Map=../dir/% [Creates ../dir/../dir2/foo.exe.map] -o ../dir2/foo.exe -Map=../dir/%.bar [Creates ../dir/../dir2/foo.exe.bar]
تعیین بیش از یک نویسهٔ "%" یک خطا محسوب میشود.
اگر فایل نگاشت از قبل وجود داشته باشد، توسط این عملیات بازنویسی خواهد شد.
- --no-keep-memory
- ld معمولاً با ذخیره کردن جدول نمادهای فایلهای ورودی در حافظه، سرعت را بر مصرف حافظه ترجیح داده و بهینهسازی میکند. این گزینه به ld میگوید که در عوض، با بازخوانی مجدد جدول نمادها در صورت لزوم، مصرف حافظه را بهینهسازی کند. اگر ld هنگام پیوند یک فایل اجرایی بزرگ با کمبود حافظه مواجه شود، استفاده از این گزینه ممکن است ضروری باشد.
- --no-undefined
- -z defs
- ارجاعات
حلنشده به
نمادها از
فایلهای
شیء (object files)
معمولی را
گزارش
میدهد. این
کار حتی اگر
پیونددهنده
در حال
ایجاد یک
کتابخانهٔ
اشتراکی
غیرنمادین
باشد نیز
انجام
میشود.
سوئیچ
--[no-]allow-shlib-undefined
رفتار
مربوط به
گزارش
ارجاعات
حلنشدهٔ
یافتشده
در
کتابخانههای
اشتراکی
پیوندخورده
را کنترل
میکند.
اثرات این گزینه را میتوان با استفاده از "-z undefs" لغو کرد.
- --allow-multiple-definition
- -z muldefs
- بهطور معمول وقتی یک نماد چندین بار تعریف شود، پیونددهنده یک خطای مهلک گزارش میدهد. این گزینهها تعاریف چندگانه را مجاز دانسته و از اولین تعریف استفاده خواهد شد.
- --allow-shlib-undefined
- --no-allow-shlib-undefined
- نمادهای
تعریفنشده
در
کتابخانههای
اشتراکی را
مجاز یا
غیرمجاز
میکند. این
سوئیچ شبیه
به --no-undefined است،
با این
تفاوت که
رفتار
مربوط به
نمادهای
تعریفنشده
در یک
کتابخانهٔ
اشتراکی را
تعیین
میکند، نه
در یک فایل
شیء معمولی.
این گزینه
تأثیری بر
نحوهٔ
مدیریت
نمادهای
تعریفنشده
در
فایلهای
شیء معمولی
ندارد.
رفتار پیشفرض این است که اگر پیونددهنده برای ایجاد یک فایل اجرایی استفاده شود، برای هر نماد تعریفنشدهٔ ارجاع دادهشده در کتابخانههای اشتراکی خطا گزارش دهد، اما اگر پیونددهنده برای ایجاد یک کتابخانهٔ اشتراکی به کار رود، آنها را مجاز بداند.
دلایل مجاز بودن ارجاعات نمادهای تعریفنشده در کتابخانههای اشتراکیِ مشخصشده در زمان پیوند عبارتند از اینکه:
- •
- برخی
سیستمعاملها
مانند BeOS و HPPA
وجود دارند
که در آنها
نمادهای
تعریفنشده
در
کتابخانههای
اشتراکی
امری عادی
است.
بهعنوان مثال، هستهٔ BeOS کتابخانههای اشتراکی را در زمان بارگذاری وصله (patch) میکند تا مناسبترین تابع را برای معماری جاری انتخاب کند. این مورد، مثلاً، برای انتخاب پویای یک تابع مناسب memset استفاده میشود.
- --error-handling-script=scriptname
- در صورت
تعیین این
گزینه، هر
زمان که
خطایی رخ
دهد،
پیونددهنده
scriptname را
فراخوانی
میکند. با
این حال، در
حال حاضر
تنها از دو
نوع خطا
پشتیبانی
میشود:
نمادهای
مفقود و
کتابخانههای
مفقود. دو
آرگومان به
اسکریپت
ارسال
میشود:
کلمهٔ
کلیدی "undefined-symbol"
یا "missing-lib" و name
مربوط به
نماد
تعریفنشده
یا
کتابخانهٔ
مفقود. هدف
این است که
اسکریپت
پیشنهادهایی
را در مورد
این که نماد
یا
کتابخانه
در کجا ممکن
است یافت
شود به
کاربر
ارائه دهد.
پس از پایان
اجرای
اسکریپت،
پیام خطای
معمول
پیونددهنده
نمایش داده
خواهد شد.
در دسترس بودن این گزینه توسط یک سوئیچ زمان پیکربندی کنترل میشود، بنابراین ممکن است در پیادهسازیهای خاص وجود نداشته باشد.
- --no-undefined-version
- بهطور معمول هنگامی که یک نماد دارای نگارش تعریفنشده باشد، پیونددهنده آن را نادیده میگیرد. این گزینه نمادهایی با نگارش تعریفنشده را غیرمجاز میکند و در عوض یک خطای مهلک صادر خواهد شد.
- --default-symver
- ایجاد و استفاده از یک نگارش پیشفرض نماد (soname) برای نمادهای صادرشدهٔ فاقد نگارش.
- --default-imported-symver
- ایجاد و استفاده از یک نگارش پیشفرض نماد (soname) برای نمادهای واردشدهٔ فاقد نگارش.
- --no-warn-mismatch
- بهطور معمول اگر سعی کنید فایلهای ورودی را که به دلایلی با یکدیگر ناهمخوان هستند، شاید به این دلیل که برای پردازندههای متفاوت یا برای ترتیب بایتهای (endianness) مختلف کامپایل شدهاند، به هم پیوند دهید، 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
- یک فایل اجرایی مستقل از موقعیت (position independent executable) ایجاد میکند. این مورد در حال حاضر تنها در بسترهای ELF پشتیبانی میشود. فایلهای اجرایی مستقل از موقعیت توسط پیونددهندهٔ پویا به آدرس مجازی که سیستمعامل برای آنها انتخاب میکند جابهجا (relocate) میشوند که میتواند بین هر بار اجرا متفاوت باشد. آنها در سربرگ فایل ELF با ET_DYN مشخص میشوند، اما از جهات متعددی با کتابخانههای اشتراکی تفاوت دارند. بهویژه، نمادهای تعریفشده در یک PIE بهطور پیشفرض نمیتوانند توسط شیء دیگری جایگزین (override) شوند، در حالی که در کتابخانههای اشتراکی چنین امکانی وجود دارد.
- -no-pie
- یک فایل اجرایی وابسته به موقعیت ایجاد میکند. این حالت پیشفرض است.
- -qmagic
- این گزینه برای سازگاری با Linux نادیده گرفته میشود.
- -Qy
- این گزینه برای سازگاری با SVR4 نادیده گرفته میشود.
- --relax
- --no-relax
- گزینهای
با اثرات
وابسته به
ماشین. این
گزینه تنها
در چند هدف
پشتیبانی
میشود.
در برخی بسترها، گزینهٔ --relax بهینهسازیهای سراسری و مختص هدف را انجام میدهد که با حل کردن آدرسدهی در برنامه توسط پیونددهنده امکانپذیر میشوند؛ از قبیل تعدیل حالتهای آدرسدهی، ساخت دستورالعملهای جدید، انتخاب نگارشهای کوتاهتر از دستورالعملهای جاری، و ادغام مقادیر ثابت.
در برخی بسترها، این بهینهسازیهای سراسری زمان پیوند ممکن است اشکالزدایی نمادین (symbolic debugging) فایل اجرایی حاصل را غیرممکن سازد. مشخص شده است که این موضوع در مورد خانوادهٔ پردازندههای Matsushita MN10200 و MN10300 صادق است.
در بسترهایی که این ویژگی پشتیبانی میشود، گزینهٔ --no-relax آن را غیرفعال خواهد کرد.
در بسترهایی که این ویژگی پشتیبانی نمیشود، هر دو گزینهٔ --relax و --no-relax پذیرفته میشوند، اما نادیده گرفته خواهند شد.
- --retain-symbols-file=filename
- تنها
نمادهای
فهرستشده
در فایل filename
را حفظ کرده
و بقیه را
دور
میاندازد.
filename صرفاً یک
فایل متنی
ساده با یک
نام نماد در
هر خط است.
این گزینه
بهویژه در
محیطهایی
(مانند VxWorks) که
یک جدول
نماد
سراسری
بزرگ
بهتدریج
انباشته
میشود،
جهت
صرفهجویی
در حافظهٔ
زمان اجرا
مفید است.
گزینهٔ --retain-symbols-file نمادهای تعریفنشده، یا نمادهای مورد نیاز برای بازآراییها را دور نمیاندازد.
شما فقط میتوانید یک بار --retain-symbols-file را در خط فرمان مشخص کنید. این گزینه -s و -S را نادیده گرفته و جایگزین آنها میشود.
- -rpath=dir
- یک
دایرکتوری
را به مسیر
جستجوی
کتابخانه
در زمان
اجرا اضافه
میکند. این
گزینه
هنگام
پیوند دادن
یک فایل
اجرایی ELF با
اشیاء
اشتراکی
استفاده
میشود.
تمام
آرگومانهای
-rpath به
یکدیگر
الحاق شده و
به
پیونددهندهٔ
زمان اجرا
تحویل داده
میشوند،
که از آنها
برای یافتن
اشیاء
اشتراکی در
زمان اجرا
استفاده
میکند.
گزینهٔ -rpath همچنین هنگام مکانیابی اشیاء اشتراکی که مورد نیاز اشیاء اشتراکی صریحاً گنجاندهشده در پیوند هستند نیز استفاده میشود؛ توضیحات گزینهٔ -rpath-link را ببینید. جستجوی -rpath به این روش تنها توسط پیونددهندههای بومی (native) و پیونددهندههای متقاطع (cross) که با گزینهٔ --with-sysroot پیکربندی شدهاند پشتیبانی میشود.
اگر هنگام پیوند یک فایل اجرایی ELF از -rpath استفاده نشود، محتویات متغیر محیطی "LD_RUN_PATH" در صورت تعریف بودن استفاده خواهد شد.
گزینهٔ -rpath همچنین ممکن است در SunOS استفاده شود. بهطور پیشفرض، در SunOS، پیونددهنده یک مسیر جستجوی زمان اجرا را از تمامی گزینههای -L دادهشده به آن تشکیل میدهد. اگر از گزینهٔ -rpath استفاده شود، مسیر جستجوی زمان اجرا منحصراً با استفاده از گزینههای -rpath و با صرفنظر از گزینههای -L تشکیل خواهد شد. این ویژگی میتواند هنگام استفاده از gcc مفید باشد، چرا که گزینههای -L متعددی را اضافه میکند که ممکن است بر روی سیستمهای فایل سوارشده از طریق NFS باشند.
برای سازگاری با سایر پیونددهندههای ELF، اگر بعد از گزینهٔ -R بهجای نام یک فایل، نام یک دایرکتوری بیاید، همانند گزینهٔ -rpath در نظر گرفته میشود..IP -rpath-link=dir 4 هنگام استفاده از ELF یا SunOS، ممکن است یک کتابخانه اشتراکی به کتابخانه دیگری نیاز داشته باشد. این اتفاق زمانی رخ میدهد که یک پیوند "ld -shared"، یک کتابخانه اشتراکی را به عنوان یکی از فایلهای ورودی در بر داشته باشد.
هنگامی که پیونددهنده در زمان انجام یک پیوند غیر اشتراکی و غیرقابلجابهجایی با چنین وابستگیای مواجه میشود، در صورتی که کتابخانه اشتراکی مورد نیاز به صورت صریح اضافه نشده باشد، به طور خودکار سعی میکند آن را پیدا کرده و در پیوند بگنجاند. در چنین حالتی، چندین دایرکتوری به ترتیبی که در زیر آمده است جستجو میشوند. گزینهٔ -rpath-link نخستین دسته از دایرکتوریها را برای جستجو تعیین میکند. این گزینه میتواند دنبالهای از نامهای دایرکتوری را با ارائه فهرستی از نامهای جدا شده با دونقطه یا با تکرار چندینبارهٔ گزینه مشخص کند.
نشانههای $ORIGIN و $LIB میتوانند در این دایرکتوریهای جستجو ظاهر شوند. در مورد $ORIGIN، این نشانه با مسیر کامل دایرکتوری حاوی برنامه یا شیء اشتراکی جایگزین خواهد شد، و در مورد $LIB بسته به معماری، با lib - برای باینریهای ۳۲ بیتی - یا lib64 - برای باینریهای ۶۴ بیتی - جایگزین میشود.
شکل جایگزین این نشانهها - ${ORIGIN} و ${LIB} نیز میتواند استفاده شود. نشانهٔ $PLATFORM پشتیبانی نمیشود.
گزینهٔ --rpath-link باید با احتیاط استفاده شود، زیرا مسیر جستجویی را که ممکن است به طور سختکد در کتابخانه اشتراکی کامپایل شده باشد نادیده میگیرد. در چنین حالتی این احتمال وجود دارد که ناخواسته از مسیر جستجوی متفاوتی نسبت به آنچه پیونددهنده زمان اجرا استفاده میکرد، استفاده شود.
هنگامی که کتابخانههای اشتراکی اضافی مورد نیاز باشند، پیونددهنده برای یافتن آنها دایرکتوریها را به ترتیبی که در زیر آمده است جستجو میکند. توجه داشته باشید که این موضوع تنها در مورد کتابخانههای اضافی صدق میکند که برای برآورده کردن نیازهای کتابخانههای اشتراکی وارد شده از قبل، لازم هستند. این امر برای کتابخانههایی که از طریق گزینهٔ خط فرمان -l اضافه شدهاند اعمال نمیشود. جستجو برای کتابخانههای -l تنها در دایرکتوریهای مشخص شده توسط گزینهٔ -L انجام میشود.
- 1.
- هر دایرکتوری مشخص شده توسط گزینههای -rpath-link.
- 2.
- هر دایرکتوری مشخص شده توسط گزینههای -rpath. تفاوت میان -rpath و -rpath-link در این است که دایرکتوریهای مشخص شده با گزینههای -rpath در فایل اجرایی گنجانده شده و در زمان اجرا استفاده میشوند، در حالی که گزینهٔ -rpath-link تنها در زمان پیوند مؤثر است. جستجوی -rpath به این روش تنها توسط پیونددهندههای بومی و پیونددهندههای متقاطع که با گزینهٔ --with-sysroot پیکربندی شدهاند پشتیبانی میشود.
- 3.
- در یک سیستم ELF، برای پیونددهندههای بومی، در صورتی که از گزینههای -rpath و -rpath-link استفاده نشده باشد، محتویات متغیر محیطی "LD_RUN_PATH" جستجو میشود.
- 4.
- در SunOS، اگر از گزینهٔ -rpath استفاده نشده باشد، هر دایرکتوری مشخص شده با استفاده از گزینههای -L جستجو میشود.
- 5.
- برای یک پیونددهنده بومی، محتویات متغیر محیطی "LD_LIBRARY_PATH" جستجو میشود.
- 6.
- برای یک پیونددهنده بومی ELF، دایرکتوریهای موجود در "DT_RUNPATH" یا "DT_RPATH" یک کتابخانه اشتراکی برای کتابخانههای اشتراکی مورد نیاز آن جستجو میشوند. در صورت وجود مدخلهای "DT_RUNPATH"، مدخلهای "DT_RPATH" نادیده گرفته میشوند.
- 7.
- برای یک پیونددهنده روی سیستم لینوکس، در صورت وجود فایل /etc/ld.so.conf، فهرست دایرکتوریهای یافت شده در آن فایل جستجو میشود. نکته: مسیر این فایل با مقدار "sysroot" (در صورت تعریف) پیشوند میگیرد، و در صورتی که پیونددهنده با گزینهٔ --prefix=<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" در یک اسکریپت پیونددهنده پیشفرض.
با این حال توجه داشته باشید که در سیستمهای مبتنی بر لینوکس یک نکتهٔ مهم دیگر وجود دارد: اگر گزینهٔ --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 میگوید که هنگام قرار دادن نمادهای عمومی در بخشهای خروجی مناسب، آنها را بر اساس همترازی به ترتیب صعودی یا نزولی مرتب کند. همترازیهای نماد که مد نظر قرار میگیرند عبارتند از شانزده بایتی یا بزرگتر، هشت بایتی، چهار بایتی، دو بایتی، و یک بایتی. این کار برای جلوگیری از ایجاد شکاف بین نمادها به دلیل محدودیتهای همترازی است. اگر ترتیب مرتبسازی مشخص نشود، ترتیب نزولی فرض میشود.
- --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) نباشد. این گزینه هنگام تولید فایلهای بازنشانیپذیر بزرگ جهت بارگیری در برخی هستههای بلادرنگ با قالب فایل شیء COFF مفید است؛ چرا که COFF نمیتواند بیش از ۶۵۵۳۵ بازنشانی را در یک بخش نمایش دهد. توجه داشته باشید که این ویژگی با قالبهای فایل شیئی که از بخشهای دلخواه پشتیبانی نمیکنند کار نخواهد کرد. پیونددهنده بخشهای ورودی تکی را برای توزیع مجدد تقسیم نمیکند، بنابراین اگر یک بخش ورودی منفرد شامل بیش از count بازنشانی باشد، یک بخش خروجی نیز شامل همان تعداد بازنشانی خواهد بود. مقدار پیشفرض count برابر ۳۲۷۶۸ است.
- --stats[=filename]
- محاسبه و
نمایش آمار
درباره
عملکرد
پیونددهنده،
مانند زمان
اجرا و
میزان مصرف
حافظه.
اگر آرگومان اختیاری filename ارائه نشود، تنها اطلاعات پایهای گزارش شده و به جریان خروجی خطای استاندارد ارسال میشود. اگر آرگومان filename مشخص گردد، اطلاعات گسترشیافته در فایل نامبرده نوشته میشود. اگر filename تنها بر روی نماد - تنظیم شده باشد، اطلاعات گسترشیافته به جریان خروجی استاندارد ارسال خواهد شد. اگر نام فایل با + آغاز شود، فایل به جای حالت بازنویسی، در حالت الحاق (append) باز میشود.
اگر گزینه -Map فعال شده باشد، این اطلاعات در فایل نگاشت (map) نیز ثبت میگردد. نکته: اگر به هر دو گزینه --stats و -Map آرگومانهای filename داده شده باشد و مقدار آنها یکسان باشد، اطلاعات تنها یک بار نوشته خواهد شد نه دو بار.
اگر متغیر محیطی "LD_STATS" تعریف شده باشد، رفتاری مشابه گزینه --stats خواهد داشت. اگر مقدار متغیر یک رشته باشد، به عنوان نام فایلی که اطلاعات باید در آن ثبت شود استفاده میگردد. در غیر این صورت اطلاعات به جریان خروجی استاندارد فرستاده میشود. استفاده از این متغیر محیطی امکان ثبت آمار را بدون نیاز به تغییر خط فرمان پیونددهنده فراهم میکند. نکته: در صورت استفاده همزمان از متغیر محیطی و گزینه --stats، گزینه --stats اولویت دارد.
اطلاعات گسترشیافته گزارششده شامل زمان cpu مصرفی است و اگر فراخوانی سیستمی کتابخانه getrusage() در دسترس باشد، میزان مصرف حافظه نیز ثبت میشود. این اطلاعات برای بخشهای مختلف فرایند پیوند که به عنوان فازها (phases) شناخته میشوند گزارش میگردد. علاوه بر این، اطلاعات برای یک فاز ویژه به نام ALL که کل فرایند پیوند را پوشش میدهد نیز گزارش میشود. توجه داشته باشید که ممکن است فازهای تکی شامل یکدیگر بوده یا همپوشانی داشته باشند، بنابراین نباید فرض کرد که مجموع منابع مصرفشده توسط پیونددهنده برابر با جمع منابع استفادهشده در فازهای مجزا است.
همچنین هنگام گزارش اطلاعات گسترشیافته، نسخه پیونددهنده، آرگومانهای خط فرمان و زمان شروع به کار پیونددهنده نیز گنجانده میشوند. این امر مدیریت شرایطی را که در آن فراخوانیهای پیوند چندگانه توسط یک سیستم ساخت اجرا میشوند تسهیل کرده و امکان شناسایی دقیق آرگومانهای مسبب تولید آمار گزارششده را فراهم میسازد.
خروجی گسترشیافته چیزی شبیه به این خواهد بود:
Stats: linker version: (GNU Binutils) 2.44.50.20250401 Stats: linker started: Wed Apr 2 09:36:41 2025 Stats: args: ld -z norelro -z nomemory-seal -z no-separate-code -o a.out [...] Stats: phase cpu time memory user time system time Stats: name (microsec) (KiB) (seconds) (seconds) Stats: ALL 390082 217740 0 0 Stats: ctf processing 12 0 0 0 Stats: string merge 1324 0 0 0 Stats: parsing 349 288 0 0 Stats: plugins 1 0 0 0 Stats: processing files 259616 214524 0 0 Stats: write 116493 0 0 0
- --no-stats
- گزارش آمار مصرف را، در صورتی که از طریق گزینه خط فرمان --stats یا متغیر محیطی LD_STATS فعال شده باشد، غیرفعال میکند.
- --sysroot=directory
- استفاده از directory به عنوان محل sysroot، که مقدار پیشفرض زمان پیکربندی را بازنویسی میکند. این گزینه تنها توسط پیونددهندههایی پشتیبانی میشود که با --with-sysroot پیکربندی شده باشند.
- --task-link
- این گزینه توسط هدفهای مبتنی بر COFF/PE برای ایجاد یک فایل شیء task-linked استفاده میشود که در آن تمام نمادهای سراسری به ایستا تبدیل شدهاند.
- --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 برای هدفی که در آن دادههای فقطخواندنی در سگمنت اختصاصی خود و مجزا از متن اجرایی قرار دارند، نشانی نخستین بایت از سگمنت دادههای فقطخواندنی را تنظیم میکند.
- -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
- هشدار
هنگام
ترکیب یک
نماد مشترک
(common symbol) با یک
نماد مشترک
دیگر یا با
تعریف یک
نماد.
پیونددهندههای
Unix این عمل تا
حدی نادقیق
را مجاز
میدانند،
اما
پیونددهندهها
در برخی
سیستمعاملهای
دیگر اجازه
چنین کاری
را
نمیدهند.
این گزینه
به شما
اجازه
میدهد تا
مشکلات
بالقوه
ناشی از
ادغام
نمادهای
سراسری را
شناسایی
کنید.
متأسفانه
برخی از
کتابخانههای
C از این روش
استفاده
میکنند،
بنابراین
ممکن است
هشدارهایی
درباره
نمادهای
موجود در
کتابخانهها
و همچنین
برنامههای
خود دریافت
کنید.
سه نوع نماد سراسری وجود دارد که در اینجا با مثالهای C نشان داده شدهاند:
- int i = 1;
- یک تعریف (definition)، که در بخش دادههای مقداردهیشده در فایل خروجی قرار میگیرد.
- extern int i;
- یک ارجاع تعریفنشده (undefined reference)، که فضایی تخصیص نمیدهد. باید در جایی تعریفی یا نماد مشترکی برای این متغیر وجود داشته باشد.
- int i;
- یک نماد مشترک (common symbol). اگر تنها (یک یا چند) نماد مشترک برای یک متغیر وجود داشته باشد، به ناحیه دادههای مقداردهینشده در فایل خروجی میرود. پیونددهنده چندین نماد مشترک برای یک متغیر را در یک نماد واحد ادغام میکند. اگر اندازه آنها متفاوت باشد، بزرگترین اندازه را انتخاب میکند. در صورتی که تعریفی از همان متغیر وجود داشته باشد، پیونددهنده یک نماد مشترک را به یک اعلان تبدیل میکند.
گزینهٔ --warn-common میتواند پنج نوع هشدار تولید کند. هر هشدار شامل یک جفت خط است: خط نخست نمادی را که به تازگی با آن مواجه شده توصیف میکند و خط دوم نماد قبلی مشاهدهشده با همان نام را شرح میدهد. یک یا هر دو نماد از نوع نماد مشترک خواهند بود.
- 1.
- تبدیل یک
نماد مشترک
به یک
ارجاع،
زیرا پیش از
این تعریفی
برای آن
نماد وجود
داشته است.
<file>(<section>): warning: common of `<symbol>' overridden by definition <file>(<section>): warning: defined here
- 2.
- تبدیل یک
نماد مشترک
به یک
ارجاع،
زیرا پس از
آن تعریفی
برای نماد
مشاهده شده
است. این
مورد
همانند
حالت پیشین
است، به جز
اینکه
نمادها با
ترتیبی
متفاوت
شناسایی
شدهاند.
<file>(<section>): warning: definition of `<symbol>' overriding common <file>(<section>): warning: common is here
- 3.
- ادغام یک
نماد مشترک
با یک نماد
مشترک
هماندازهٔ
قبلی.
<file>(<section>): warning: multiple common of `<symbol>' <file>(<section>): warning: previous common is here
- 4.
- ادغام یک
نماد مشترک
با یک نماد
مشترک
بزرگتر
قبلی.
<file>(<section>): warning: common of `<symbol>' overridden by larger common <file>(<section>): warning: larger common is here
- 5.
- ادغام یک
نماد مشترک
با یک نماد
مشترک
کوچکتر
قبلی. این
مورد مشابه
حالت قبلی
است، به جز
اینکه
نمادها با
ترتیبی
متفاوت
شناسایی
شدهاند.
<file>(<section>): warning: common of `<symbol>' overriding smaller common <file>(<section>): warning: smaller common is here
- --warn-constructors
- هشدار در صورت استفاده از سازندههای سراسری (global constructors). این گزینه فقط برای تعداد محدودی از قالبهای فایل شیء (object file) کاربرد دارد. برای قالبهایی مانند COFF یا ELF، پیونددهنده قادر به تشخیص استفاده از سازندههای سراسری نیست.
- --warn-execstack
- --warn-execstack-objects
- --no-warn-execstack
- در بسترهای ELF، در صورتی که از پیونددهنده درخواست شود فایل خروجی شامل پشتهٔ قابل اجرا (executable stack) ایجاد کند، ممکن است پیامهای هشدار صادر نماید. سه حالت ممکن وجود دارد:
- 1.
- هیچ هشداری تولید نشود.
- 2.
- همیشه هشدار تولید شود، حتی اگر پشتهٔ قابل اجرا از طریق گزینه خط فرمان -z execstack درخواست شده باشد.
- 3.
- تنها زمانی هشدار تولید شود که یک فایل شیء درخواست پشتهٔ قابل اجرا داشته باشد، اما در صورت استفاده از گزینهٔ -z execstack هشداری صادر نشود.
حالت پیشفرض به نحوهٔ پیکربندی پیونددهنده هنگام ساخت آن بستگی دارد. گزینهٔ --no-warn-execstack همیشه پیونددهنده را در حالت بدون هشدار قرار میدهد. گزینهٔ --warn-execstack پیونددهنده را در حالت هشدار همیشگی قرار میدهد. گزینهٔ --warn-execstack-objects پیونددهنده را در حالت هشدار تنها برای فایلهای شیء قرار میدهد.
نکته: فایلهای ورودی در قالب ELF میتوانند با داشتن بخش .note.GNU-stack که بیت قابلیت اجرا در پرچمهای آن تنظیم شده است، مشخص کنند که به پشتهٔ قابل اجرا نیاز دارند. همچنین میتوانند با داشتن همان بخش بدون تنظیم بودن بیت پرچم قابلیت اجرا، مشخص کنند که نیازی به پشتهٔ قابل اجرا ندارند. اگر یک فایل ورودی فاقد بخش .note.GNU-stack باشد، رفتار پیشفرض وابسته به معماری مقصد (target) خواهد بود. برای برخی از مقاصد، نبود چنین بخشی به معنای ضرورت داشتن پشتهٔ قابل اجرا است. این موضوع اغلب مشکلی برای فایلهای اسمبلی دستنویس به شمار میرود.
- --error-execstack
- --no-error-execstack
- اگر قرار
باشد
پیونددهنده
یک پیام
هشدار در
رابطه با
پشتهٔ قابل
اجرا تولید
کند،
گزینهٔ --error-execstack
به جای آن،
هشدار را
تبدیل به یک
خطا خواهد
کرد. توجه -
این گزینه
حالت تولید
هشدار execstack
پیونددهنده
را تغییر
نمیدهد.
برای تنظیم
یک حالت
هشدار
مشخص، از
--warn-execstack یا --warn-execstack-objects
استفاده
کنید.
گزینهٔ --no-error-execstack رفتار پیشفرض برای صدور پیامهای هشدار را بازیابی میکند.
- --warn-multiple-gp
- هشدار در صورتی که به چندین مقدار اشارهگر سراسری (global pointer) در فایل خروجی نیاز باشد. این مورد تنها برای پردازندههای خاصی مانند Alpha معنادار است. به طور ویژه، برخی پردازندهها ثابتهای بزرگمقدار را در یک بخش اختصاصی قرار میدهند. یک ثبات خاص (اشارهگر سراسری) به میانهٔ این بخش اشاره میکند تا بتوان ثابتها را به طور بهینه از طریق حالت آدرسدهی نسبی به ثباتپایه بارگذاری کرد. از آنجا که آفست در حالت نسبی به ثباتپایه ثابت و نسبتاً کوچک است (برای مثال ۱۶ بیت)، حداکثر اندازهٔ مخزن ثابتها محدود میشود. بنابراین، در برنامههای بزرگ غالباً لازم است چندین مقدار اشارهگر سراسری استفاده شود تا بتوان تمام ثابتهای ممکن را آدرسدهی کرد. این گزینه باعث صدور هشدار در صورت بروز چنین حالتی میشود.
- --warn-once
- برای هر نماد تعریفنشده تنها یک بار هشدار داده شود، نه به ازای هر ماژولی که به آن ارجاع میدهد..IP --warn-rwx-segments 4
- --no-warn-rwx-segments
- هشدار
میدهد اگر
پیونددهنده
یک قطعه (segment)
بارگذاریپذیر
و با اندازه
غیرصفر
ایجاد کند
که هر سه
پرچم
دسترسی
خواندن (read)،
نوشتن (write) و
اجرا (execute)
برای آن
تنظیم شده
باشد. چنین
قطعهای
نشاندهنده
یک
آسیبپذیری
امنیتی
بالقوه است.
علاوه بر
این، اگر یک
قطعه
ذخیرهسازی
محلی رشته (TLS)
با پرچم
دسترسی
اجرا ایجاد
شود،
صرفنظر از
اینکه
پرچمهای
خواندن و/یا
نوشتن برای
آن تنظیم
شده باشند
یا خیر،
هشدارهایی
تولید
خواهد شد.
این هشدارها بهطور پیشفرض فعال هستند. آنها را میتوان از طریق گزینهٔ --no-warn-rwx-segments غیرفعال و از طریق گزینهٔ --warn-rwx-segments دوباره فعال کرد.
- --error-rwx-segments
- --no-error-rwx-segments
- اگر قرار
باشد
پیونددهنده
پیامی
هشداری
درباره یک
قطعه
قابلاجرا
و
قابلنوشتن
یا یک قطعه TLS
قابلاجرا
تولید کند،
گزینهٔ
--error-rwx-segments این
هشدار را به
یک خطا
تبدیل
میکند.
گزینهٔ
--no-error-rwx-segments رفتار
پیشفرض
مبنی بر
صرفاً
تولید یک
پیام هشدار
را
بازمیگرداند.
توجه - گزینهٔ --error-rwx-segments بهخودیخود هشدارهای مربوط به این قطعهها را فعال نمیکند. این هشدارها یا بهطور پیشفرض فعال هستند (در صورتی که پیونددهنده به این شکل پیکربندی شده باشد) یا از طریق گزینهٔ خط فرمان --warn-rwx-segments فعال میشوند.
- --warn-section-align
- هشدار میدهد اگر نشانی یک بخش خروجی به دلیل ترازسازی (alignment) تغییر کند. معمولاً ترازسازی توسط یک بخش ورودی تعیین میشود. نشانی تنها در صورتی تغییر خواهد کرد که بهطور صریح مشخص نشده باشد؛ یعنی اگر دستور "SECTIONS" نشانی آغازی برای آن بخش مشخص نکرده باشد.
- --warn-textrel
- هشدار میدهد اگر پیونددهنده DT_TEXTREL را به یک فایل اجرایی مستقل از موقعیت (position-independent) یا شیء اشتراکی (shared object) بیفزاید.
- --warn-alternate-em
- هشدار میدهد اگر یک شیء دارای کد ماشین جایگزین ELF باشد.
- --warn-unresolved-symbols
- اگر پیونددهنده بخواهد یک نماد حلنشده را گزارش کند (گزینهٔ --unresolved-symbols را ببینید)، بهطور معمول یک خطا تولید میکند. این گزینه باعث میشود که بهجای آن یک هشدار تولید کند.
- --error-unresolved-symbols
- این گزینه رفتار پیشفرض پیونددهنده مبنی بر تولید خطا هنگام گزارش نمادهای حلنشده را بازمیگرداند.
- --whole-archive
- به ازای هر
آرشیو
ذکرشده در
خط فرمان پس
از گزینهٔ
--whole-archive، تمام
فایلهای
شیء درون
آرشیو را در
پیونددهی
میگنجاند،
بهجای
اینکه
آرشیو را
برای
فایلهای
شیء مورد
نیاز جستجو
کند. این
گزینه
معمولاً
برای تبدیل
یک فایل
آرشیو به یک
کتابخانه
اشتراکی
استفاده
میشود و
گنجاندن
همه شیءها
را در
کتابخانه
اشتراکی
حاصل
اجباری
میسازد.
این گزینه
ممکن است
بیش از یک
بار
استفاده
شود.
دو نکته هنگام استفاده از این گزینه از طریق gcc: نخست، gcc این گزینه را مستقیماً نمیشناسد، بنابراین باید از -Wl,-whole-archive استفاده کنید. دوم، فراموش نکنید که پس از فهرست آرشیوهای خود از -Wl,-no-whole-archive استفاده کنید، زیرا gcc فهرست آرشیوهای خودش را نیز به پیوند شما اضافه خواهد کرد و ممکن است نخواهید این پرچم روی آنها نیز اثر بگذارد.
- --wrap=symbol
- استفاده از
یک تابع
پوشاننده (wrapper)
برای symbol.
هرگونه
ارجاع
تعریفنشده
به symbol به
"__wrap_symbol"
حل خواهد
شد. هرگونه
ارجاع
تعریفنشده
به
"__real_symbol"
به symbol حل
خواهد شد.
این سازوکار میتواند برای فراهم کردن یک تابع پوشاننده برای یک تابع سیستمی استفاده شود. تابع پوشاننده باید "__wrap_symbol" نامیده شود. اگر بخواهد تابع سیستمی را فراخوانی کند، باید "__real_symbol" را صدا بزند.
در اینجا یک مثال ساده آورده شده است:
void * __wrap_malloc (size_t c) { printf ("malloc called with %zu\n", c); return __real_malloc (c); }اگر کدهای دیگر را با استفاده از --wrap malloc با این فایل پیوند دهید، تمام فراخوانیها به "malloc" بهجای آن تابع "__wrap_malloc" را فراخوانی میکنند. فراخوانی به "__real_malloc" در "__wrap_malloc"، تابع واقعی "malloc" را فراخوانی خواهد کرد.
همچنین ممکن است بخواهید یک تابع "__real_malloc" نیز فراهم کنید تا پیونددهیها بدون گزینهٔ --wrap نیز با موفقیت انجام شوند. اگر چنین کنید، نباید تعریف "__real_malloc" را در همان فایلی قرار دهید که "__wrap_malloc" در آن قرار دارد؛ چرا که ممکن است اسمبلر پیش از آنکه پیونددهنده فرصتی برای پوشاندن آن به "malloc" داشته باشد، این فراخوانی را حل کند.
پیونددهنده تنها ارجاعهای تعریفنشده را جایگزین میکند. بنابراین، ارجاعهای داخلیِ واحد ترجمه (translation unit) به symbol به "__wrap_symbol" حل نمیشوند. در مثال بعدی، فراخوانی به "f" در "g" به "__wrap_f" حل نمیشود.
int f (void) { return 123; } int g (void) { return f(); } - --eh-frame-hdr
- --no-eh-frame-hdr
- درخواست ایجاد (--eh-frame-hdr) یا جلوگیری از ایجاد (--no-eh-frame-hdr) بخش ".eh_frame_hdr" و سرایند قطعه ELF از نوع "PT_GNU_EH_FRAME".
- --no-ld-generated-unwind-info
- درخواست ایجاد اطلاعات unwind بخش ".eh_frame" برای بخشهای کد تولیدشده توسط پیونددهنده مانند PLT. در صورتی که اطلاعات unwind تولیدشده توسط پیونددهنده پشتیبانی شود، این گزینه بهطور پیشفرض فعال است. این گزینه همچنین تولید اطلاعات ردگیری پشته بخش ".sframe" را برای بخشهای کد تولیدشده توسط پیونددهنده مانند PLT کنترل میکند.
- --enable-new-dtags
- --disable-new-dtags
- این پیونددهنده میتواند برچسبهای پویای جدید را در ELF ایجاد کند؛ اما سامانههای قدیمیتر ELF ممکن است آنها را درک نکنند. اگر --enable-new-dtags را مشخص کنید، برچسبهای پویای جدید بر حسب نیاز ایجاد شده و برچسبهای پویای قدیمیتر نادیده گرفته میشوند. اگر --disable-new-dtags را تعیین کنید، هیچ برچسب پویای جدیدی ایجاد نخواهد شد. بهطور پیشفرض، برچسبهای پویای جدید ایجاد نمیشوند. توجه داشته باشید که این گزینهها تنها برای سامانههای ELF در دسترس هستند.
- --hash-size=number
- تنظیم اندازه پیشفرض جدولهای درهمسازی پیونددهنده روی یک عدد اول نزدیک به number. افزایش این مقدار میتواند مدت زمان لازم برای انجام کارهای پیونددهنده را کاهش دهد، اما به بهای افزایش نیازمندیهای حافظه پیونددهنده تمام میشود. به همین ترتیب، کاهش این مقدار میتواند نیازمندیهای حافظه را به بهای کاهش سرعت کم کند.
- --hash-style=style
- تعیین نوع جدول(های) درهمسازی پیونددهنده. style میتواند شامل "sysv" برای بخش کلاسیک ELF یعنی ".hash"، "gnu" برای بخش سبک جدید گنو یعنی ".gnu.hash"، یا "both" برای هر دو جدول درهمسازی کلاسیک ELF ".hash" و سبک جدید گنو ".gnu.hash" باشد. مقدار پیشفرض به نحوه پیکربندی پیونددهنده بستگی دارد، اما برای بیشتر سامانههای مبتنی بر لینوکس "both" خواهد بود.
- --compress-debug-sections=none
- --compress-debug-sections=zlib
- --compress-debug-sections=zlib-gnu
- --compress-debug-sections=zlib-gabi
- --compress-debug-sections=zstd
- در بسترهای
ELF، این
گزینهها
نحوه
فشردهسازی
بخشهای
اشکالزدایی
DWARF را با
استفاده از
zlib کنترل
میکنند.
گزینهٔ --compress-debug-sections=none بخشهای اشکالزدایی DWARF را فشرده نمیکند. گزینهٔ --compress-debug-sections=zlib-gnu بخشهای اشکالزدایی DWARF را فشرده کرده و نام آنها را تغییر میدهد تا بهجای .debug با .zdebug آغاز شوند. گزینهٔ --compress-debug-sections=zlib-gabi نیز بخشهای اشکالزدایی DWARF را فشرده میکند، اما بهجای تغییر نام آنها، پرچم SHF_COMPRESSED را در سرایند بخشها تنظیم میکند.
گزینهٔ --compress-debug-sections=zlib یک نام مستعار برای --compress-debug-sections=zlib-gabi است.
گزینهٔ --compress-debug-sections=zstd بخشهای اشکالزدایی DWARF را با استفاده از zstd فشرده میکند.
توجه داشته باشید که این گزینه بر هرگونه فشردهسازی در بخشهای اشکالزدایی ورودی اولویت دارد و آن را بازنویسی میکند؛ بنابراین برای مثال اگر یک باینری با --compress-debug-sections=none پیوند داده شود، هرگونه بخش اشکالزدایی فشرده در فایلهای ورودی، پیش از کپی شدن در باینری خروجی از حالت فشرده خارج خواهد شد.
رفتار پیشفرض فشردهسازی بسته به مقصد مورد نظر و گزینههای پیکربندیِ بهکاررفته برای ساخت زنجیره ابزار متفاوت است. مقدار پیشفرض را میتوان با بررسی خروجی گزینهٔ --help پیونددهنده تعیین کرد..IP --reduce-memory-overheads 4 این گزینه نیازمندیهای حافظه در زمان اجرای ld را به بهای کاهش سرعت پیوند، کاهش میدهد. این گزینه برای انتخاب الگوریتم قدیمی O(n^2) جهت تولید فایل نگاشت پیوند (link map) به جای الگوریتم جدید O(n) معرفی شده است که حدود ۴۰٪ حافظه بیشتری برای ذخیره نمادها مصرف میکند.
اثر دیگر این سوئیچ، تنظیم اندازه پیشفرض جدول درهمسازی (hash table) به 1021 است که باز هم با طولانیتر کردن زمان اجرای پیونددهنده، در مصرف حافظه صرفهجویی میکند. با این حال اگر از سوئیچ --hash-size استفاده شده باشد، این کار انجام نمیشود.
سوئیچ --reduce-memory-overheads ممکن است در نسخههای آینده پیونددهنده برای فعالسازی موازنههای دیگر نیز به کار گرفته شود.
- --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
بر روی
بخشهای
هنجارین
محتویات
خروجی
باشد؛ یا
"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) تفاوت دارد، یک «پیوند مبهم» (fuzzy linking) انجام داده و آن نماد را با پیوند به مورد منطبق حلوفصل کند. برای نمونه، نماد تعریفنشده "_foo" ممکن است به تابع "_foo@12" پیوند داده شود، یا نماد تعریفنشده "_bar@16" ممکن است به تابع "_bar" پیوند بخورد. هنگامی که پیونددهنده این کار را انجام میدهد، یک هشدار چاپ میکند، زیرا معمولاً این پیوند باید با شکست مواجه میشد، اما گاهی اوقات کتابخانههای وارداتی (import libraries) تولیدشده از dllهای متفرقه برای قابل استفاده بودن به این ویژگی نیاز دارند. اگر --enable-stdcall-fixup را مشخص کنید، این ویژگی بهطور کامل فعال میشود و هشداری چاپ نخواهد شد. اگر --disable-stdcall-fixup را مشخص کنید، این ویژگی غیرفعال شده و چنین عدم تطابقهایی به عنوان خطا در نظر گرفته میشوند. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --leading-underscore
- --no-leading-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
- تعداد بایتهای حافظه را برای رزرو (و در صورت تمایل اختصاص) جهت استفاده به عنوان 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" نامگذاری شود) میتوان برای ایجاد یک کتابخانهٔ واردات با استفاده از "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 بدون وجود کتابخانه واردات، فایل "<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 منتشرشده توسط Microsoft مطابقت ندارد.
نکته - استفاده از افزونهٔ 'auto-import' همچنین باعث میشود دادههای فقطخواندنی که معمولاً در بخش .rdata قرار میگرفتند، در بخش .data قرار داده شوند. این امر برای دور زدن مشکلی با constها است که در اینجا توضیح داده شده است: http://www.cygwin.com/ml/cygwin/2004-09/msg01101.html
استفاده از 'auto-import' بهطور کلی «بدون مشکل کار میکند» -- اما گاهی اوقات ممکن است این پیام را ببینید:
"variable '<var>' can't be auto-imported. Please read the documentation for ld's "--enable-auto-import" for details."
این پیام زمانی رخ میدهد که یک (زیر)عبارت به آدرسی دسترسی پیدا کند که در نهایت توسط حاصلجمع دو مقدار ثابت تعیین میشود (جدولهای واردات Win32 فقط یک مقدار را مجاز میدانند). مواردی که این وضعیت ممکن است رخ دهد شامل دسترسی به فیلدهای عضو متغیرهای struct واردشده از یک DLL، و همچنین استفاده از یک اندیس ثابت در یک متغیر آرایهای واردشده از یک DLL است. هر متغیر چندکلمهای (آرایهها، structها، long long و غیره) ممکن است باعث این وضعیت خطا شود. با این حال، صرفنظر از نوع دقیق دادهٔ متغیر برونریزیشدهٔ خاطی، ld همیشه آن را شناسایی کرده، هشدار صادر میکند و خارج میشود.
چندین راه برای حل این مشکل، صرفنظر از نوع دادهٔ متغیر برونریزیشده وجود دارد:
یک راه، استفاده از سوییچ --enable-runtime-pseudo-reloc است. این کار وظیفهٔ تنظیم ارجاعات در کد کلاینت شما را به محیط زمان اجرا واگذار میکند، بنابراین این روش تنها زمانی کار میکند که محیط زمان اجرا از این ویژگی پشتیبانی کند.
راهکار دوم این است که یکی از «ثابتها» را مجبور به متغیر بودن کنید -- یعنی در زمان کامپایل ناشناخته و غیرقابل بهینهسازی باشد. برای آرایهها، دو احتمال وجود دارد: الف) آدرس آرایه (مورد اندیسگذاری شده) را به متغیر تبدیل کنید، یا ب) اندیس «ثابت» را به متغیر تبدیل کنید. بنابراین:
extern type extern_array[]; extern_array[1] --> { volatile type *t=extern_array; t[1] }یا
extern type extern_array[]; extern_array[1] --> { volatile int t=1; extern_array[t] }برای structها (و بیشتر انواع دادههای چندکلمهای دیگر) تنها گزینه این است که خود struct (یا long long یا ...) را به متغیر تبدیل کنید:
extern struct s extern_struct; extern_struct.field --> { volatile struct s *t=&extern_struct; t->field }یا
extern long long extern_ll; extern_ll --> { volatile long long * local_ll=&extern_ll; *local_ll }روش سوم برای مواجهه با این مشکل، رها کردن 'auto-import' برای نماد خاطی و علامتگذاری آن با "__declspec(dllimport)" است. با این حال، در عمل این کار نیازمند استفاده از #defineهای زمان کامپایل است تا مشخص شود آیا در حال ساخت یک DLL هستید، یا ساخت کد کلاینتی که به DLL پیوند خواهد خورد، یا صرفاً ساخت/پیوند به یک کتابخانهٔ ایستا. هنگام انتخاب میان روشهای گوناگون برای حل مشکل «آدرس مستقیم با آفست ثابت»، باید کاربردهای معمول در دنیای واقعی را در نظر بگیرید:
حالت اولیه:
--foo.h extern int arr[]; --foo.c #include "foo.h" void main(int argc, char **argv){ printf("%d\n",arr[1]); }راهکار ۱: --foo.h extern int arr[]; --foo.c #include "foo.h" void main(int argc, char **argv){ /* This workaround is for win32 and cygwin; do not "optimize" */ volatile int *parr = arr; printf("%d\n",parr[1]); }
راهحل ۲:
--foo.h /* Note: auto-export is assumed (no __declspec(dllexport)) */ #if (defined(_WIN32) || defined(__CYGWIN__)) && \ !(defined(FOO_BUILD_DLL) || defined(FOO_STATIC)) #define FOO_IMPORT __declspec(dllimport) #else #define FOO_IMPORT #endif extern FOO_IMPORT int arr[]; --foo.c #include "foo.h" void main(int argc, char **argv){ printf("%d\n",arr[1]); }چهارمین راه برای اجتناب از این مشکل، بازنویسی کد کتابخانهتان است تا به جای رابط دادهای، از یک رابط تابعی برای متغیرهای مربوطه استفاده کند (برای مثال توابع دسترسیدهنده set_foo() و get_foo()).
- --disable-auto-import
- برای وارد کردن دادهها (DATA imports) از DLLها، تلاشی برای پیوند دادن پیچیده "_symbol" به "__imp__symbol" انجام نده. [این گزینه ویژه پورت پیونددهنده با هدف i386 PE است]
- --enable-runtime-pseudo-reloc
- اگر کد شما حاوی عبارات توصیفشده در بخش --enable-auto-import باشد، یعنی وارد کردن DATA از DLL با آفست غیرصفر، این سوئیچ برداری از «شبهبازمکانیابیهای زمان اجرا» ('runtime pseudo relocations') ایجاد میکند که میتواند توسط محیط زمان اجرا برای تنظیم ارجاعات به چنین دادههایی در کد کلاینت شما مورد استفاده قرار گیرد. [این گزینه ویژه پورت پیونددهنده با هدف i386 PE است]
- --disable-runtime-pseudo-reloc
- برای وارد کردنهای DATA با آفست غیرصفر از DLLها، شبهبازمکانیابی ایجاد نکن. [این گزینه ویژه پورت پیونددهنده با هدف i386 PE است]
- --enable-extra-pe-debug
- نمایش اطلاعات اشکالزدایی بیشتر مربوط به thunking نمادهای auto-import. [این گزینه ویژه پورت پیونددهنده با هدف i386 PE است]
- --section-alignment
- تراز بخش (section alignment) را تنظیم میکند. بخشها در حافظه همواره از نشانیهایی آغاز خواهند شد که مضربی از این عدد هستند. پیشفرض 0x1000 است. [این گزینه ویژه پورت پیونددهنده با هدف i386 PE است]
- --stack reserve
- --stack reserve,commit
- تعداد بایتهای حافظه را برای رزرو کردن (و اختیاری ثبت کردن [commit]) جهت استفاده به عنوان پشته (stack) برای این برنامه مشخص میکند. مقدار پیشفرض 2MB رزروشده و 4K ثبتشده است. [این گزینه ویژه پورت پیونددهنده با هدف 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) تغییر مکان داده شود (relocate شود). این ویژگی با MS Windows Vista برای اهداف i386 PE معرفی شد. این گزینه به طور پیشفرض برای اهداف MinGW فعال است اما میتواند از طریق گزینه --disable-dynamicbase غیرفعال شود. این گزینه همچنین متضمن --enable-reloc-section است.
- --forceinteg
- --disable-forceinteg
- بررسیهای یکپارچگی کد اجباری میشوند. این گزینه به طور پیشفرض غیرفعال است.
- --nxcompat
- --disable-nxcompat
- ایمیج با ویژگی جلوگیری از اجرای دادهها (Data Execution Prevention یا DEP) سازگار است. این قابلیت با MS Windows XP SP2 برای اهداف i386 PE معرفی شد. این گزینه به طور پیشفرض برای اهداف MinGW فعال است.
- --no-isolation
- --disable-no-isolation
- اگرچه ایمیج مفهوم جداسازی (isolation) را درک میکند، اما ایمیج را ایزوله نکن. این گزینه به طور پیشفرض غیرفعال است.
- --no-seh
- --disable-no-seh
- ایمیج از SEH استفاده نمیکند. هیچ گرداننده SE نباید از این ایمیج فراخوانی شود. این گزینه به طور پیشفرض غیرفعال است.
- --no-bind
- --disable-no-bind
- این ایمیج را مقید (bind) نکن. این گزینه به طور پیشفرض غیرفعال است.
- --wdmdriver
- --disable-wdmdriver
- درایور از مدل درایور مایکروسافت ویندوز (MS Windows Driver Model) استفاده میکند. این گزینه به طور پیشفرض غیرفعال است.
- --tsaware
- --disable-tsaware
- ایمیج از ترمینال سرور (Terminal Server) آگاه است. این گزینه به طور پیشفرض غیرفعال است.
- --insert-timestamp
- --no-insert-timestamp
- یک برچسب
زمانی (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 استفاده میکند. هر کتابخانهٔ مشترک در سیستم باید یک نمایهٔ یکتا داشته باشد؛ تمام فایلهای اجرایی از نمایهٔ 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) در صورت نیاز برای گسترش دامنهٔ انشعابها فعال میکند. این گزینه معمولاً لازم نیست زیرا C-SKY از دستورالعملهای branch و call که میتوانند به کل محدودهٔ حافظه دسترسی داشته باشند پشتیبانی میکند و بهینهسازی انشعاب معمولاً توسط کامپایلر یا اسمبلر مدیریت میشود.
- --stub-group-size=N
- این گزینه امکان کنترل دقیقتر ایجاد استابهای انشعاب توسط پیونددهنده را فراهم میکند. این گزینه حداکثر اندازهٔ گروهی از بخشهای ورودی را که میتواند توسط یک بخش استاب مدیریت شود تعیین میکند. یک مقدار منفی برای N، بخشهای استاب را پس از انشعابهای آنها قرار میدهد، در حالی که یک مقدار مثبت اجازه میدهد بخشهای استاب قبل یا بعد از انشعابها ظاهر شوند. مقادیر 1 یا -1 نشان میدهند که پیونددهنده باید مقادیر پیشفرض مناسب را انتخاب کند.
پیونددهندههای 68HC11 و 68HC12 از گزینههای خاصی برای کنترل نگاشت تعویض بانک حافظه و تولید کد ترامپولین (trampoline) پشتیبانی میکنند.
- --no-trampoline
- این گزینه تولید ترامپولین را غیرفعال میکند. بهطور پیشفرض، برای هر تابع دور (far function) که با استفاده از دستورالعمل "jsr" فراخوانی شود، یک ترامپولین تولید میشود (این حالت زمانی رخ میدهد که یک اشارهگر به یک تابع دور گرفته شود).
- --bank-window name
- این گزینه نام ناحیهٔ حافظه در مشخصات MEMORY را که پنجرهٔ بانک حافظه را توصیف میکند، به پیونددهنده نشان میدهد. تعریف چنین ناحیهای سپس توسط پیونددهنده برای محاسبهٔ صفحهبندی و آدرسها درون پنجرهٔ حافظه استفاده میشود.
گزینههای زیر برای کنترل نحوهٔ مدیریت تولید GOT هنگام پیوند برای اهداف 68K پشتیبانی میشوند.
- --got=type
- این گزینه به پیونددهنده مشخص میکند از کدام طرح تولید GOT استفاده کند. type باید یکی از مقادیر single، negative، multigot یا target باشد. برای اطلاعات بیشتر به مدخل Info برای ld مراجعه کنید.
گزینههای زیر برای کنترل تولید دستورالعملهای microMIPS و بررسیهای بازنشانی انشعاب برای انتقالهای حالت ISA هنگام پیوند برای اهداف MIPS پشتیبانی میشوند.
- --insn32
- --no-insn32
- این گزینهها انتخاب دستورالعملهای microMIPS استفادهشده در کدهای تولیدشده توسط پیونددهنده را کنترل میکنند، مانند کدهای موجود در PLT یا استابهای lazy binding، یا در بهینهسازی انشعاب (relaxation). اگر از --insn32 استفاده شود، پیونددهنده فقط از کدگذاریهای ۳۲ بیتی دستورالعملها استفاده میکند. بهطور پیشفرض یا در صورت استفاده از --no-insn32، تمام کدگذاریهای دستورالعمل استفاده میشوند، از جمله موارد ۱۶ بیتی در صورت امکان.
- --ignore-branch-isa
- --no-ignore-branch-isa
- این گزینهها بررسیهای بازنشانی انشعاب برای انتقالهای نامعتبر حالت ISA را کنترل میکنند. اگر از --ignore-branch-isa استفاده شود، پیونددهنده هرگونه بازنشانی انشعاب را میپذیرد و هر انتقال حالت ISA مورد نیاز در محاسبهٔ بازنشانی نادیده گرفته میشود، به جز مواردی خاص از دستورالعملهای "BAL" که شرایط بهینهسازی را دارند و همزمان با محاسبهٔ بازنشانی مربوطه، به دستورالعملهای معادل "JALX" تبدیل میشوند. بهطور پیشفرض یا در صورت استفاده از --no-ignore-branch-isa، بررسی انجام میشود که سبب میشود از دست رفتن یک انتقال حالت ISA منجر به تولید خطا گردد.
- --compact-branches
- --no-compact-branches
- این گزینهها تولید دستورالعملهای فشرده (compact instructions) توسط پیونددهنده را در مدخلهای PLT برای MIPS R6 کنترل میکنند.
برای هدف pdp11-aout، سه گونه از قالب خروجی را میتوان با گزینههای زیر انتخاب و تولید کرد. گونهٔ پیشفرض برای pdp11-aout گزینهٔ --omagic است، در حالی که برای اهداف دیگر --nmagic پیشفرض است. گزینهٔ --imagic تنها برای هدف pdp11-aout تعریف شده است، در حالی که گزینههای دیگر در اینجا همانطور که برای هدف pdp11-aout اعمال میشوند شرح داده شدهاند.
- -N
- --omagic
- خروجی را در سرایند a.out با مقدار "OMAGIC" (0407) علامتگذاری میکند تا نشان دهد قطعهٔ کد (text segment) نباید در برابر نوشتن محافظتشده و همرسانیشده باشد. از آنجا که هر دو بخش کد و داده خواندنی و نوشتنی هستند، بخش داده بلافاصله و بهصورت پیوسته پس از قطعهٔ کد تخصیص مییابد. این قدیمیترین قالب برای برنامههای اجرایی PDP11 است و از ابتدا تا 2.11BSD در سیستمهای Unix مبتنی بر PDP11 برای ld پیشفرض بوده است.
- -n
- --nmagic
- خروجی را در سرایند a.out با مقدار "NMAGIC" (0410) علامتگذاری میکند تا نشان دهد هنگام اجرای فایل خروجی، بخش کد فقطخواندنی و بین تمام پردازههایی که همان فایل را اجرا میکنند قابل اشتراکگذاری خواهد بود. این کار مستلزم انتقال نواحی داده به اولین مرز صفحهٔ ۸ کیلوبایتی ممکن پس از پایان کد است. این گزینه یک قالب اجرایی خالص ایجاد میکند.
- -z
- --imagic
- خروجی را در سرایند a.out با مقدار "IMAGIC" (0411) علامتگذاری میکند تا نشان دهد هنگام اجرای فایل خروجی، نواحی کد و دادهٔ برنامه با استفاده از ویژگی تفکیک فضای دستورالعمل و داده در واحد مدیریت حافظه (MMU) در مدلهای بزرگتر PDP11، در فضاهای آدرس جداگانه بارگذاری خواهند شد. این کار فضای آدرس در دسترس برنامه را دو برابر میکند. قطعهٔ کد مجدداً خالص، محافظتشده در برابر نوشتن و قابل اشتراکگذاری است. تنها تفاوت در قالب خروجی بین این گزینه و سایر گزینهها، علاوه بر عدد جادویی (magic number)، این است که هر دو بخش کد و داده از مکان 0 شروع میشوند. گزینهٔ -z این قالب را در 2.11BSD انتخاب میکرد. این گزینه یک قالب اجرایی مجزا ایجاد میکند.
- --no-omagic
- معادل با --nmagic برای pdp11-aout..SH "محیط (ENVIRONMENT)" شما میتوانید رفتار ld را با متغیرهای محیطی "GNUTARGET"، "LDEMULATION" و "COLLECT_NO_DEMANGLE" تغییر دهید.
"GNUTARGET" در صورتی که از -b (یا معادل آن --format) استفاده نکنید، قالب شیء فایل ورودی را تعیین میکند. مقدار آن باید یکی از نامهای BFD برای یک قالب ورودی باشد. اگر "GNUTARGET" در محیط وجود نداشته باشد، ld از قالب طبیعی هدف استفاده میکند. اگر "GNUTARGET" روی "default" تنظیم شده باشد، آنگاه BFD تلاش میکند با بررسی فایلهای باینری ورودی، قالب ورودی را شناسایی کند؛ این روش معمولاً موفقیتآمیز است، اما ابهامات بالقوهای وجود دارد، زیرا هیچ روشی برای اطمینان از اینکه عدد جادویی (magic number) استفادهشده برای مشخص کردن قالبهای فایل شیء یکتا باشد، وجود ندارد. با این حال، فرایند پیکربندی BFD در هر سیستم، قالب مرسوم آن سیستم را در ابتدای فهرست جستجو قرار میدهد، بنابراین ابهامات به نفع روش مرسوم برطرف میشوند.
"LDEMULATION" شبیهسازی پیشفرض را در صورتی که از گزینهٔ -m استفاده نکنید، تعیین میکند. این شبیهسازی میتواند بر جنبههای گوناگون رفتار پیونددهنده، بهویژه اسکریپت پیونددهندهٔ پیشفرض، تأثیر بگذارد. میتوانید شبیهسازیهای دردسترس را با گزینههای --verbose یا -V فهرست کنید. اگر گزینهٔ -m استفاده نشود و متغیر محیطی "LDEMULATION" تعریف نشده باشد، شبیهسازی پیشفرض به نحوهٔ پیکربندی پیونددهنده بستگی خواهد داشت.
در حالت عادی، پیشفرض پیونددهنده بر بازگردانی نام نمادها (demangling) است. با این حال، اگر "COLLECT_NO_DEMANGLE" در محیط تنظیم شده باشد، پیشفرض آن عدم بازگردانی نمادها خواهد بود. این متغیر محیطی به روش مشابهی توسط برنامهٔ لفاف پیونددهندهٔ "gcc" استفاده میشود. این مقدار پیشفرض میتواند با گزینههای --demangle و --no-demangle لغو گردد.
اگر گزینهٔ خاص PE/COFF یعنی --insert-timestamp فعال باشد و متغیر محیطی SOURCE_DATE_EPOCH تعریف شده باشد، مقدار برچسب زمانی (timestamp) در این متغیر به جای زمان فعلی در سرآیند COFF درج خواهد شد.
اگر متغیر محیطی "LD_STATS" تعریف شده باشد، اطلاعات استفاده از منابع پیونددهنده ثبت خواهد شد، درست مانند اینکه از گزینهٔ --stats استفاده شده باشد. اگر متغیر "LD_STATS" دارای مقداری رشتهای باشد، این مقدار به عنوان نام فایلی که اطلاعات باید در آن ذخیره شوند استفاده خواهد شد. در غیر این صورت، اطلاعات به جریان خروجی استاندارد ارسال خواهند شد.
همچنین ببینید (SEE ALSO)
ar(1)، nm(1)، objcopy(1)، objdump(1)، readelf(1) و مدخلهای Info برای binutils و ld.
کپیرایت و تکثیر (COPYRIGHT)
کپیرایت (c) 1991-2025 Free Software Foundation, Inc.
اجازهٔ کپی، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نگارش 1.3 یا هر نگارش بعدی منتشرشده توسط بنیاد نرمافزارهای آزاد اعطا میشود؛ بدون بخشهای تغییرناپذیر، بدون متون روی جلد، و بدون متون پشت جلد. نسخهای از این مجوز در بخشی با عنوان «GNU Free Documentation License» گنجانده شده است.
| 2025-11-10 | binutils-2.45.1 |