| LD(1) | GNU Development Tools | LD(1) |
نام (NAME)
ld - پیونددهنده گنو
خلاصه دستور (SYNOPSIS)
ld [options] objfile ...
توضیحات (DESCRIPTION)
ابزار ld چندین فایل شیء (object) و بایگانی (archive) را ترکیب میکند، دادههای آنها را بازنشانی (relocate) نموده و ارجاعات نمادها را متصل میسازد. معمولاً آخرین مرحله در کامپایل یک برنامه، اجرای ld است.
ابزار ld فایلهای Linker Command Language نوشتهشده بر پایهٔ ابرمجموعهای از نحو Link Editor Command Language متعلق به شرکت AT&T's را میپذیرد تا کنترلی صریح و کامل را بر فرایند پیونددهی فراهم کند.
این صفحهٔ راهنما به شرح زبان فرمان نمیپردازد؛ برای جزئیات کامل دربارهٔ زبان فرمان و سایر جنبههای پیونددهنده گنو، مدخل ld را در "info" ببینید.
این نسخه از ld از کتابخانههای همهمنظورهٔ BFD برای کار با فایلهای شیء استفاده میکند. این ویژگی به ld امکان میدهد تا فایلهای شیء را در قالبهای مختلف بسیاری بخواند، ترکیب کند و بنویسد---برای نمونه COFF یا "a.out". قالبهای مختلف میتوانند به یکدیگر پیوند داده شوند تا هر نوع فایل شیء موجودی را تولید کنند.
جدای از انعطافپذیری، پیونددهنده گنو در ارائه اطلاعات تشخیصی و عیبیابی مفیدتر از سایر پیونددهندهها عمل میکند. بسیاری از پیونددهندهها بلافاصله پس از مواجهه با یک خطا اجرا را متوقف میکنند؛ اما هر زمان که ممکن باشد، ld به اجرا ادامه میدهد تا بتوانید خطاهای دیگر را نیز شناسایی کنید (یا در برخی موارد، با وجود خطا یک فایل خروجی دریافت نمایید).
پیونددهنده گنو ld برای پوشش طیف گستردهای از شرایط و داشتن بیشترین سازگاری ممکن با سایر پیونددهندهها طراحی شده است. در نتیجه، گزینههای متعددی برای کنترل رفتار آن در اختیارتان قرار دارد..SH "گزینهها (OPTIONS)" پیونددهنده از انبوهی از گزینههای خط فرمان پشتیبانی میکند، اما در عمل، در هر موقعیت خاص تنها تعداد انگشتشماری از آنها به کار میروند. برای نمونه، یک کاربرد متداول ld، پیوند زدن فایلهای شیء استاندارد یونیکس در یک سیستم یونیکس استاندارد و پشتیبانیشده است. در چنین سیستمی، برای پیوند زدن یک فایل "hello.o":
ld -o <output> /lib/crt0.o hello.o -lc
این دستور به ld میگوید که فایلی به نام output را به عنوان نتیجهٔ پیوند زدن فایل "/lib/crt0.o" با "hello.o" و کتابخانهٔ "libc.a" (که از دایرکتوریهای جستجوی استاندارد دریافت میشود) تولید کند. (بحث پیرامون گزینهٔ -l را در زیر ببینید.)
برخی از گزینههای خط فرمان ld را میتوان در هر کجای خط فرمان مشخص کرد. با این حال، گزینههایی که به فایلها ارجاع دارند، مانند -l یا -T، باعث میشوند که فایل در همان نقطهای که گزینه در خط فرمان ظاهر شده است نسبت به فایلهای شیء و سایر گزینههای فایلی خوانده شود. تکرار گزینههای غیرفایلی با آرگومانهای متفاوت، یا اثری نخواهد داشت یا موارد پیشین آن گزینه را (آنهایی که در سمت چپ خط فرمان هستند) لغو (override) میکند. گزینههایی که مشخص کردن بیش از یکبار آنها معنادار است، در توضیحات زیر قید شدهاند.
آرگومانهای غیرگزینهای، فایلهای شیء یا آرشیوهایی هستند که باید با یکدیگر پیوند داده شوند. آنها میتوانند قبل، بعد یا در میان گزینههای خط فرمان قرار گیرند؛ به استثنای اینکه آرگومان یک فایل شیء نباید بین یک گزینه و آرگومان مربوط به آن قرار بگیرد.
معمولاً پیونددهنده با حداقل یک فایل شیء فراخوانی میشود، اما میتوانید اشکال دیگری از فایلهای ورودی دودویی (binary) را با استفاده از -l، -R و زبان دستورات اسکریپت مشخص کنید. اگر هیچ فایل ورودی دودویی مشخص نشود، پیونددهنده هیچ خروجیای تولید نمیکند و پیام No input files را صادر میکند.
اگر پیونددهنده نتواند قالب یک فایل شیء را تشخیص دهد، فرض میکند که آن یک اسکریپت پیونددهنده است. اسکریپتی که به این روش مشخص شود، اسکریپت پیونددهندهٔ اصلی استفادهشده برای پیوند را تقویت و تکمیل میکند (خواه اسکریپت پیونددهندهٔ پیشفرض باشد یا اسکریپتی که با -T مشخص شده باشد). این قابلیت به پیونددهنده اجازه میدهد با فایلی پیوند برقرار کند که به نظر میرسد یک شیء یا آرشیو است، اما در واقع صرفاً برخی مقادیر نماد را تعریف میکند، یا از "INPUT" یا "GROUP" برای بارگذاری اشیاء دیگر استفاده مینماید. تعیین اسکریپت به این شکل تنها اسکریپت اصلی پیونددهنده را تقویت میکند، به طوری که دستورات اضافی پس از اسکریپت اصلی قرار میگیرند؛ برای جایگزینی کامل اسکریپت پیونددهندهٔ پیشفرض از گزینهٔ -T استفاده کنید، اما به تأثیر دستور "INSERT" نیز توجه داشته باشید.
برای گزینههایی که نام آنها تکحرفی است، آرگومانهای گزینه باید یا بلافاصله و بدون فاصله بعد از حرف گزینه بیایند، یا به عنوان آرگومانهای جداگانهای بلافاصله بعد از گزینهای که به آنها نیاز دارد ارائه شوند.
برای گزینههایی که نام چندحرفی دارند، میتوان قبل از نام گزینه از یک خط تیره یا دو خط تیره استفاده کرد؛ برای نمونه، -trace-symbol و --trace-symbol معادل یکدیگرند. توجه---یک استثنا برای این قاعده وجود دارد. گزینههای چندحرفی که با حرف کوچک 'o' آغاز میشوند، تنها میتوانند با دو خط تیره بیایند. این کار برای کاهش اشتباه با گزینهٔ -o است. بنابراین، برای نمونه -omagic نام فایل خروجی را به magic تنظیم میکند، در حالی که --omagic پرچم NMAGIC را روی خروجی فعال میکند.
آرگومانهای گزینههای چندحرفی باید یا با علامت مساوی از نام گزینه جدا شوند، یا به عنوان آرگومانهای جداگانهای بلافاصله بعد از گزینهای که به آنها نیاز دارد قرار گیرند. برای نمونه، --trace-symbol foo و --trace-symbol=foo معادل یکدیگرند. اختصارهای یکتا از نام گزینههای چندحرفی نیز پذیرفته میشوند.
توجه---اگر پیونددهنده به طور غیرمستقیم و از طریق راهانداز کامپایلر (مانند gcc) فراخوانی میشود، تمام گزینههای خط فرمان پیونددهنده باید با پیشوند -Wl, (یا هر آنچه برای راهانداز کامپایلر خاص مناسب است) مانند زیر مشخص شوند:
gcc -Wl,--start-group foo.o bar.o -Wl,--end-group
این نکته مهم است، زیرا در غیر این صورت ممکن است برنامهٔ راهانداز کامپایلر گزینههای پیونددهنده را بیصدا نادیده بگیرد که به یک پیوند نادرست منجر میشود. همچنین هنگام ارسال گزینههای نیازمند مقدار از طریق راهانداز ممکن است سردرگمی رخ دهد، چرا که استفاده از فاصله بین گزینه و آرگومان به عنوان جداکننده عمل کرده و باعث میشود راهانداز تنها گزینه را به پیونددهنده و آرگومان را به کامپایلر بفرستد. در این حالت، سادهترین کار استفاده از اشکال پیوسته برای هر دو نوع گزینههای تکحرفی و چندحرفی است، مانند:
gcc foo.o bar.o -Wl,-eENTRY -Wl,-Map=a.map
در اینجا جدولی از سوییچهای عمومی خط فرمان که توسط پیونددهندهٔ GNU پذیرفته میشوند آورده شده است:
- @file
- خواندن
گزینههای
خط فرمان از
file.
گزینههای
خواندهشده
به جای
گزینهٔ
اصلی @file درج
میشوند.
اگر file وجود
نداشته
باشد یا
قابل
خواندن
نباشد، با
این گزینه
به صورت
تحتاللفظی
رفتار شده و
حذف نخواهد
شد.
گزینهها در file با نویسههای فاصله از یکدیگر جدا میشوند. یک نویسهٔ فاصله میتواند با قرار دادن کل گزینه در نقلقول تکی یا دوتایی درون یک گزینه گنجانده شود. هر نویسهای (از جمله بکاسلش) را میتوان با افزودن یک بکاسلش به عنوان پیشوند به آن گنجاند. خود 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" حاوی فهرستی از رابطهای حسابرسی (audit interfaces) خواهد بود که با دونقطه (colon) جدا شدهاند. اگر پیونددهنده هنگام جستجو برای کتابخانههای اشتراکی شیئی را با یک مدخل حسابرسی بیابد، یک مدخل متناظر "DT_DEPAUDIT" در فایل خروجی اضافه میکند. این گزینه تنها در بسترهای ELF که از رابط rtld-audit پشتیبانی میکنند معنادار است.
- -b input-format
- --format=input-format
- میتوان ld
را به
گونهای
پیکربندی
کرد که از
بیش از یک
نوع فایل
شیء
پشتیبانی
کند. اگر ld
شما به این
شکل
پیکربندی
شده باشد،
میتوانید
از گزینهٔ
-b برای
مشخص کردن
قالب
دودویی
فایلهای
شیء ورودی
که در خط
فرمان پس از
این گزینه
میآیند
استفاده
کنید. حتی
هنگامی که
ld برای
پشتیبانی
از
قالبهای
شیء
جایگزین
پیکربندی
شده باشد،
معمولاً
نیازی به
مشخص کردن
این گزینه
ندارید،
زیرا ld
باید طوری
پیکربندی
شده باشد که
رایجترین
قالب را در
هر ماشین به
عنوان قالب
ورودی
پیشفرض در
نظر بگیرد.
input-format یک رشته
متنی است که
نام قالب
خاصی را
مشخص
میکند که
توسط
کتابخانههای
BFD پشتیبانی
میشود.
(میتوانید
قالبهای
دودویی
موجود را با
دستور objdump -i
فهرست
کنید.)
ممکن است بخواهید هنگام پیوند زدن فایلهایی با یک قالب دودویی نامعمول از این گزینه استفاده کنید. همچنین میتوانید با قرار دادن -b input-format قبل از هر گروه از فایلهای شیء در یک قالب خاص، قالبها را به صراحت تعویض کنید (هنگام پیوند زدن فایلهای شیء با قالبهای مختلف).
قالب پیشفرض از متغیر محیطی "GNUTARGET" گرفته میشود.
همچنین میتوانید قالب ورودی را از طریق یک اسکریپت با استفاده از دستور "TARGET" تعریف کنید؛
- -c MRI-commandfile
- --mri-script=MRI-commandfile
- برای سازگاری با پیونددهندههای تولیدشده توسط MRI، برنامهٔ ld فایلهای اسکریپت نوشتهشده به یک زبان دستور جایگزین و محدود را میپذیرد که در بخش «MRI Compatible Script Files» در مستندات GNU ld شرح داده شده است. فایلهای اسکریپت MRI را با گزینهٔ -c معرفی کنید؛ برای اجرای اسکریپتهای پیونددهندهای که به زبان اسکریپتنویسی عمومی ld نوشته شدهاند از گزینهٔ -T استفاده نمایید. اگر MRI-cmdfile وجود نداشته باشد، ld آن را در دایرکتوریهایی که با گزینههای -L مشخص شدهاند جستجو میکند.
- -d
- -dc
- -dp
- این سه گزینه معادل یکدیگرند؛ اشکال متعددی برای سازگاری با سایر پیونددهندهها پشتیبانی میشوند. آنها حتی در صورتی که یک فایل خروجی بازمکانیاب (با -r) مشخص شده باشد، فضایی را به نمادهای عمومی اختصاص میدهند. دستور اسکریپت "FORCE_COMMON_ALLOCATION" نیز تأثیر یکسانی دارد.
- --depaudit AUDITLIB
- -P AUDITLIB
- مقدار AUDITLIB را به مدخل "DT_DEPAUDIT" در بخش پویا (dynamic section) اضافه میکند. وجود AUDITLIB بررسی نمیشود، و همچنین از DT_SONAME مشخصشده در کتابخانه استفاده نخواهد کرد. اگر چندین بار مشخص شود، "DT_DEPAUDIT" حاوی فهرستی از رابطهای حسابرسی (audit interfaces) خواهد بود که با دونقطه از هم جدا شدهاند. این گزینه تنها در پلتفرمهای ELF که از رابط rtld-audit پشتیبانی میکنند معنیدار است. گزینهٔ -P برای سازگاری با Solaris ارائه شده است.
- --enable-linker-version
- دستورالعمل
اسکریپت
پیونددهندهٔ
"LINKER_VERSION" را
که در Output Section Data
شرح داده
شده، فعال
میکند. اگر
از این
دستورالعمل
در یک
اسکریپت
پیونددهنده
استفاده
شود و این
گزینه فعال
شده باشد،
رشتهای
حاوی نسخهٔ
پیونددهنده
در نقطهٔ
فعلی درج
خواهد شد.
نکته - مکان قرارگیری این گزینه در خط فرمان پیونددهنده اهمیت دارد. این گزینه تنها بر اسکریپتهای پیونددهندهای تأثیر میگذارد که پس از آن در خط فرمان بیایند، یا در داخل خود پیونددهنده تعبیه شده باشند.
- --disable-linker-version
- دستورالعمل اسکریپت پیونددهندهٔ "LINKER_VERSION" را غیرفعال میکند تا رشتهٔ نسخه درج نشود. این رفتار پیشفرض است.
- --enable-non-contiguous-regions
- این گزینه
از ایجاد
خطا در
صورتی که یک
بخش ورودی
در بخش
خروجی
متناظر جا
نشود،
جلوگیری
میکند.
پیونددهنده
تلاش
میکند بخش
ورودی را به
بخشهای
خروجی
متناظر
بعدی تخصیص
دهد، و تنها
در صورتی
خطا ایجاد
میکند که
هیچ بخش
خروجی به
اندازهٔ
کافی بزرگ
نباشد. این
گزینه
زمانی مفید
است که
چندین
ناحیهٔ
حافظهٔ
غیرپیوسته
در دسترس
باشند و بخش
ورودی
نیازی به
ناحیهٔ
خاصی
نداشته
باشد. ترتیب
ارزیابی
بخشهای
ورودی
تغییری
نمیکند؛
برای نمونه:
MEMORY { MEM1 (rwx) : ORIGIN = 0x1000, LENGTH = 0x14 MEM2 (rwx) : ORIGIN = 0x1000, LENGTH = 0x40 MEM3 (rwx) : ORIGIN = 0x2000, LENGTH = 0x40 } SECTIONS { mem1 : { *(.data.*); } > MEM1 mem2 : { *(.data.*); } > MEM2 mem3 : { *(.data.*); } > MEM3 } with input sections: .data.1: size 8 .data.2: size 0x10 .data.3: size 4 results in .data.1 affected to mem1, and .data.2 and .data.3 affected to mem2, even though .data.3 would fit in mem3.این گزینه با دستورهای INSERT ناسازگار است زیرا نحوهٔ نگاشت بخشهای ورودی به بخشهای خروجی را تغییر میدهد.
- --enable-non-contiguous-regions-warnings
- این گزینه هشدارهایی را فعال میکند که در هنگام نگاشت بخشها، زمانی رخ میدهند که "--enable-non-contiguous-regions" تطابقهای احتمالاً غیرمنتظرهای را مجاز میداند؛ این امر میتواند به جای شکست خوردن به دلیل عدم گنجایش در هیچ ناحیهٔ خروجی، بهطور بالقوه به نادیده گرفته شدن خاموش یک بخش منجر شود.
- -e entry
- --entry=entry
- استفاده از entry به عنوان نماد صریح برای آغاز اجرای برنامه، به جای نقطهٔ ورود پیشفرض. اگر نمادی به نام entry وجود نداشته باشد، پیونددهنده تلاش میکند entry را به عنوان یک عدد تجزیه کرده و از آن به عنوان نشانی ورود استفاده کند (این عدد در مبنای ۱۰ تفسیر خواهد شد؛ میتوانید از 0x در ابتدا برای مبنای ۱۶، یا یک 0 در ابتدا برای مبنای ۸ استفاده کنید). برای i386 PE، مقدار entry همچنین میتواند نام اصلی تابع باشد (در صورت وجود، بدون زیرخط آغازین و/یا @number پایانی stdcall).
- --exclude-libs lib,lib,...
- فهرستی از کتابخانههای آرشیو را مشخص میکند که نمادهای آنها نباید بهطور خودکار صادر (export) شوند. نامهای کتابخانهها میتوانند با ویرگول یا دونقطه از یکدیگر جدا شوند. مشخص کردن "--exclude-libs ALL" نمادهای موجود در تمام کتابخانههای آرشیو را از صدور خودکار مستثنی میکند. این گزینه تنها برای پورتهای مقصد ELF و PE پیونددهنده در دسترس است. برای مقصدهای PE، نمادهایی که بهصراحت در یک فایل .def فهرست شدهاند، صرفنظر از این گزینه، همچنان صادر میشوند. برای پورتهای مقصد ELF، با نمادهای تحت تأثیر این گزینه به عنوان پنهان (hidden) رفتار خواهد شد.
- --exclude-modules-for-implib module,module,...
- فهرستی از فایلهای شیء یا اعضای آرشیو را مشخص میکند که نمادهایشان نباید بهطور خودکار صادر شوند، اما باید بهطور یکپارچه در کتابخانهٔ وارداتی (import library) که در حین پیوند ایجاد میشود کپی گردند. نام پودمانها (ماژولها) میتواند با ویرگول یا دونقطه از هم جدا شود و باید دقیقاً با نام فایلهایی که توسط ld برای باز کردن فایلها استفاده شده مطابقت داشته باشد؛ برای اعضای آرشیو، این صرفاً نام عضو است، اما برای فایلهای شیء، نام فهرستشده باید دقیقاً شامل هر مسیری باشد که برای مشخص کردن فایل ورودی در خط فرمان پیونددهنده استفاده شده است. نمادهایی که بهصراحت در یک فایل .def فهرست شدهاند، صرفنظر از این گزینه، همچنان صادر میشوند. [این گزینه مخصوص پورتهای مقصد PE در پیونددهنده است]
- -E
- --export-dynamic
- --no-export-dynamic
- هنگام
ایجاد یک
فایل
اجرایی با
پیوند
پویا،
استفاده از
گزینهٔ -E
یا گزینهٔ
--export-dynamic باعث
میشود
پیونددهنده
همهٔ
نمادها را
به جدول
نمادهای
پویا اضافه
کند. جدول
نمادهای
پویا،
مجموعهای
از نمادها
است که در
زمان اجرا
از طریق
شیءهای
پویا قابل
مشاهده
هستند.
اگر از هیچیک از این گزینهها استفاده نکنید (یا از گزینهٔ --no-export-dynamic برای بازگرداندن رفتار پیشفرض استفاده کنید)، جدول نمادهای پویا معمولاً تنها شامل آن نمادهایی خواهد بود که توسط شیء پویای ذکرشده در پیوند ارجاع داده شدهاند.
اگر از "dlopen" برای بارگذاری یک شیء پویا استفاده میکنید که به جای یک شیء پویای دیگر، نیاز به ارجاع به نمادهای تعریفشده توسط برنامه دارد، احتمالاً هنگام پیوند دادن خود برنامه باید از این گزینه استفاده کنید.
در صورت پشتیبانی قالب خروجی، همچنین میتوانید از فهرست پویا (dynamic list) برای کنترل اینکه چه نمادهایی باید به جدول نمادهای پویا اضافه شوند، استفاده کنید. توضیحات مربوط به --dynamic-list را ببینید.
توجه داشته باشید که این گزینه مخصوص پورتهای مقصد ELF است. مقصدهای PE از قابلیت مشابهی برای صادر کردن تمام نمادها از یک DLL یا EXE پشتیبانی میکنند؛ توضیحات مربوط به --export-all-symbols را در زیر ببینید.
- --export-dynamic-symbol=glob
- هنگام ایجاد یک فایل اجرایی با پیوند پویا، نمادهای منطبق با glob به جدول نمادهای پویا اضافه خواهند شد. هنگام ایجاد یک کتابخانهٔ اشتراکی، ارجاعات به نمادهای منطبق با glob به تعاریف درون کتابخانهٔ اشتراکی مقید نخواهند شد. این گزینه هنگام ایجاد یک کتابخانهٔ اشتراکی در صورتی که -Bsymbolic یا --dynamic-list مشخص نشده باشند، بیاثر (no-op) است. این گزینه تنها در پلتفرمهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنا دارد.
- --export-dynamic-symbol-list=file
- یک --export-dynamic-symbol را برای هر الگو در فایل مشخص میکند. قالب فایل همانند گره نسخه (version node) بدون حوزه (scope) و نام گره است. برای اطلاعات بیشتر VERSION را ببینید.
- -EB
- پیوند دادن شیءهای با ترتیب بایت بزرگپایان (big-endian). این گزینه بر قالب خروجی پیشفرض تأثیر میگذارد.
- -EL
- پیوند دادن شیءهای با ترتیب بایت کوچکپایان (little-endian). این گزینه بر قالب خروجی پیشفرض تأثیر میگذارد.
- -f name
- --auxiliary=name
- هنگام
ایجاد یک
شیء
اشتراکی ELF،
فیلد داخلی
DT_AUXILIARY را به نام
مشخصشده
تنظیم
میکند. این
به
پیونددهندهٔ
پویا اعلام
میکند که
جدول
نمادهای
شیء
اشتراکی
باید به
عنوان یک
پالایهٔ
کمکی (auxiliary filter)
روی جدول
نمادهای
شیء
اشتراکی name
استفاده
شود.
اگر بعداً برنامهای را با این شیء پالایه پیوند دهید، هنگام اجرای برنامه، پیونددهندهٔ پویا فیلد DT_AUXILIARY را مشاهده خواهد کرد. اگر پیونددهندهٔ پویا هر نمادی را از شیء پالایه حل (resolve) کند، ابتدا بررسی میکند که آیا تعریفی در شیء اشتراکی 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 هنگام ایجاد یک فایل اجرایی یا شیء اشتراکی (shared object) در قالب ELF، با تنظیم DT_FINI روی نشانی تابع، کاری میکند که هنگام تخلیه (unload) شدن فایل اجرایی یا شیء اشتراکی، NAME فراخوانی شود. پیونددهنده بهطور پیشفرض از "_fini" بهعنوان تابع فراخوانی استفاده میکند.
- -g
- نادیده گرفته میشود. صرفاً برای سازگاری با سایر ابزارها ارائه شده است.
- -G value
- --gpsize=value
- حداکثر اندازهٔ اشیایی را که قرار است با استفاده از ثبات GP بهینهسازی شوند، روی value تنظیم میکند. این گزینه فقط برای قالبهای فایل شیئی مانند MIPS ELF که از قرار دادن اشیاء بزرگ و کوچک در بخشهای مختلف پشتیبانی میکنند معنا دارد و برای سایر قالبهای فایل شیء نادیده گرفته میشود.
- -h name
- -soname=name
- هنگام ایجاد یک شیء اشتراکی ELF، فیلد داخلی DT_SONAME را روی نام مشخصشده تنظیم میکند. زمانی که یک فایل اجرایی با یک شیء اشتراکیِ دارای فیلد DT_SONAME پیوند داده میشود، هنگام اجرای فایل اجرایی، پیونددهندهٔ پویا به جای استفاده از نام فایلی که به پیونددهنده داده شده بود، تلاش میکند شیء اشتراکیِ مشخصشده توسط فیلد DT_SONAME را بارگذاری کند.
- -i
- یک پیوند افزایشی (incremental link) انجام میدهد (مشابه گزینهٔ -r).
- -init=name
- هنگام ایجاد یک فایل اجرایی یا شیء اشتراکی ELF، با تنظیم DT_INIT روی نشانی تابع، کاری میکند که هنگام بارگذاری شدن فایل اجرایی یا شیء اشتراکی، NAME فراخوانی شود. پیونددهنده بهطور پیشفرض از "_init" بهعنوان تابع فراخوانی استفاده میکند.
- -l namespec
- --library=namespec
- فایل آرشیو
یا شیء
مشخصشده
توسط namespec را
به فهرست
فایلها
برای پیوند
اضافه
میکند. از
این گزینه
میتوان به
هر تعداد
دلخواه
استفاده
کرد. اگر namespec
به شکل :filename
باشد، ld
مسیر
کتابخانه
را برای
فایلی به
نام filename
جستجو
میکند، در
غیر این
صورت مسیر
کتابخانه
را برای
فایلی به
نام libnamespec.a
جستجو
خواهد کرد.
در سیستمهایی که از کتابخانههای اشتراکی پشتیبانی میکنند، ممکن است ld فایلهایی غیر از libnamespec.a را نیز جستجو کند. بهویژه در سیستمهای ELF و SunOS، ld پیش از جستجوی کتابخانهای به نام libnamespec.a، یک پوشه را برای کتابخانهای به نام libnamespec.so جستجو میکند. (طبق قرارداد، پسوند ".so" نشاندهندهٔ یک کتابخانهٔ اشتراکی است.) توجه داشته باشید که این رفتار در مورد :filename اعمال نمیشود؛ این ساختار همیشه فایلی به نام دقیق filename را مشخص میکند.
پیونددهنده یک آرشیو را تنها یک بار و در همان موقعیتی که در خط فرمان مشخص شده است جستجو میکند. اگر آرشیو نمادی را تعریف کند که در برخی اشیاءِ پیش از آرشیو در خط فرمان تعریفنشده باقی مانده بود، پیونددهنده فایل(های) مناسب را از آرشیو وارد میکند. با این حال، وجود یک نماد تعریفنشده در شیئی که بعداً در خط فرمان ظاهر میشود، باعث نخواهد شد پیونددهنده دوباره آرشیو را جستجو کند.
برای روشی جهت اجبار پیونددهنده به جستجوی مکرر آرشیوها، گزینهٔ -( را ببینید.
میتوانید همان آرشیو را چندین بار در خط فرمان درج کنید.
این نوع جستجوی آرشیو برای پیونددهندههای یونیکس استاندارد است. با این حال، اگر از ld روی AIX استفاده میکنید، توجه داشته باشید که این رفتار با پیونددهندهٔ AIX تفاوت دارد.
- -L searchdir
- --library-path=searchdir
- مسیر searchdir را
به فهرست
مسیرهایی
که ld برای
یافتن
کتابخانههای
آرشیو و
اسکریپتهای
کنترلی ld
جستجو
میکند،
اضافه
میکند.
میتوانید
از این
گزینه به هر
تعداد
دلخواه
استفاده
کنید.
پوشهها به
همان
ترتیبی که
در خط فرمان
مشخص
شدهاند
جستجو
میشوند.
پوشههای
مشخصشده
در خط
فرمان، پیش
از
پوشههای
پیشفرض
جستجو
میشوند.
تمام
گزینههای
-L برای
تمام
گزینههای
-l، صرفنظر
از ترتیبی
که
گزینهها
آمدهاند،
اعمال
میشوند.
گزینههای
-L بر نحوهٔ
جستجوی
اسکریپت
پیوند توسط
ld اثری
ندارند،
مگر اینکه
گزینهٔ -T
مشخص شده
باشد.
اگر searchdir با "=" یا $SYSROOT آغاز شود، این پیشوند با sysroot prefix (پیشوند sysroot) جایگزین میشود، که توسط گزینهٔ --sysroot کنترل میگردد یا هنگام پیکربندی پیونددهنده مشخص شده است.
مجموعه مسیرهای پیشفرضی که جستجو میشوند (بدون اینکه با -L تعیین شده باشند) به حالت شبیهسازی (emulation mode) مورد استفادهٔ 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 patterns)
در نام فایل
اول مجاز
هستند،
بنابراین
--remap-inputs=foo*.o=bar.o هر
فایل ورودی
منطبق بر foo*.o
را به bar.o
تغییر نام
میدهد.
فرم دیگر این گزینه، --remap-inputs-file=filename، اجازه میدهد بازنگاشتها (remappings) از یک فایل خوانده شوند. هر خط در فایل میتواند شامل یک بازنگاشت باشد. خطوط خالی نادیده گرفته میشوند. هر چیزی از نویسهٔ هش (#) تا انتهای خط بهعنوان یادداشت (کامنت) تلقی شده و نادیده گرفته میشود. الگوی نگاشت میتواند با فاصله یا نویسهٔ مساوی (=) از نام فایل جدا شود.
این گزینهها را میتوان چندین بار مشخص کرد. محتوای آنها با یکدیگر تجمیع میشود. بازنگاشتها به همان ترتیبی که در خط فرمان ظاهر میشوند پردازش خواهند شد، و اگر از یک فایل باشند، به همان ترتیبی که در فایل آمدهاند پردازش میشوند. در صورت برقراری یک تطابق، هیچ بررسی دیگری برای آن نام فایل انجام نخواهد شد.
اگر نام فایل جایگزین /dev/null یا صرفاً NUL باشد، آنگاه بازنگاشت عملاً باعث نادیده گرفته شدن فایل ورودی خواهد شد. این روش میتواند شیوهٔ مناسبی برای آزمودن حذف فایلهای ورودی در یک محیط ساخت پیچیده باشد.
توجه داشته باشید که این گزینه وابسته به موقعیت است و فقط بر نام فایلهایی که پس از آن در خط فرمان میآیند تأثیر میگذارد. بنابراین:
ld foo.o --remap-inputs=foo.o=bar.o
هیچ اثری نخواهد داشت، در حالی که:
ld --remap-inputs=foo.o=bar.o foo.o
نام فایل ورودی foo.o را به bar.o تغییر میدهد.
توجه - این گزینهها همچنین بر فایلهایی که توسط گزارههای INPUT در اسکریپتهای پیوند به آنها ارجاع داده شده است اثر میگذارند. اما از آنجا که اسکریپتهای پیوند پس از خوانده شدن کل خط فرمان پردازش میشوند، موقعیت گزینههای بازنگاشت در خط فرمان اهمیتی ندارد.
اگر گزینهٔ verbose فعال باشد، هر نگاشت منطبقی گزارش خواهد شد، هرچند باز هم لازم است گزینهٔ verbose روی خط فرمان پیش از ظاهر شدن نام فایلهای بازنگاشتشده فعال شده باشد.
اگر گزینههای -Map یا --print-map فعال باشند، فهرست بازنگاشت در خروجی نگاشت (map output) گنجانده خواهد شد.
- -M
- --print-map
- یک نگاشت پیوند (link map) را در خروجی استاندارد چاپ میکند. نگاشت پیوند اطلاعاتی در مورد پیوند فراهم میکند، از جمله موارد زیر:
- چگونگی تخصیص نمادهای مشترک.
- تمام اعضای آرشیو گنجاندهشده در پیوند، به همراه ذکر نمادی که باعث وارد شدن آن عضو آرشیو شده است.
- مقدارهای
اختصاصیافته
به نمادها.
نکته - نمادهایی که مقدار آنها توسط عبارتی محاسبه میشود که شامل ارجاع به مقدار قبلی همان نماد است، ممکن است نتیجهی درستی در نقشهی پیوند نمایش ندهند. دلیل این امر آن است که پیونددهنده نتایج میانی را دور انداخته و تنها مقدار نهایی عبارت را نگه میدارد. در چنین شرایطی پیونددهنده مقدار نهایی را داخل قلاب نمایش میدهد. بنابراین برای نمونه، یک اسکریپت پیونددهنده شامل:
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
- چاپ کردن (یا چاپ نکردن) فهرست بخشهای کنار گذاشتهشده و جمعآوریشده به عنوان زباله (garbage collected) در نقشهی پیوند. بهطور پیشفرض فعال است.
- --print-map-locals
- --no-print-map-locals
- چاپ کردن (یا چاپ نکردن) نمادهای محلی در نقشهی پیوند. برای نمادهای محلی، متن (local) قبل از نام آنها چاپ میشود و پس از تمام نمادهای سراسری در یک بخش مشخص فهرست میشوند. نمادهای محلی موقت (بهطور معمول نمادهایی که با .L آغاز میشوند) در خروجی گنجانده نخواهند شد. بهطور پیشفرض غیرفعال است.
- -n
- --nmagic
- غیرفعال کردن همترازی صفحهای (page alignment) بخشها، و غیرفعال کردن پیوند با کتابخانههای مشترک. اگر قالب خروجی از اعداد جادویی سبک Unix پشتیبانی کند، خروجی را با "NMAGIC" علامتگذاری میکند.
- -N
- --omagic
- تنظیم بخشهای text و data به گونهای که قابل خواندن و نوشتن باشند. همچنین، عدم همترازی صفحهای برای قطعهی data و غیرفعال کردن پیوند با کتابخانههای مشترک. اگر قالب خروجی از اعداد جادویی سبک Unix پشتیبانی کند، خروجی را با "OMAGIC" علامتگذاری میکند. نکته: اگرچه بخش text قابل نوشتن برای مقصدهای PE-COFF مجاز است، اما با مشخصات قالبی که توسط Microsoft منتشر شده مطابقت ندارد.
- --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 اثر
میگذارد.
نگارشهای
آیندهی
پیونددهنده
ممکن است
استفادهی
بیشتری از
این گزینه
بکنند.
همچنین در
حال حاضر
تفاوتی در
رفتار
پیونددهنده
برای
مقادیر
مختلف
غیرصفر این
گزینه وجود
ندارد. این
مورد نیز
ممکن است در
نگارشهای
آینده
تغییر کند.
اگر level صفر یا رشتهی fast باشد، آنگاه ld در عوض عملیات اختیاری را نادیده میگیرد که به پیوند سریعتر منجر میشود اما باینریهای کندتر و بزرگتری تولید میکند. در حال حاضر تنها عملیاتی که نادیده گرفته میشود، ادغام بخشهای ادغامپذیر است، اما این موضوع ممکن است در آینده تغییر کند.
اگر level رشتهی default یا صرفاً نویسهی - باشد، رفتار پیشفرض پیونددهنده مبنی بر عدم بهینهسازی و عدم نادیدهگیری عملیات انتخاب میشود.
- -plugin name
- بهکارگیری
یک افزونه
در فرایند
پیوند.
پارامتر name
نام فایل
مطلق
افزونه است.
معمولاً
این
پارامتر
هنگام
استفاده از
بهینهسازی
زمان پیوند
(link time optimization)،
بهطور
خودکار
توسط
کامپایلر
اضافه
میشود،
اما
کاربران در
صورت تمایل
میتوانند
افزونههای
خود را نیز
اضافه کنند.
توجه داشته باشید که محل افزونههای منشأگرفته از کامپایلر با محلی که برنامههای ar، nm و ranlib در آن به جستجوی افزونههای خود میپردازند متفاوت است. برای این که این دستورات بتوانند از یک افزونهی مبتنی بر کامپایلر استفاده کنند، ابتدا باید در دایرکتوری ${libdir}/bfd-plugins کپی شود. تمام افزونههای پیونددهندهی مبتنی بر gcc با نگارشهای قبلی سازگار هستند (backward compatible)، بنابراین کپی کردن جدیدترین آنها کفایت میکند..IP --push-state 4 گزینهٔ --push-state امکان ذخیرهٔ وضعیت فعلی پرچمهایی را فراهم میکند که نحوهٔ مدیریت فایل ورودی را کنترل میکنند، به طوری که میتوان همهٔ آنها را با یک گزینهٔ متناظر --pop-state بازیابی کرد.
گزینههایی که تحت پوشش قرار میگیرند عبارتاند از: -Bdynamic، -Bstatic، -dn، -dy، -call_shared، -non_shared، -static، -N، -n، --whole-archive، --no-whole-archive، --link-mapless، --no-link-mapless، -r، -Ur، --copy-dt-needed-entries، --no-copy-dt-needed-entries، --as-needed، --no-as-needed، و -a.
یکی از کاربردهای هدف این گزینه، مشخصات مربوط به pkg-config است. هنگامی که همراه با گزینهٔ --libs استفاده میشود، تمامی کتابخانههایی که احتمالاً مورد نیاز هستند فهرست شده و ممکن است همواره پیوند داده شوند. بهتر است چیزی شبیه به این بازگردانده شود:
-Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state
- --pop-state
- اثر --push-state را خنثی کرده و مقادیر پیشین پرچمهای کنترلکنندهٔ مدیریت فایل ورودی را بازیابی میکند.
- -q
- --emit-relocs
- بخشها و
محتویات
بازنشانی
(relocation) را در
فایلهای
اجرایی
کاملاً
پیوند
دادهشده
باقی
میگذارد.
ابزارهای
تحلیل و
بهینهسازی
پس از پیوند
ممکن است
برای انجام
اصلاحات
صحیح روی
فایلهای
اجرایی به
این
اطلاعات
نیاز داشته
باشند. این
امر منجر به
بزرگتر
شدن
فایلهای
اجرایی
میشود.
این گزینه در حال حاضر فقط روی پلتفرمهای ELF پشتیبانی میشود.
- --force-dynamic
- فایل خروجی را وادار میکند تا بخشهای پویا (dynamic sections) داشته باشد. این گزینه مخصوص مقصدهای VxWorks است.
- -r
- --relocatable
- تولید
خروجی
بازنشانیپذیر
(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
- تلاش
میکند تا
اطمینان
حاصل شود که
تنها یک
قطعهٔ (segment)
فقطخواندنی
و غیرکدی
ایجاد
میگردد.
تنها زمانی
مفید است که
همراه با
گزینهٔ -z separate-code
استفاده
شود.
باینریهای
حاصل باید
کوچکتر از
زمانی
باشند که -z
separate-code به
تنهایی
استفاده
شود. بدون
این گزینه،
یا اگر --no-rosegment
مشخص شده
باشد،
گزینهٔ -z separate-code
دو قطعهٔ
فقطخواندنی
ایجاد
خواهد کرد،
یکی قبل از
قطعهٔ کد و
یکی بعد از
آن.
نام این گزینهها گمراهکننده است، اما به منظور سازگاری پیونددهنده با پیونددهندههای LLD و GOLD بدین شکل انتخاب شدهاند.
این گزینهها فقط توسط مقصدهای ELF پشتیبانی میشوند.
- -s
- --strip-all
- حذف تمامی اطلاعات نمادها از فایل خروجی.
- -S
- --strip-debug
- حذف اطلاعات نمادهای اشکالزدا (اما نه همهٔ نمادها) از فایل خروجی.
- --strip-discarded
- --no-strip-discarded
- حذف (یا عدم حذف) نمادهای سراسری تعریفشده در بخشهای دور انداختهشده (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، یا در صورت نبود آرگومان اختیاری جانشین (wildcard) SECTION، برای هر بخش ورودی یتیم، یک بخش خروجی جداگانه ایجاد میکند. بخش یتیم بخشی است که بهطور خاص در اسکریپت پیونددهنده نامی از آن برده نشده باشد. میتوانید از این گزینه چندین بار در خط فرمان استفاده کنید؛ این گزینه از ادغام معمول بخشهای ورودی همنام جلوگیری کرده و تخصیص بخشهای خروجی در اسکریپت پیونددهنده را نادیده میگیرد.
- -v
- --version
- -V
- نمایش شمارهٔ نگارش ld. گزینهٔ -V همچنین شبیهسازهای پشتیبانیشده را فهرست میکند. همچنین به توضیحات --enable-linker-version در Options,,Command-line Options مراجعه کنید که میتوان از آن برای درج رشتهٔ نگارش پیونددهنده درون یک فایل دودویی استفاده کرد.
- -x
- --discard-all
- حذف تمامی نمادهای محلی.
- -X
- --discard-locals
- حذف تمامی نمادهای محلی موقت. (این نمادها با پیشوندهای برچسب محلی مختص به سیستم شروع میشوند، معمولاً .L برای سیستمهای ELF یا L برای سیستمهای سنتی a.out.)
- -y symbol
- --trace-symbol=symbol
- چاپ نام هر
فایل پیوند
دادهشدهای
که symbol در آن
ظاهر
میشود. این
گزینه
میتواند
به هر تعداد
دفعه مشخص
شود. در
بسیاری از
سیستمها
درج یک
زیرخط (underscore) در
ابتدای نام
الزامی است.
این گزینه زمانی مفید است که نمادی تعریفنشده در پیوند خود دارید، اما نمیدانید این مرجع از کجا نشأت گرفته است.
- -Y path
- افزودن path به مسیر پیشفرض جستوجوی کتابخانه. این گزینه به منظور سازگاری با Solaris وجود دارد.
- -z keyword
- کلیدواژههای شناختهشده عبارتند از:
- call-nop=prefix-addr
- call-nop=suffix-nop
- call-nop=prefix-byte
- call-nop=suffix-byte
- مشخص کردن لایهٔ فاصلهگذاری (padding) یکبایتی "NOP" هنگام تبدیل فراخوانی غیرمستقیم به یک تابعِ تعریفشده بهصورت محلی (foo) از طریق خانهٔ GOT آن. call-nop=prefix-addr عبارت "0x67 call foo" را تولید میکند. call-nop=suffix-nop عبارت "call foo 0x90" را تولید میکند. call-nop=prefix-byte عبارت "byte call foo" را تولید میکند. call-nop=suffix-byte عبارت "call foo byte" را تولید میکند. پشتیبانیشده در i386 و x86_64.
- cet-report=none
- cet-report=warning
- cet-report=error
- مشخص کردن نحوهٔ گزارشدهی ویژگیهای مفقود GNU_PROPERTY_X86_FEATURE_1_IBT و GNU_PROPERTY_X86_FEATURE_1_SHSTK در بخش ورودی .note.gnu.property. گزینهٔ cet-report=none که مقدار پیشفرض است، باعث میشود پیونددهنده ویژگیهای مفقود در فایلهای ورودی را گزارش نکند. cet-report=warning باعث صدور یک هشدار توسط پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی میشود. cet-report=error باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی خطا صادر کند. توجه داشته باشید که ibt گزارش ویژگی مفقود GNU_PROPERTY_X86_FEATURE_1_IBT را غیرفعال میکند و shstk گزارش ویژگی مفقود GNU_PROPERTY_X86_FEATURE_1_SHSTK را خاموش میسازد. پشتیبانیشده در Linux/i386 و Linux/x86_64.
- combreloc
- nocombreloc
- ترکیب چندین بخش بازنشانی پویا و مرتبسازی آنها به منظور بهبود عملکرد حافظهنهان (cache) جستوجوی نمادهای پویا. در صورت استفاده از nocombreloc این کار انجام نمیشود.
- common
- nocommon
- تولید نمادهای عمومی با نوع STT_COMMON در طول یک پیوند با قابلیت بازنشانی. در صورت استفاده از nocommon از نوع STT_OBJECT استفاده میشود.
- common-page-size=value
- تنظیم پرکاربردترین اندازهٔ صفحه روی value. در صورتی که سیستم از صفحاتی با این اندازه استفاده کند، چیدمان تصویر حافظه به گونهای بهینهسازی میشود که تعداد صفحات حافظه به حداقل برسد..IP defs 4 گزارش ارجاعات نماد حلنشده از فایلهای شیء معمولی. این کار حتی در صورتی که پیونددهنده در حال ایجاد یک کتابخانهٔ اشتراکی غیرنمادین باشد نیز انجام میشود. این گزینه برعکس -z undefs است.
- dynamic-undefined-weak
- nodynamic-undefined-weak
- هنگام ساخت یک شیء پویا، نمادهای ضعیف (weak) تعریفنشده را در صورتی که از یک فایل شیء معمولی به آنها ارجاع داده شده باشد و توسط نمایانی نماد یا نسخهبندی محلی نشده باشند، به صورت پویا درمیآورد. در صورت استفاده از nodynamic-undefined-weak آنها را پویا نمیکند. اگر هیچیک از گزینهها داده نشود، ممکن است هدف به طور پیشفرض یکی از این گزینهها را به کار گیرد، یا گزینش دیگری از نمادهای ضعیف تعریفنشده را پویا سازد. همهٔ اهداف از این گزینهها پشتیبانی نمیکنند.
- execstack
- شیء را به عنوان نیازمند پشتهٔ قابل اجرا علامتگذاری میکند.
- global
- این گزینه تنها هنگام ساخت یک شیء اشتراکی معنا دارد. این گزینه نمادهای تعریفشده توسط این شیء اشتراکی را برای تفکیک نماد در کتابخانههایی که پس از آن بارگذاری میشوند در دسترس قرار میدهد.
- globalaudit
- این گزینه تنها هنگام ساخت یک فایل اجرایی پویا معنا دارد. این گزینه با تنظیم بیت "DF_1_GLOBAUDIT" در برچسب پویای "DT_FLAGS_1"، فایل اجرایی را به عنوان نیازمند حسابرسی سراسری علامتگذاری میکند. حسابرسی سراسری نیازمند آن است که هر کتابخانهٔ حسابرسی که از طریق گزینههای خط فرمان --depaudit یا -P تعریف شده است، برای تمام اشیاء پویای بارگذاریشده توسط برنامه اجرا شود.
- ibtplt
- تولید درایههای PLT با قابلیت فعال ردگیری شاخه غیرمستقیم اینتل (IBT). برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- ibt
- تولید GNU_PROPERTY_X86_FEATURE_1_IBT در بخش .note.gnu.property جهت نشان دادن سازگاری با IBT. این گزینه همچنین مستلزم ibtplt است. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- indirect-extern-access
- noindirect-extern-access
- تولید
GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS در
بخش .note.gnu.property
برای نشان
دادن اینکه
فایل شیء
نیازمند
اشارهگرهای
تابع
قانونی (canonical)
است و
نمیتواند
با
جابهجایی
کپی (copy relocation)
استفاده
شود. این
گزینه
همچنین
مستلزم
noextern-protected-data و nocopyreloc
است. برای i386 و
x86-64 پشتیبانی
میشود.
گزینهٔ noindirect-extern-access شناسهٔ GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS را از بخش .note.gnu.property حذف میکند.
- 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 تولیدشده توسط پیونددهنده که به جای متغیرهای تعریفشده در کتابخانههای اشتراکی به کار میروند. ممکن است منجر به جابهجاییهای متنی پویا شود.
- nodefaultlib
- مشخص میکند که جستجوی بارگذار پویا برای وابستگیهای این شیء باید تمام مسیرهای پیشفرض جستجوی کتابخانه را نادیده بگیرد.
- nodelete
- مشخص میکند که شیء نباید در زمان اجرا تخلیه شود..IP nodlopen 4 مشخص میکند که شیء برای "dlopen" در دسترس نیست.
- nodump
- مشخص میکند که شیء نمیتواند توسط "dldump" دامپ شود.
- noexecstack
- شیء را طوری علامتگذاری میکند که نیازی به پشتهٔ قابلاجرا نداشته باشد.
- noextern-protected-data
- هنگام ساخت یک کتابخانهٔ مشترک، با نمادهای دادهای محافظتشده مانند نمادهای خارجی رفتار نمیکند. این گزینه رفتار پیشفرض پسانهٔ پیونددهنده را لغو میکند. میتوان از آن برای رفع مشکل بازنشانیهای نادرست تولیدشده توسط کامپایلر برای نمادهای دادهای محافظتشده استفاده کرد. بهروزرسانیهای نمادهای دادهای محافظتشده توسط یک پودمان دیگر، برای کتابخانهٔ مشترک حاصل قابل مشاهده نخواهد بود. برای i386 و x86-64 پشتیبانی میشود.
- noreloc-overflow
- بررسی سرریز بازنشانی را غیرفعال میکند. اگر در زمان اجرا هیچ سرریز بازنشانی پویایی رخ ندهد، میتوان از این گزینه برای غیرفعال کردن بررسی سرریز بازنشانی استفاده کرد. برای x86_64 پشتیبانی میشود.
- memory-seal
- nomemory-seal
- به فایل اجرایی یا کتابخانهٔ مشترک دستور میدهد که تمام بخشهای PT_LOAD باید مهروموم شوند تا از دستکاریهای بعدی (مانند تغییر پرچمهای حفاظت، اندازهٔ بخش، یا حذف نگاشت) جلوگیری شود. این یک مقاومسازی امنیتی است که نیازمند پشتیبانی سیستم است. این گزینه GNU_PROPERTY_MEMORY_SEAL را در بخش .note.gnu.property ایجاد میکند.
- now
- هنگام ایجاد یک فایل اجرایی یا کتابخانهٔ مشترک، آن را علامتگذاری میکند تا به پیونددهندهٔ پویا اعلام کند تمام نمادها را هنگام شروع برنامه، یا هنگام بارگذاری کتابخانهٔ مشترک توسط dlopen حلوفصل کند، به جای اینکه حلوفصل فراخوانی تابع را تا زمان اولین فراخوانی تابع به تعویق بیندازد.
- origin
- مشخص میکند که شیء نیازمند مدیریت $ORIGIN در مسیرها است.
- pack-relative-relocs
- nopack-relative-relocs
- بازنشانی نسبی فشرده را در فایل اجرایی مستقل از موقعیت و کتابخانهٔ مشترک تولید میکند. این گزینه ورودیهای "DT_RELR"، "DT_RELRSZ" و "DT_RELRENT" را به بخش پویا اضافه میکند. هنگام ساخت فایل اجرایی وابسته به موقعیت و خروجی با قابلیت بازنشانی، نادیده گرفته میشود. nopack-relative-relocs حالت پیشفرض است که بازنشانی نسبی فشرده را غیرفعال میکند. هنگام پیوند با کتابخانهٔ سی گنو، یک وابستگی نسخهٔ نماد GLIBC_ABI_DT_RELR به کتابخانهٔ سی مشترک به خروجی اضافه میشود. برای 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
- عبارت GNU_PROPERTY_X86_FEATURE_1_SHSTK را در بخش .note.gnu.property برای نشان دادن سازگاری با Intel Shadow Stack تولید میکند. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- stack-size=value
- اندازهٔ پشته را برای یک بخش ELF "PT_GNU_STACK" مشخص میکند. مشخص کردن صفر، هرگونه ایجاد پیشفرض بخش "PT_GNU_STACK" با اندازهٔ غیرصفر را لغو میکند.
- start-stop-gc
- nostart-stop-gc
- هنگامی که --gc-sections فعال باشد، ارجاع از یک بخش نگهداشتهشده به "__start_SECNAME" یا "__stop_SECNAME" باعث میشود تمام بخشهای ورودی با نام "SECNAME" نیز نگهداشته شوند، مشروط بر اینکه "SECNAME" به عنوان یک شناسهٔ C قابل نمایش باشد و "__start_SECNAME" یا "__stop_SECNAME" توسط پیونددهنده ترکیب شده باشد. گزینهٔ -z start-stop-gc این رفتار را غیرفعال میکند و اجازه میدهد بخشها طوری توسط بازیافت حافظه پاکسازی شوند که گویی این نمادهای ترکیبی خاص تعریف نشدهاند. گزینهٔ -z start-stop-gc هیچ تأثیری بر تعریف "__start_SECNAME" یا "__stop_SECNAME" در یک فایل شیء یا اسکریپت پیونددهنده ندارد. چنین تعریفی به ترتیب مانع از ارائهٔ نماد ترکیبی "__start_SECNAME" یا "__stop_SECNAME" توسط پیونددهنده، و در نتیجه مانع از رفتار ویژهٔ بازیافت حافظه برای آن ارجاعات خواهد شد.
- start-stop-visibility=value
- دیداریپذیری نماد ELF را برای نمادهای ترکیبی "__start_SECNAME" و "__stop_SECNAME" مشخص میکند. مقدار value باید دقیقاً یکی از مقادیر default، internal، hidden، یا protected باشد. اگر گزینهٔ -z start-stop-visibility مشخص نشده باشد، برای سازگاری با روالهای گذشته از protected استفاده میشود. با این حال، شدیداً توصیه میشود که در برنامهها و کتابخانههای مشترک جدید از -z start-stop-visibility=hidden استفاده شود تا این نمادها بین اشیاء مشترک صادر نشوند، چرا که معمولاً این کار مطلوب نیست.
- text
- notext
- textoff
- در صورت تنظیم بودن DT_TEXTREL خطایی گزارش میدهد؛ یعنی اگر شیء مستقل از موقعیت یا مشترک دارای بازنشانیهای پویا در بخشهای فقطخواندنی باشد. در صورت استفاده از notext یا textoff خطایی گزارش نمیکند.
- undefs
- ارجاعات حلنشده به نمادها از فایلهای شیء معمولی را گزارش نمیدهد، چه هنگام ایجاد یک فایل اجرایی و چه هنگام ایجاد یک کتابخانهٔ مشترک. این گزینه معکوس -z defs است.
- unique-symbol
- nounique-symbol
- از نامهای تکراری نمادهای محلی در جدول رشتهٔ نمادها جلوگیری میکند. در صورت استفاده از unique-symbol، عبارت "."number"" را به نامهای تکراری نمادهای محلی اضافه میکند. nounique-symbol حالت پیشفرض است.
- x86-64-baseline
- x86-64-v2
- x86-64-v3
- x86-64-v4
- سطح ISA معماری x86-64 مورد نیاز را در بخش .note.gnu.property مشخص میکند. x86-64-baseline عبارت "GNU_PROPERTY_X86_ISA_1_BASELINE" را تولید میکند. x86-64-v2 عبارت "GNU_PROPERTY_X86_ISA_1_V2" را تولید میکند. x86-64-v3 عبارت "GNU_PROPERTY_X86_ISA_1_V3" را تولید میکند. x86-64-v4 عبارت "GNU_PROPERTY_X86_ISA_1_V4" را تولید میکند. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- isa-level-report=none
- isa-level-report=all
- isa-level-report=needed
- isa-level-report=used
- نحوهٔ گزارش سطوح ISA معماری x86-64 را در فایلهای قابل بازنشانی ورودی مشخص میکند. isa-level-report=none که حالت پیشفرض است، باعث میشود پیونددهنده سطوح ISA معماری x86-64 را در فایلهای ورودی گزارش ندهد. isa-level-report=all باعث میشود پیونددهنده سطوح ISA مورد نیاز و استفادهشدهٔ x86-64 را در فایلهای ورودی گزارش دهد. isa-level-report=needed باعث میشود پیونددهنده سطوح ISA مورد نیاز x86-64 را در فایلهای ورودی گزارش دهد. isa-level-report=used باعث میشود پیونددهنده سطوح ISA استفادهشدهٔ x86-64 را در فایلهای ورودی گزارش دهد. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
سایر کلیدواژهها برای سازگاری با Solaris نادیده گرفته میشوند.
- --no-gnu-tls-tag
- در صورت پیوند با glibc، چنانچه پروندههای شیء بازتخصیصپذیر ورودی تابع "___tls_get_addr" را فراخوانی کنند، وابستگی برچسب نسخهٔ "GLIBC_ABI_GNU_TLS" را در برنامهها و کتابخانههای اشتراکی خروجی اضافه میکند. خروجی در زمان اجرا با glibcهایی که برچسب نسخهٔ "GLIBC_ABI_GNU_TLS" را تعریف نکرده باشند، در بارگذاری و اجرا با شکست مواجه خواهد شد. مگر اینکه در زمان ساخت پیونددهنده با گزینهٔ پیکربندی --disable-gnu-tls-tag غیرفعال شده باشد، هنگامی که هیچ گزینهای مشخص نشده باشد، اگر ورودیها دارای فراخوانی "___tls_get_addr" باشند و libc.so برچسب نسخهٔ "GLIBC_ABI_GNU_TLS" را تعریف کند، پیونددهنده وابستگی برچسب نسخهٔ "GLIBC_ABI_GNU_TLS" را اضافه خواهد کرد. در Linux/i386 پشتیبانی میشود.
- --gnu2-tls-tag
- --no-gnu2-tls-tag
- در صورت پیوند با glibc، چنانچه پروندههای شیء بازتخصیصپذیر ورودی دارای بازتخصیص "R_386_TLS_DESC_CALL" یا "R_X86_64_TLSDESC_CALL" باشند، وابستگی برچسب نسخهٔ "GLIBC_ABI_GNU2_TLS" را در برنامهها و کتابخانههای اشتراکی خروجی اضافه میکند. خروجی در زمان اجرا با glibcهایی که برچسب نسخهٔ "GLIBC_ABI_GNU2_TLS" را تعریف نکرده باشند، در بارگذاری و اجرا با شکست مواجه خواهد شد. مگر اینکه در زمان ساخت پیونددهنده با گزینهٔ پیکربندی --disable-gnu2-tls-tag غیرفعال شده باشد، هنگامی که هیچ گزینهای مشخص نشده باشد، اگر ورودیها دارای بازتخصیص "R_386_TLS_DESC_CALL" یا "R_X86_64_TLSDESC_CALL" باشند و libc.so برچسب نسخهٔ "GLIBC_ABI_GNU2_TLS" را تعریف کند، پیونددهنده وابستگی برچسب نسخهٔ "GLIBC_ABI_GNU2_TLS" را اضافه خواهد کرد. در Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- -( archives -)
- --start-group archives --end-group
- آرگومان archives
باید
فهرستی از
پروندههای
بایگانی
باشد.
اینها
میتوانند
نامهای
صریح
پروندهها
یا
گزینههای
-l باشند.
بایگانیهای مشخصشده بهطور مکرر جستجو میشوند تا زمانی که هیچ ارجاع تعریفنشدهٔ جدیدی ایجاد نشود. بهطور معمول، یک بایگانی تنها یکبار و به همان ترتیبی که در خط فرمان مشخص شده است، جستجو میشود. اگر به نمادی در آن بایگانی برای حل کردن ارجاع نماد تعریفنشدهای نیاز باشد که شیئی در بایگانی پس از آن در خط فرمان بدان ارجاع داده است، پیونددهنده قادر به حل کردن آن ارجاع نخواهد بود. با گروهبندی بایگانیها، همهٔ آنها بهطور مکرر جستجو میشوند تا زمانی که تمام ارجاعات ممکن برطرف شوند.
استفاده از این گزینه درون یک جفتگزینهٔ --start-lib/--end-lib مجاز نیست.
استفاده از این گزینه هزینهٔ کارایی چشمگیری دارد. بهتر است تنها در مواقعی استفاده شود که ارجاعات حلقویِ اجتنابناپذیری میان دو یا چند بایگانی وجود دارد.
- --start-lib objects --end-lib
- آرگومان objects
باید
فهرستی از
پروندههای
شیء باشد.
با اشیاء مشخصشده بهگونهای برخورد میشود که گویی اعضای یک بایگانی هستند که نام آن در محل --start-lib در خط فرمان قرار گرفته است. تمام ویژگیهای معمول پیونددهنده در کار با بایگانیها و گزینههای خط فرمان برای چنین بایگانی ساختگیای اعمال میشوند.
این گزینه میتواند چندین بار استفاده شود، که در این صورت با هر مجموعه از اشیاء مشخصشده بهعنوان یک بایگانی مستقل رفتار خواهد شد. با این حال، تودرتو کردن این گزینه مجاز نیست.
گزینههایی که بر پردازش بایگانی اثر میگذارند، میان --start-lib و --end-lib مجاز نیستند؛ زیرا اعمال آنها در میانهٔ مدیریت یک بایگانی بیمعنا خواهد بود. این گزینهها شامل موارد زیر هستند: -(/--start-group، -)/--end-group، --whole-archive، و --no-whole-archive، و همچنین --pop-state در حالتی که وضعیت تنظیمات --whole-archive را تغییر دهد.
- --accept-unknown-input-arch
- --no-accept-unknown-input-arch
- به پیونددهنده اعلام میکند پروندههای ورودی که معماری آنها قابل شناسایی نیست را بپذیرد. فرض بر این است که کاربر میداند چه میکند و از روی آگاهی قصد دارد این پروندههای ورودی ناشناخته را پیوند دهد. این رفتار پیشفرض پیونددهنده تا قبل از نگارش 2.14 بود. از نگارش 2.14 به بعد، رفتار پیشفرض رد کردن چنین پروندههای ورودیای است؛ بنابراین گزینهٔ --accept-unknown-input-arch برای بازگرداندن رفتار پیشین افزوده شده است.
- --as-needed
- --no-as-needed
- این گزینه
برچسبهای
DT_NEEDED مربوط به ELF
را برای
کتابخانههای
پویایی که
پس از
گزینهٔ --as-needed
در خط فرمان
ذکر
شدهاند،
تحت تأثیر
قرار
میدهد.
بهطور
معمول
پیونددهنده
برای هر
کتابخانهٔ
پویایی که
در خط فرمان
ذکر شده
باشد، بدون
در نظر
گرفتن این
که آیا
کتابخانه
واقعاً
مورد نیاز
است یا خیر،
یک برچسب DT_NEEDED
اضافه
میکند.
گزینهٔ --as-needed
باعث
میشود
برچسب DT_NEEDED
تنها برای
کتابخانهای
صادر شود که
در همان
نقطه از
پیوند،
پاسخگوی یک
ارجاع نماد
تعریفنشدهٔ
غیرضعیف (non-weak)
از سوی یک
پروندهٔ
شیء معمولی
باشد، یا
اگر
کتابخانه
در
فهرستهای
DT_NEEDED سایر
کتابخانههای
مورد نیاز
یافت نشود،
پاسخگوی یک
ارجاع نماد
تعریفنشدهٔ
غیرضعیف از
سوی
کتابخانهٔ
پویای مورد
نیاز دیگری
باشد.
پروندههای
شیء یا
کتابخانههایی
که پس از
کتابخانهٔ
مورد نظر در
خط فرمان
ظاهر
میشوند،
در اینکه
آیا
کتابخانه
مورد نیاز
در نظر
گرفته شود
یا خیر،
اثری
ندارند. این
سازوکار
شبیه به
قوانین
استخراج
پروندههای
شیء از
بایگانیها
است. گزینهٔ
--no-as-needed رفتار
پیشفرض را
بازیابی
میکند.
نکته: در سامانههای مبتنی بر لینوکس، گزینهٔ --as-needed بر رفتار گزینههای --rpath و --rpath-link نیز اثر میگذارد. برای جزئیات بیشتر به توضیحات --rpath-link مراجعه کنید.
- --add-needed
- --no-add-needed
- این دو گزینه به دلیل شباهت نامهایشان با گزینههای --as-needed و --no-as-needed منسوخ شدهاند. آنها با گزینههای --copy-dt-needed-entries و --no-copy-dt-needed-entries جایگزین شدهاند.
- -assert keyword
- این گزینه به منظور سازگاری با SunOS نادیده گرفته میشود.
- -Bdynamic
- -dy
- پیوند با کتابخانههای پویا. این گزینه تنها در بسترهایی که کتابخانههای اشتراکی پشتیبانی میشوند معنا دارد. این گزینه معمولاً در چنین بسترهایی پیشفرض است. انواع نگارشهای مختلف این گزینه برای سازگاری با سامانههای گوناگون است. میتوانید از این گزینه چندین بار در خط فرمان استفاده کنید: این گزینه بر جستجوی کتابخانه برای گزینههای -l پس از خود اثر میگذارد.
- -Bgroup
- پرچم "DF_1_GROUP" را در مدخل "DT_FLAGS_1" در بخش پویا تنظیم میکند. این کار باعث میشود پیونددهندهٔ زمان اجرا (runtime linker) جستجوها را در این شیء و وابستگیهای آن تنها درون گروه انجام دهد. گزینهٔ --unresolved-symbols=report-all بهطور ضمنی اعمال میشود. این گزینه تنها در بسترهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنا دارد.
- -Bstatic
- -dn
- -static
- با کتابخانههای اشتراکی پیوند نزن. این گزینه تنها در بسترهایی که کتابخانههای اشتراکی پشتیبانی میشوند معنا دارد. انواع نگارشهای مختلف این گزینه برای سازگاری با سامانههای گوناگون است. میتوانید از این گزینه چندین بار در خط فرمان استفاده کنید: این گزینه بر جستجوی کتابخانه برای گزینههای -l پس از خود اثر میگذارد. این گزینه همچنین بهطور ضمنی شامل --unresolved-symbols=report-all میشود. این گزینه میتواند همراه با -shared استفاده شود. انجام چنین کاری بدین معناست که یک کتابخانهٔ اشتراکی در حال ایجاد است اما تمام ارجاعات بیرونی آن کتابخانه باید با کشیدن مدخلها از کتابخانههای ایستا برطرف شوند.
- -Bsymbolic
- هنگام ایجاد یک کتابخانهٔ اشتراکی، ارجاعات به نمادهای سراسری را به تعاریف موجود در همان کتابخانهٔ اشتراکی (در صورت وجود) متصل (bind) میکند. بهطور معمول، این امکان برای برنامهای که با یک کتابخانهٔ اشتراکی پیوند خورده است وجود دارد که تعاریف موجود در آن کتابخانهٔ اشتراکی را بازنویسی کند. این گزینه تنها در بسترهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنا دارد.
- -Bsymbolic-functions
- هنگام ایجاد یک کتابخانهٔ اشتراکی، ارجاعات به نمادهای توابع سراسری را به تعاریف درون خود کتابخانهٔ اشتراکی (در صورت وجود) متصل میکند. این گزینه تنها در بسترهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنا دارد..IP -Bno-symbolic 4 این گزینه میتواند گزینههای مشخصشده پیشین -Bsymbolic و -Bsymbolic-functions را لغو کند.
- --dynamic-list=dynamic-list-file
- نام یک فایل
فهرست پویا
را به
پیونددهنده
مشخص
میکند. این
گزینه
معمولاً
هنگام ساخت
کتابخانههای
اشتراکی
برای تعیین
فهرستی از
نمادهای
سراسری که
ارجاعات به
آنها
نباید به
تعاریف
درون
کتابخانه
اشتراکی
مقید شوند،
یا هنگام
ساخت
فایلهای
اجرایی
پیوندیافته
به صورت
پویا برای
تعیین
فهرستی از
نمادها که
باید به
جدول
نمادها در
فایل
اجرایی
اضافه شوند
به کار
میرود. این
گزینه تنها
در
بسترهای ELF
که از
کتابخانههای
اشتراکی
پشتیبانی
میکنند
معنا دارد.
قالب فهرست پویا همانند گره نسخه (version node) بدون دامنه (scope) و نام گره است. برای اطلاعات بیشتر VERSION را ببینید.
- --dynamic-list-data
- شامل کردن تمام نمادهای دادهٔ سراسری در فهرست پویا.
- --dynamic-list-cpp-new
- ارائه فهرست پویای توکار برای عملگرهای new و delete در C++. این گزینه عمدتاً برای ساخت libstdc++ اشتراکی مفید است.
- --dynamic-list-cpp-typeinfo
- ارائه فهرست پویای توکار برای شناسایی نوع زمان اجرای C++ (یا RTTI).
- --check-sections
- --no-check-sections
- از پیونددهنده میخواهد پس از تخصیص نشانیهای بخشها، آنها را برای بررسی وجود هرگونه همپوشانی بررسی نکند. بهطور معمول پیونددهنده این بررسی را انجام میدهد و در صورت یافتن هرگونه همپوشانی، پیامهای خطای مناسب تولید میکند. پیونددهنده بخشهای درون همپوشانها (overlays) را میشناسد و آنها را مجاز میشمارد. رفتار پیشفرض را میتوان با استفاده از سوییچ خط فرمان --check-sections بازگرداند. همپوشانی بخشها معمولاً برای پیوندهای بازمکانپذیر بررسی نمیشود. در این حالت میتوانید با استفاده از گزینهٔ --check-sections بررسی را اجباری کنید.
- --copy-dt-needed-entries
- --no-copy-dt-needed-entries
- این گزینه
بر نحوهٔ
برخورد با
کتابخانههای
پویایی که
توسط
برچسبهای
DT_NEEDED درون
کتابخانههای
پویای ELF
ذکرشده در
خط فرمان به
آنها
ارجاع شده
است، تأثیر
میگذارد.
بهطور
معمول
پیونددهنده
برای هر
کتابخانهای
که در یک
برچسب DT_NEEDED
درون یک
کتابخانه
پویای
ورودی ذکر
شده است،
برچسب DT_NEEDED به
باینری
خروجی
اضافه
نمیکند. با
این حال با
تعیین --copy-dt-needed-entries
در خط
فرمان،
کتابخانههای
پویایی که
پس از آن
میآیند
ورودیهای
DT_NEEDED آنها
اضافه
خواهد شد.
رفتار
پیشفرض را
میتوان با
--no-copy-dt-needed-entries
بازگرداند.
این گزینه همچنین بر تحلیل و حل نمادها در کتابخانههای پویا تأثیر دارد. با --copy-dt-needed-entries، کتابخانههای پویای ذکرشده در خط فرمان با دنبال کردن برچسبهای DT_NEEDED آنها به کتابخانههای دیگر، بهطور بازگشتی جستجو میشوند تا نمادهای مورد نیاز باینری خروجی حل شوند. با این حال در حالت پیشفرض، جستجوی کتابخانههای پویایی که پس از آن میآیند در خود کتابخانه پویا متوقف میشود. هیچ پیوند DT_NEEDED برای حل نمادها پیمایش نخواهد شد.
- --cref
- خروجی دادن
یک جدول
ارجاع
متقابل (cross reference table).
اگر یک فایل
نقشهبرداری
(map file)
پیونددهنده
در حال
تولید
باشد، جدول
ارجاع
متقابل
درون فایل
نقشه چاپ
میشود. در
غیر این
صورت، روی
خروجی
استاندارد
چاپ خواهد
شد.
قالب این جدول عمداً ساده است تا در صورت لزوم بتوان آن را بهسادگی توسط یک اسکریپت پردازش کرد. نمادها بهصورت مرتبشده بر اساس نام چاپ میشوند. برای هر نماد، فهرستی از نامهای فایل ارائه میشود. اگر نماد تعریف شده باشد، اولین فایل فهرستشده محل تعریف است. اگر نماد بهعنوان یک مقدار عام (common) تعریف شده باشد، فایلهایی که این حالت در آنها رخ داده در ادامه میآیند. در نهایت، تمام فایلهایی که به نماد ارجاع دادهاند فهرست میشوند.
- --ctf-variables
- --no-ctf-variables
- قالب اطلاعات اشکالزدایی CTF از بخشی پشتیبانی میکند که نامها و انواع متغیرهای یافتشده در برنامه را که در هیچ جدول نمادی ظاهر نمیشوند کدگذاری میکند. این متغیرها آشکارا توسط اشکالزداهای سنتی از طریق نشانی قابل جستجو نیستند، بنابراین فضای استفادهشده برای انواع و نامهای آنها معمولاً هدر میرود: نوعها معمولاً کوچک هستند اما نامها اغلب چنین نیستند. گزینهٔ --ctf-variables باعث ایجاد چنین بخشی میشود. رفتار پیشفرض را میتوان با --no-ctf-variables بازگرداند.
- --ctf-share-types=method
- تنظیم روش مورداستفاده برای به اشتراکگذاری نوعها بین واحدهای ترجمه در CTF.
- قرار دادن تمام نوعهایی که فاقد تعاریف مبهم هستند درون فرهنگ مشترک، جایی که اشکالزداها میتوانند بهراحتی به آنها دسترسی داشته باشند، حتی اگر فقط در یک واحد ترجمه رخ داده باشند. این حالت پیشفرض است.
- تنها نوعهایی را که در چندین واحد ترجمه رخ دادهاند درون فرهنگ مشترک قرار میدهد: نوعهایی با تنها یک تعریف به فرهنگهای اختصاصی هر واحد ترجمه میروند. نوعهایی با تعاریف مبهم در چندین واحد ترجمه همواره به فرهنگهای اختصاصی هر واحد ترجمه میروند. این کار معمولاً باعث بزرگتر شدن CTF میشود، اما ممکن است میزان CTF را در فرهنگ مشترک کاهش دهد. برای پروژههای بسیار بزرگ، این کار ممکن است سرعت باز کردن CTF را افزایش داده و در زمان اجرا حافظه را در مصرفکنندهٔ CTF ذخیره کند.
- --no-define-common
- این گزینه
مانع از
تخصیص
نشانی به
نمادهای
عام (common symbols)
میشود.
دستور
اسکریپت
"INHIBIT_COMMON_ALLOCATION"
اثر مشابهی
دارد.
گزینهٔ --no-define-common اجازه میدهد تصمیمگیری برای تخصیص نشانی به نمادهای عام، از انتخاب نوع فایل خروجی تفکیک شود؛ در غیر این صورت یک نوع خروجی غیربازمکانپذیر، تخصیص نشانی به نمادهای عام را اجباری میکند. استفاده از --no-define-common این امکان را فراهم میسازد که نمادهای عامِ ارجاعشده از یک کتابخانه اشتراکی تنها در برنامه اصلی نشانیدهی شوند. این کار فضای تکراریِ استفادهنشده در کتابخانه اشتراکی را حذف میکند، و همچنین از سردرگمی احتمالی بر سر حل شدن به نمونه تکراری نادرست، در شرایطی که چندین ماژول پویا با مسیرهای جستجوی اختصاصی برای حل نماد در زمان اجرا وجود دارند، جلوگیری به عمل میآورد.
- --force-group-allocation
- این گزینه باعث میشود پیونددهنده اعضای گروه بخش (section group) را همانند بخشهای ورودی عادی جایدهی کرده و گروههای بخش را حذف نماید. این رفتار پیشفرض برای یک پیوند نهایی است اما میتوان از این گزینه برای تغییر رفتار یک پیوند بازمکانپذیر (-r) استفاده کرد. دستور اسکریپت "FORCE_GROUP_ALLOCATION" اثر مشابهی دارد.
- --defsym=symbol=expression
- ایجاد یک
نماد
سراسری در
فایل
خروجی،
حاوی نشانی
مطلقی که
توسط expression
مشخص شده
است.
میتوانید
از این
گزینه به
تعداد
دفعات مورد
نیاز برای
تعریف
نمادهای
متعدد در خط
فرمان
استفاده
کنید. شکل
محدودی از
محاسبات
ریاضی برای
expression در این
زمینه
پشتیبانی
میشود:
میتوانید
یک ثابت در
مبنای ۱۶ یا
نام یک نماد
موجود را
وارد کنید،
یا از "+"
و "-"
برای جمع یا
تفریق
ثابتهای
مبنای ۱۶ یا
نمادها
استفاده
نمایید. اگر
به عبارات
پیچیدهتری
نیاز
دارید،
استفاده از
زبان دستور
پیونددهنده
درون یک
اسکریپت را
مد نظر قرار
دهید. نکته:
نباید هیچ
فاصله خالی
(whitespace) بین symbol،
علامت
مساوی ("=") و
expression وجود
داشته باشد.
پیونددهنده آرگومانهای --defsym و -T را به ترتیب پردازش میکند؛ قرار دادن --defsym قبل از -T نماد را پیش از پردازش اسکریپت پیونددهنده از -T تعریف میکند، در حالی که قرار دادن --defsym پس از -T نماد را پس از پردازش اسکریپت پیونددهنده تعریف خواهد کرد. این تفاوت برای عبارتهایی در اسکریپت پیونددهنده که از نمادهای --defsym استفاده میکنند پیامدهایی دارد؛ اینکه کدام ترتیب صحیح است بستگی به هدف شما خواهد داشت.
- --demangle[=style]
- --no-demangle
- این گزینهها نمادرمزگشایی (demangle) نام نمادها را در پیامهای خطا و دیگر خروجیها کنترل میکنند. هنگامی که به پیونددهنده دستور داده میشود رمزگشایی را انجام دهد، تلاش میکند نام نمادها را به شیوهای خوانا ارائه کند: در صورتی که قالب فایل شیء از زیرخطهای (underscore) ابتدایی استفاده کند آنها را حذف میکند، و نامهای نماد درهمپیچیدهٔ (mangled) C++ را به نامهای خوانا برای کاربر تبدیل مینماید. کامپایلرهای مختلف سبکهای درهمپیچی متفاوتی دارند. آرگومان اختیاری سبک رمزگشایی میتواند برای انتخاب یک سبک رمزگشایی مناسب برای کامپایلر شما به کار رود. پیونددهنده بهطور پیشفرض رمزگشایی را انجام میدهد مگر آنکه متغیر محیطی COLLECT_NO_DEMANGLE تنظیم شده باشد. این گزینهها میتوانند برای لغو حالت پیشفرض استفاده شوند.
- -Ifile
- --dynamic-linker=file
- تنظیم نام پیونددهنده پویا. این گزینه تنها هنگام تولید فایلهای اجرایی ELF با پیوند پویا معنا دارد. پیونددهنده پویای پیشفرض معمولاً صحیح است؛ از این گزینه استفاده نکنید مگر اینکه بدانید در حال انجام چه کاری هستید..IP --no-dynamic-linker 4 هنگام تولید یک فایل اجرایی، درخواست استفاده از یک پیونددهندهٔ پویا (dynamic linker) در زمان بارگذاری را حذف میکند. این گزینه تنها برای فایلهای اجرایی ELF که حاوی بازنشانیهای پویا (dynamic relocations) هستند معنادار است، و معمولاً نیازمند کد نقطهٔ ورود است که قادر به پردازش این بازنشانیها باشد.
- --embedded-relocs
- این گزینه شبیه به گزینهٔ --emit-relocs است، با این تفاوت که بازنشانیها در یک بخش (section) مخصوص به معماری مقصد ذخیره میشوند. این گزینه تنها در مقصدهای BFIN، CR16 و M68K پشتیبانی میشود.
- --disable-multiple-abs-defs
- تعریفهای چندگانه برای نمادهای موجود در نام فایلی که با -R یا --just-symbols فراخوانی شده است را مجاز نمیداند.
- --fatal-warnings
- --no-fatal-warnings
- تمام هشدارها را به عنوان خطا در نظر میگیرد. رفتار پیشفرض را میتوان با گزینهٔ --no-fatal-warnings بازیابی کرد.
- -w
- --no-warnings
- هیچ پیام هشدار یا خطایی را نمایش نمیدهد. در صورت فعال بودن --fatal-warnings، این گزینه آن را نادیده گرفته و لغو میکند. از این گزینه میتوان در مواردی استفاده کرد که مشخص است باینری خروجی کار نخواهد کرد، اما همچنان نیاز به ساخت آن وجود دارد.
- --force-exe-suffix
- اطمینان
حاصل
میکند که
فایل خروجی
دارای
پسوند .exe
باشد.
اگر یک فایل خروجی کاملاً پیوندیافته که با موفقیت ساخته شده است پسوند ".exe" یا ".dll" نداشته باشد، این گزینه پیونددهنده را وادار میکند تا فایل خروجی را با همان نام اما با پسوند ".exe" کپی کند. این گزینه هنگام استفاده از makefileهای تغییرنیافتهٔ Unix روی میزبان Microsoft Windows کاربردی است، زیرا برخی از نسخههای Windows یک ایمیج اجرایی را تا زمانی که به پسوند ".exe" ختم نشود اجرا نمیکنند.
- --gc-sections
- --no-gc-sections
- جمعآوری
زباله (garbage collection)
بخشهای
ورودی
استفادهنشده
را فعال
میکند. در
مقصدهایی
که از این
گزینه
پشتیبانی
نمیکنند
نادیده
گرفته
میشود.
رفتار
پیشفرض
(عدم انجام
این
جمعآوری)
را میتوان
با تعیین
--no-gc-sections در خط
فرمان
بازگرداند.
توجه داشته
باشید که
جمعآوری
زباله برای
مقصدهای با
قالب COFF و PE
پشتیبانی
میشود،
اما
پیادهسازی
آن در حال
حاضر
آزمایشی در
نظر گرفته
میشود.
گزینهٔ --gc-sections با بررسی نمادها و بازنشانیها تصمیم میگیرد که کدام بخشهای ورودی استفاده شدهاند. بخشی که حاوی نماد نقطهٔ ورود است و تمام بخشهای حاوی نمادهایی که در خط فرمان تعریفنشده هستند حفظ خواهند شد؛ همچنین بخشهای حاوی نمادهایی که توسط شیءهای پویا ارجاع داده شدهاند نیز نگه داشته میشوند. توجه داشته باشید که هنگام ساخت کتابخانههای اشتراکی، پیونددهنده باید فرض کند هر نماد قابل مشاهدهای مورد ارجاع قرار گرفته است. پس از تعیین این مجموعهٔ اولیه از بخشها، پیونددهنده به صورت بازگشتی هر بخشی را که توسط بازنشانیهای آنها ارجاع داده شده باشد به عنوان استفادهشده علامتگذاری میکند. گزینههای --entry، --undefined و --gc-keep-exported را ببینید.
این گزینه را میتوان هنگام انجام پیوند جزئی (که با گزینهٔ -r فعال میشود) نیز تنظیم کرد. در این حالت ریشهٔ نمادهای نگهداشتهشده باید صریحاً توسط یکی از گزینههای --entry، --undefined، یا --gc-keep-exported، یا با دستور "ENTRY" در اسکریپت پیونددهنده مشخص شود.
به عنوان یک افزونهٔ GNU، بخشهای ورودی ELF که با پرچم "SHF_GNU_RETAIN" علامتگذاری شده باشند، جمعآوری و حذف نخواهند شد.
- --print-gc-sections
- --no-print-gc-sections
- فهرست تمام بخشهای حذفشده توسط فرایند جمعآوری زباله را نمایش میدهد. این فهرست در stderr چاپ میشود. این گزینه تنها در صورتی مؤثر است که جمعآوری زباله از طریق گزینهٔ --gc-sections فعال شده باشد. رفتار پیشفرض (فهرست نکردن بخشهای حذفشده) را میتوان با تعیین --no-print-gc-sections در خط فرمان بازیابی کرد.
- --gc-keep-exported
- هنگامی که --gc-sections فعال باشد، این گزینه از جمعآوری و حذف بخشهای ورودی استفادهنشدهای که حاوی نمادهای سراسری با نمایانیِ (visibility) پیشفرض یا حفاظتشده (protected) هستند جلوگیری میکند. این گزینه برای فایلهای اجرایی در نظر گرفته شده است که در غیر این صورت بخشهای بدون ارجاع آنها صرفنظر از نمایانی بیرونی نمادهای موجود در آنها جمعآوری و حذف میشدند. توجه داشته باشید که این گزینه هنگام پیوند دادن اشیای اشتراکی تأثیری ندارد زیرا از قبل رفتار پیشفرض است. این گزینه تنها برای مقصدهای با قالب ELF پشتیبانی میشود.
- --print-output-format
- نام قالب خروجی پیشفرض را چاپ میکند (که ممکن است تحت تأثیر سایر گزینههای خط فرمان قرار گیرد). این همان رشتهای است که در دستور اسکریپت پیونددهندهٔ "OUTPUT_FORMAT" ظاهر میشود.
- --print-memory-usage
- اندازهٔ
استفادهشده،
اندازهٔ کل
و درصد
استفاده از
ناحیههای
حافظهٔ
ایجادشده
با دستور MEMORY
را چاپ
میکند. این
ویژگی در
مقصدهای
توکار (embedded)
برای
مشاهدهٔ
سریع میزان
حافظهٔ
آزاد مفید
است. قالب
خروجی
دارای یک
سرآیند و یک
خط به ازای
هر ناحیه
است. این
خروجی هم
برای انسان
خواناست و
هم
بهسادگی
توسط
ابزارها
قابل تجزیه
است. در
اینجا
نمونهای
از خروجی
آمده است:
Memory region Used Size Region Size %age Used ROM: 256 KB 1 MB 25.00% RAM: 32 B 2 GB 0.00%نکته: اگر میخواهید از میزان مصرف حافظه توسط خود پیونددهنده مطلع شوید، گزینهٔ --stats این کار را انجام میدهد.
- --help
- خلاصهای از گزینههای خط فرمان را روی خروجی استاندارد چاپ کرده و خارج میشود.
- --target-help
- خلاصهای از تمام گزینههای مختص به مقصد را در خروجی استاندارد چاپ کرده و خارج میشود.
- -Map=mapfile
- یک نگاشت
پیوند (link map) را
در فایل mapfile
چاپ میکند.
توضیحات
گزینهٔ -M
در بالا را
ببینید. اگر
mapfile صرفاً
نویسهٔ
"-"
باشد،
نگاشت در stdout
نوشته
خواهد شد.
تعیین یک دایرکتوری به عنوان mapfile باعث میشود که نگاشت پیونددهنده به صورت یک فایل درون آن دایرکتوری نوشته شود. به طور معمول، نام فایل درون دایرکتوری به عنوان نام پایهٔ (basename) فایل خروجی (output) همراه با پسوند افزودهٔ ".map" محاسبه میشود. با این حال، اگر از نویسهٔ ویژهٔ "%" استفاده شود، این نویسه با مسیر کامل فایل خروجی جایگزین خواهد شد. علاوه بر این، اگر نویسههایی پس از نماد % وجود داشته باشد، دیگر ".map" به انتهای آن اضافه نخواهد شد.
-o foo.exe -Map=bar [Creates ./bar] -o ../dir/foo.exe -Map=bar [Creates ./bar] -o foo.exe -Map=../dir [Creates ../dir/foo.exe.map] -o ../dir2/foo.exe -Map=../dir [Creates ../dir/foo.exe.map] -o foo.exe -Map=% [Creates ./foo.exe.map] -o ../dir/foo.exe -Map=% [Creates ../dir/foo.exe.map] -o foo.exe -Map=%.bar [Creates ./foo.exe.bar] -o ../dir/foo.exe -Map=%.bar [Creates ../dir/foo.exe.bar] -o ../dir2/foo.exe -Map=../dir/% [Creates ../dir/../dir2/foo.exe.map] -o ../dir2/foo.exe -Map=../dir/%.bar [Creates ../dir/../dir2/foo.exe.bar]
تعیین بیش از یک نویسهٔ "%" یک خطا محسوب میشود.
اگر فایل نگاشت از قبل وجود داشته باشد، توسط این عملیات رونویسی خواهد شد.
- --no-keep-memory
- برنامهٔ ld معمولاً با ذخیرهٔ موقت جدولهای نمادِ فایلهای ورودی در حافظه، سرعت را بر میزان مصرف حافظه ترجیح میدهد. این گزینه به ld اعلام میکند که در عوض با بازخوانی جدولهای نماد در صورت نیاز، مصرف حافظه را بهینهسازی کند. این گزینه ممکن است هنگامی که ld در حین پیوند یک فایل اجرایی بزرگ با کمبود حافظه مواجه میشود مورد نیاز باشد.
- --no-undefined
- -z defs
- ارجاعهای
حلنشده به
نمادها از
فایلهای
شیء معمولی
را گزارش
میکند. این
کار حتی اگر
پیونددهنده
در حال
ایجاد یک
کتابخانهٔ
اشتراکی
غیرنمادین
باشد نیز
انجام
میشود.
سوییچ
--[no-]allow-shlib-undefined
رفتار
گزارشدهی
ارجاعهای
حلنشدهٔ
یافتشده
در
کتابخانههای
اشتراکی در
حال پیوند
را کنترل
میکند.
اثرات این گزینه را میتوان با استفاده از "-z undefs" خنثی کرد.
- --allow-multiple-definition
- -z muldefs
- در حالت عادی، هنگامی که یک نماد چندین بار تعریف شود، پیونددهنده یک خطای مهلک گزارش میدهد. این گزینهها اجازهٔ چندین تعریف را میدهند و نخستین تعریف استفاده خواهد شد.
- --allow-shlib-undefined
- --no-allow-shlib-undefined
- نمادهای
تعریفنشده
در
کتابخانههای
اشتراکی را
مجاز یا
غیرمجاز
میکند. این
سوییچ
مشابه --no-undefined
است، با این
تفاوت که
رفتار را
هنگامی
تعیین
میکند که
نمادهای
تعریفنشده
در یک
کتابخانهٔ
اشتراکی
باشند، نه
در یک فایل
شیء معمولی.
این گزینه
بر نحوهٔ
برخورد با
نمادهای
تعریفنشده
در
فایلهای
شیء معمولی
تأثیری
ندارد.
رفتار پیشفرض این است که اگر پیونددهنده برای ایجاد یک فایل اجرایی بهکار رفته باشد، برای هر نماد تعریفنشده که در کتابخانههای اشتراکی به آن ارجاع داده شده خطا گزارش کند، اما اگر پیونددهنده برای ایجاد یک کتابخانهٔ اشتراکی بهکار رفته باشد، آنها را مجاز میداند.
دلایل مجاز دانستن ارجاع به نمادهای تعریفنشده در کتابخانههای اشتراکی مشخصشده در زمان پیوند عبارتند از:
- کتابخانهٔ اشتراکی مشخصشده در زمان پیوند ممکن است همان کتابخانهٔ موجود در زمان بارگذاری نباشد، بنابراین نماد ممکن است در زمان بارگذاری واقعاً قابلحل باشد.
- برخی از
سیستمعاملها
مانند BeOS و HPPA
وجود دارند
که در آنها
نمادهای
تعریفنشده
در
کتابخانههای
اشتراکی
امری عادی
است.
برای مثال هستهٔ BeOS کتابخانههای اشتراکی را در زمان بارگذاری وصله میکند تا مناسبترین تابع را برای معماری جاری انتخاب کند. برای نمونه، این سازوکار برای انتخاب پویای یک تابع مناسب memset بهکار میرود.
- --error-handling-script=scriptname
- اگر این
گزینه مشخص
شود،
پیونددهنده
هرگاه با
خطایی
مواجه شود،
scriptname را
فراخوانی
میکند. با
این حال در
حال حاضر
تنها از دو
نوع خطا
پشتیبانی
میشود:
نمادهای
مفقود و
کتابخانههای
مفقود. دو
آرگومان به
اسکریپت
ارسال
خواهد شد:
کلیدواژهٔ
"undefined-symbol" یا `missing-lib" و
name نماد
تعریفنشده
یا
کتابخانهٔ
مفقود. هدف
این است که
اسکریپت
پیشنهادهایی
به کاربر
ارائه دهد
مبنی بر
اینکه
نماد یا
کتابخانه
ممکن است در
کجا یافت
شود. پس از
پایان کار
اسکریپت،
پیام خطای
معمول
پیونددهنده
نمایش داده
خواهد شد.
در دسترس بودن این گزینه توسط سوییچی در زمان پیکربندی کنترل میشود، بنابراین ممکن است در برخی پیادهسازیهای خاص موجود نباشد.
- --no-undefined-version
- در حالت عادی هنگامی که یک نماد دارای نسخهٔ تعریفنشده باشد، پیونددهنده آن را نادیده میگیرد. این گزینه نمادهای با نسخهٔ تعریفنشده را غیرمجاز میکند و به جای آن یک خطای مهلک صادر خواهد شد.
- --default-symver
- یک نسخهٔ نماد پیشفرض (همان soname) را برای نمادهای صادرشدهٔ بدون نسخه ایجاد کرده و استفاده میکند.
- --default-imported-symver
- یک نسخهٔ نماد پیشفرض (همان soname) را برای نمادهای واردشدهٔ بدون نسخه ایجاد کرده و استفاده میکند.
- --no-warn-mismatch
- در حالت عادی ld اگر تلاش کنید فایلهای ورودی را که بنا به دلایلی با هم ناهمخوان هستند به یکدیگر پیوند دهید، خطا صادر میکند؛ شاید به این دلیل که برای پردازندههای متفاوتی کامپایل شدهاند یا ترتیب بایت متفاوتی دارند. این گزینه به ld میگوید که باید چنین خطاهای احتمالی را بدون اخطار مجاز شمارد. این گزینه فقط باید با احتیاط استفاده شود، در مواردی که اقدام خاصی انجام دادهاید که اطمینان میدهد خطاهای پیونددهنده نابجا هستند.
- --no-warn-search-mismatch
- در حالت عادی، اگر ld در طول جستجوی کتابخانه یک کتابخانهٔ ناسازگار پیدا کند، هشدار میدهد. این گزینه هشدار را بیصدا میکند.
- --no-whole-archive
- اثر گزینهٔ --whole-archive را برای فایلهای آرشیو بعدی خاموش میکند. در داخل جفتگزینهٔ --start-lib/--end-lib مجاز نیست.
- --no-link-mapless
- آرشیوهایی را که فاقد نمایه (index) یا اصطلاحاً نگاشت نماد هستند برای تمامی آرشیوهای بعدی ارجاعشده در خط فرمان رد میکند. اگر با چنین فایلی برخورد شود، یک خطای پیوند رخ میدهد. این رفتار سنتی است.
- --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ها) را فراهم میسازد. این گزینه تنها برای پورتهای مبتنی بر اهداف PE و ELF پیونددهنده در دسترس است.
- -pie
- --pic-executable
- یک فایل اجرایی مستقل از موقعیت ایجاد میکند. این مورد در حال حاضر فقط روی پلتفرمهای ELF پشتیبانی میشود. فایلهای اجرایی مستقل از موقعیت توسط پیونددهندهٔ پویا به آدرس مجازی که سیستمعامل برای آنها انتخاب میکند، بازنشانی میشوند که این آدرس میتواند در هر فراخوانی متفاوت باشد. آنها در سرآیند فایل ELF با ET_DYN علامتگذاری میشوند، اما از چندین جهت با کتابخانههای اشتراکی تفاوت دارند. بهویژه، نمادهای تعریفشده در یک PIE به صورت پیشفرض نمیتوانند توسط شیء دیگری بازنویسی شوند، بر خلاف آنچه در یک کتابخانهٔ اشتراکی امکانپذیر است.
- -no-pie
- یک فایل اجرایی وابسته به موقعیت ایجاد میکند. این حالت پیشفرض است.
- -qmagic
- این گزینه به دلیل سازگاری با Linux نادیده گرفته میشود.
- -Qy
- این گزینه به دلیل سازگاری با SVR4 نادیده گرفته میشود.
- --relax
- --no-relax
- گزینهای
با تأثیرات
وابسته به
ماشین. این
گزینه فقط
روی چند
مقصد
پشتیبانی
میشود.
روی برخی پلتفرمها گزینهٔ --relax بهینهسازیهای سراسری و مختص به مقصد را انجام میدهد که در زمان حل آدرسدهی برنامه توسط پیونددهنده ممکن میشوند؛ مانند سادهسازی حالتهای آدرسدهی، ترکیب و ساخت دستورالعملهای جدید، انتخاب نسخهٔ کوتاهتر دستورالعملهای موجود، و ترکیب مقادیر ثابت.
روی برخی پلتفرمها این بهینهسازیهای سراسریِ زمان پیوند ممکن است خطایابی نمادین فایل اجرایی حاصل را غیرممکن سازد. مشخص شده است که این موضوع در خانوادهٔ پردازندههای Matsushita MN10200 و MN10300 رخ میدهد.
روی پلتفرمهایی که این ویژگی پشتیبانی میشود، گزینهٔ --no-relax آن را غیرفعال خواهد کرد.
روی پلتفرمهایی که این ویژگی پشتیبانی نمیشود، هر دو گزینهٔ --relax و --no-relax پذیرفته میشوند، اما نادیده گرفته خواهند شد.
- --retain-symbols-file=filename
- تنها
نمادهای
فهرستشده
در فایل filename
را نگه
میدارد و
بقیه را دور
میاندازد.
filename صرفاً یک
فایل متنی
ساده است که
در هر خط آن
یک نام نماد
قرار دارد.
این گزینه
بهویژه در
محیطهایی
(مانند VxWorks)
مفید است که
در آنها یک
جدول
نمادهای
سراسری
بزرگ به
تدریج
انباشته
میشود، تا
در حافظهٔ
زمان اجرا
صرفهجویی
شود.
گزینهٔ --retain-symbols-file نمادهای تعریفنشده، یا نمادهای مورد نیاز برای تغییر مکانها را دور نمیاندازد.
شما تنها میتوانید یک بار --retain-symbols-file را در خط فرمان مشخص کنید. این گزینه بر -s و -S تقدم دارد..IP -rpath=dir 4 افزودن یک دایرکتوری به مسیر جستجوی کتابخانهها در زمان اجرا (runtime). این گزینه هنگام پیوند زدن یک فایل اجرایی ELF با اشیاء اشتراکی (shared objects) استفاده میشود. تمام آرگومانهای -rpath به یکدیگر متصل شده و به پیونددهنده زمان اجرا منتقل میشوند که از آنها برای مکانیابی اشیاء اشتراکی در زمان اجرا استفاده میکند.
گزینه -rpath همچنین هنگام مکانیابی اشیاء اشتراکی که مورد نیاز اشیاء اشتراکی مشخصشده بهطور صریح در پیوند هستند به کار میرود؛ به توضیحات گزینه -rpath-link مراجعه کنید. جستجو در -rpath به این روش تنها توسط پیونددهندههای بومی (native) و پیونددهندههای متقاطع (cross linkers) که با گزینه --with-sysroot پیکربندی شدهاند پشتیبانی میشود.
اگر هنگام پیوند دادن یک فایل اجرایی ELF از -rpath استفاده نشود، محتویات متغیر محیطی "LD_RUN_PATH" در صورت تعریف شدن استفاده خواهد شد.
گزینه -rpath ممکن است در SunOS نیز استفاده شود. بهطور پیشفرض در SunOS، پیونددهنده یک مسیر جستجوی زمان اجرا از تمام گزینههای -L ارائهشده تشکیل میدهد. اگر از گزینه -rpath استفاده شود، مسیر جستجوی زمان اجرا منحصراً با استفاده از گزینههای -rpath تشکیل میشود و گزینههای -L نادیده گرفته میشوند. این میتواند هنگام استفاده از gcc که گزینههای -L زیادی اضافه میکند و ممکن است روی سیستمهای فایل متصلشده با NFS باشند، مفید باشد.
برای سازگاری با سایر پیونددهندههای ELF، اگر پس از گزینه -R نام یک دایرکتوری قرار گیرد (به جای نام فایل)، مانند گزینه -rpath رفتار میشود.
- -rpath-link=dir
- هنگام
استفاده از
ELF یا SunOS، یک
کتابخانه
اشتراکی
ممکن است به
کتابخانه
دیگری نیاز
داشته باشد.
این حالت
زمانی رخ
میدهد که
یک پیوند
"ld -shared"
شامل یک
کتابخانه
اشتراکی به
عنوان یکی
از
فایلهای
ورودی باشد.
هنگامی که پیونددهنده در حین انجام پیوند غیر اشتراکی و غیرقابل جابهجایی با چنین وابستگیای مواجه میشود، در صورتی که آن کتابخانه اشتراکی مورد نیاز صراحتاً در پیوند گنجانده نشده باشد، بهطور خودکار تلاش میکند تا آن را مکانیابی کرده و در پیوند بگنجاند. در چنین حالتی، چندین دایرکتوری طبق توضیحات زیر جستجو میشوند. گزینه -rpath-link اولین مجموعه از دایرکتوریها را برای جستجو تعیین میکند. این گزینه میتواند دنبالهای از نامهای دایرکتوری را با ارائه فهرستی از نامهای جداشده با دونقطه (:) یا با تکرار چندین باره مشخص کند.
نشانههای $ORIGIN و $LIB میتوانند در این دایرکتوریهای جستجو ظاهر شوند. این نشانهها با مسیر کامل به دایرکتوری حاوی برنامه یا شیء اشتراکی در مورد $ORIGIN و lib - برای باینریهای ۳۲ بیتی - یا lib64 - برای باینریهای ۶۴ بیتی - در مورد $LIB جایگزین خواهند شد.
شکل جایگزین این نشانهها - ${ORIGIN} و ${LIB} نیز میتواند استفاده شود. نشانه $PLATFORM پشتیبانی نمیشود.
گزینه --rpath-link باید با احتیاط استفاده شود زیرا مسیر جستجویی را که ممکن است به صورت سخت در یک کتابخانه اشتراکی کامپایل شده باشد بازنویسی میکند. در چنین حالتی ممکن است ناخواسته از یک مسیر جستجوی متفاوت نسبت به آنچه پیونددهنده زمان اجرا استفاده میکرد، استفاده شود.
هنگامی که به کتابخانههای اشتراکی اضافی نیاز باشد، پیونددهنده برای یافتن آنها دایرکتوریها را به ترتیبی که در زیر آمده جستجو میکند. با این حال توجه داشته باشید که این موضوع تنها در مورد کتابخانههای اضافی مورد نیاز برای برآورده کردن کتابخانههای اشتراکی از پیش گنجانده شده اعمال میشود. این مورد برای کتابخانههایی که از طریق گزینه خط فرمان -l اضافه شدهاند اعمال نمیشود. جستجو برای کتابخانههای -l تنها در دایرکتوریهای مشخصشده توسط گزینه -L انجام میشود.
- 1.
- هر دایرکتوری مشخصشده توسط گزینههای -rpath-link.
- 2.
- هر دایرکتوری مشخصشده توسط گزینههای -rpath. تفاوت بین -rpath و -rpath-link در این است که دایرکتوریهای مشخصشده توسط گزینههای -rpath در فایل اجرایی گنجانده شده و در زمان اجرا استفاده میشوند، در حالی که گزینه -rpath-link تنها در زمان پیوند مؤثر است. جستجوی -rpath به این روش تنها توسط پیونددهندههای بومی و پیونددهندههای متقاطعی که با گزینه --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 استفاده نشود و نمادهای تعریفنشده در پیوند وجود داشته باشد، پیونددهنده بهطور خودکار یک کتابخانه اشتراکی ایجاد خواهد کرد..IP --sort-common 4
- --sort-common=ascending
- --sort-common=descending
- این گزینه به ld اعلام میکند هنگام قرار دادن نمادهای عمومی (common symbols) در بخشهای خروجی مناسب، آنها را بر اساس تراز (alignment) به ترتیب صعودی یا نزولی مرتب کند. ترازهای نماد مد نظر عبارتند از شانزده بایتی یا بزرگتر، هشت بایتی، چهار بایتی، دو بایتی، و یک بایتی. این کار برای جلوگیری از ایجاد شکاف بین نمادها به دلیل محدودیتهای تراز انجام میشود. اگر ترتیب مرتبسازی مشخص نشده باشد، ترتیب نزولی فرض میشود.
- --sort-section=name
- این گزینه "SORT_BY_NAME" را برای تمام الگوهای عام (wildcard) بخشها در اسکریپت پیونددهنده اعمال میکند.
- --sort-section=alignment
- این گزینه "SORT_BY_ALIGNMENT" را برای تمام الگوهای عام (wildcard) بخشها در اسکریپت پیونددهنده اعمال میکند.
- --spare-dynamic-tags=count
- این گزینه تعداد خانههای خالی برای باقی گذاشتن در بخش .dynamic از اشیاء اشتراکی ELF را مشخص میکند. ممکن است ابزارهای پسپردازش مانند prelinker به این خانههای خالی نیاز داشته باشند. مقدار پیشفرض 5 است.
- --split-by-file[=size]
- مشابه --split-by-reloc است، با این تفاوت که با رسیدن به size یک بخش خروجی جدید برای هر فایل ورودی ایجاد میکند. در صورت عدم تعیین، مقدار پیشفرض size برابر 1 است.
- --split-by-reloc[=count]
- تلاش میکند بخشهای اضافی در فایل خروجی ایجاد کند تا هیچ بخش خروجی منفردی در فایل بیش از count بازنشانی (relocation) دربرنداشته باشد. این گزینه هنگام تولید فایلهای بازنشانیپذیر بزرگ برای بارگذاری در برخی هستههای بیدرنگ با قالب فایل شیء COFF مفید است؛ چرا که COFF نمیتواند بیش از 65535 بازنشانی را در یک بخش منفرد نمایش دهد. توجه داشته باشید که این سازوکار برای قالبهای فایل شیئی که از بخشهای دلخواه پشتیبانی نمیکنند، کار نخواهد کرد. پیونددهنده بخشهای ورودی منفرد را برای توزیع مجدد تکهتکه نمیکند؛ بنابراین اگر یک بخش ورودی منفرد شامل بیش از count بازنشانی باشد، یک بخش خروجی نیز همان تعداد بازنشانی را دربرخواهد داشت. مقدار پیشفرض count برابر 32768 است.
- --stats[=filename]
- محاسبه و
نمایش آمار
درباره
عملکرد
پیونددهنده،
مانند زمان
اجرا و
میزان مصرف
حافظه.
چنانچه آرگومان اختیاری filename ارائه نشود، تنها اطلاعات اولیه گزارش شده و به جریان خروجی خطای استاندارد ارسال میگردد. در صورت ارائه آرگومان filename، اطلاعات تفصیلی در فایل نامبرده نوشته میشود. اگر مقدار filename تنها نماد - باشد، اطلاعات تفصیلی به جریان خروجی استاندارد فرستاده خواهد شد. اگر filename با + آغاز شود، فایل به جای حالت بازنویسی، در حالت الحاق (append) باز میشود.
اگر گزینه -Map فعال باشد، اطلاعات در فایل نگاشت (map) نیز ثبت میشود. نکته: اگر هر دو گزینه --stats و -Map دارای آرگومانهای filename یکسان باشند، اطلاعات فقط یک بار نوشته میشود، نه دو بار.
اگر متغیر محیطی "LD_STATS" تعریف شده باشد، رفتاری مشابه گزینه --stats خواهد داشت. اگر مقدار این متغیر یک رشته باشد، به عنوان نام فایلی که اطلاعات باید در آن ثبت شود استفاده میگردد. در غیر این صورت اطلاعات به جریان خروجی استاندارد فرستاده میشود. استفاده از متغیر محیطی این امکان را میدهد که آمارها بدون نیاز به دستکاری خط فرمان پیونددهنده ثبت شوند. نکته: اگر هم از متغیر محیطی و هم از گزینه --stats استفاده شود، گزینه --stats اولویت خواهد داشت.
اطلاعات تفصیلی گزارششده شامل زمان پردازنده (cpu time) مصرفی است و در صورت در دسترس بودن فراخوانی کتابخانه سیستمی getrusage()، حداکثر اندازه مجموعه مقیم (RSS) و زمانهای اجرای کاربری و سیستمی را نیز در بر میگیرد. علاوه بر این، در صورت موجود بودن فراخوانیهای کتابخانه سیستمی mallinfo یا mallinfo2، کل حافظه مصرفی گزارش میشود.
این اطلاعات برای بخشهای مجزای فرایند پیونددهی که به عنوان فازها (phases) نامیده میشوند نمایش داده میشود. توجه داشته باشید که فازهای مجزا میتوانند یکدیگر را در بر بگیرند یا همپوشانی داشته باشند؛ بنابراین نباید تصور کرد که کل منابع مصرفشده توسط پیونددهنده، مجموع منابع مصرفی فازهای مجزا است.
همچنین، اطلاعات برای یک فاز خاص به نام ALL که کل فرایند پیونددهی را پوشش میدهد نیز گزارش میگردد.
هنگام گزارش اطلاعات تفصیلی، نگارش پیونددهنده، آرگومانهای خط فرمان و زمان آغاز به کار پیونددهنده نیز لحاظ میشوند. این ویژگی مدیریت شرایطی را که در آن چندین فرایند پیونددهی توسط یک سامانه ساخت فراخوانی میشوند آسانتر میسازد و دقیقاً مشخص میکند که چه آرگومانهایی مسئول ایجاد آمارهای گزارششده بودهاند.
خروجی تفصیلی چیزی شبیه به این خواهد بود:
Stats: linker version: (GNU Binutils) 2.44.50.20250401 Stats: linker started: Wed Apr 2 09:36:41 2025 Stats: args: ld -z norelro -z nomemory-seal -z no-separate-code -o a.out [...] Stats: phase cpu time rss user time system time memory Stats: name (microsec) (KiB) (seconds) (seconds) (KiB) Stats: ALL 390082 217740 0 0 25219440 Stats: ctf processing 12 0 0 0 0 Stats: string merge 1324 0 0 0 406544 Stats: parsing 349 288 0 0 119792 Stats: plugins 1 0 0 0 0 Stats: processing files 259616 214524 0 0 31569120 Stats: write 116493 0 0 0 48096
- --no-stats
- در صورتی که گزارش آمارهای مصرفی از طریق گزینه خط فرمان --stats یا متغیر محیطی LD_STATS فعال شده باشد، آن را غیرفعال میکند.
- --sysroot=directory
- از directory به عنوان مکان sysroot استفاده میکند و مقدار پیشفرض زمان پیکربندی (configure-time) را بازنویسی مینماید. این گزینه تنها توسط پیونددهندههایی پشتیبانی میشود که با --with-sysroot پیکربندی شده باشند.
- --task-link
- این گزینه توسط مقصدهای مبتنی بر COFF/PE برای ایجاد یک فایل شیء پیوند-وظیفه (task-linked) به کار میرود که در آن تمامی نمادهای سراسری (global) به ایستا (static) تبدیل شدهاند.
- --traditional-format
- برای برخی
از مقصدها،
خروجی ld از
جهاتی با
خروجی
پیونددهندههای
موجود
متفاوت است.
این سوییچ
از ld
درخواست
میکند تا
در عوض از
قالب سنتی
(traditional) استفاده
کند.
برای مثال در 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، نشانی اولین بایت از نخستین قطعه (segment) را تنظیم میکند. توجه داشته باشید که وقتی -pie همراه با -Ttext-segment=org استفاده میشود، فایل اجرایی خروجی با نشان ET_EXEC علامتگذاری میشود تا تضمین گردد نشانی اولین بایت قطعه متن (text segment) در زمان اجرا org خواهد بود.
- -Trodata-segment=org
- هنگام ایجاد یک فایل اجرایی یا شیء اشتراکی ELF برای مقصدی که در آن دادههای فقطخواندنی در قطعهای جداگانه و مجزا از متن اجرایی قرار دارند، نشانی اولین بایت از قطعه دادههای فقطخواندنی را تنظیم میکند..IP -Tldata-segment=org 4 هنگام ایجاد یک فایل اجرایی یا شیء اشتراکی ELF برای مدل حافظه متوسط x86-64، آدرس نخستین بایت از بخش ldata را تنظیم میکند.
- --unresolved-symbols=method
- نحوه مدیریت نمادهای حلنشده (unresolved symbols) را تعیین میکند. چهار مقدار ممکن برای method وجود دارد:
- ignore-all
- هیچ نماد حلنشدهای را گزارش نکن.
- report-all
- تمام نمادهای حلنشده را گزارش کن. این حالت پیشفرض است.
- ignore-in-object-files
- نمادهای حلنشده موجود در کتابخانههای اشتراکی را گزارش کن، اما اگر از فایلهای شیء معمولی باشند از آنها چشمپوشی کن.
- ignore-in-shared-libs
- نمادهای حلنشده ناشی از فایلهای شیء معمولی را گزارش کن، اما اگر از کتابخانههای اشتراکی باشند از آنها چشمپوشی کن. این گزینه هنگام ایجاد یک باینری پویا و در صورتی که مشخص باشد تمام کتابخانههای اشتراکی که باید به آنها ارجاع داده شود در خط فرمان پیونددهنده قرار دارند، میتواند مفید باشد.
رفتار مربوط به کتابخانههای اشتراکی به خودی خود نیز میتواند توسط گزینه --[no-]allow-shlib-undefined کنترل شود.
به طور معمول، پیونددهنده برای هر نماد حلنشده گزارششده یک پیام خطا تولید میکند، اما گزینه --warn-unresolved-symbols میتواند آن را به یک هشدار تبدیل نماید.
- --dll-verbose
- --verbose[=NUMBER]
- شماره نسخه ld را نمایش داده و شبیهسازهای پیونددهنده (linker emulations) پشتیبانیشده را فهرست میکند. نمایش میدهد کدام فایلهای ورودی میتوانند و کدام نمیتوانند باز شوند. اسکریپت پیونددهنده مورد استفاده را نمایش میدهد. اگر آرگومان اختیاری NUMBER بزرگتر از ۱ باشد، وضعیت نمادهای افزونه (plugin) نیز نمایش داده خواهد شد.
- --version-script=version-scriptfile
- نام یک اسکریپت نسخه را به پیونددهنده مشخص میکند. این معمولاً هنگام ایجاد کتابخانههای اشتراکی برای مشخص کردن اطلاعات بیشتر درباره سلسلهمراتب نسخه برای کتابخانه در حال ساخت استفاده میشود. این گزینه فقط در پلتفرمهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند به طور کامل پشتیبانی میشود؛ بخش VERSION را ببینید. در پلتفرمهای PE بهطور جزئی پشتیبانی میشود؛ این پلتفرمها میتوانند از اسکریپتهای نسخه برای پالایش نمایانی نمادها در حالت برونریزی خودکار (auto-export) استفاده کنند: هر نمادی که در اسکریپت نسخه با عنوان local علامتگذاری شده باشد برونریزی نخواهد شد.
- --warn-common
- هنگامی که
یک نماد
عمومی (common symbol) با
یک نماد
عمومی دیگر
یا با تعریف
یک نماد
ترکیب
میشود،
هشدار
میدهد.
پیونددهندههای
یونیکس این
شیوه تا حدی
سهلانگارانه
را مجاز
میدانند،
اما
پیونددهندهها
در برخی
سیستمعاملهای
دیگر چنین
اجازهای
نمیدهند.
این گزینه
به شما
اجازه
میدهد
مشکلات
بالقوه
ناشی از
ترکیب
نمادهای
سراسری را
پیدا کنید.
متأسفانه
برخی
کتابخانههای
C از این
شیوه
استفاده
میکنند،
بنابراین
ممکن است
هشدارهایی
درباره
نمادها در
کتابخانهها
و همچنین در
برنامههای
خود دریافت
کنید.
سه نوع نماد سراسری وجود دارد که در اینجا با مثالهای C نشان داده شده است:
- int i = 1;
- یک تعریف، که در بخش دادههای مقداردهیشده (initialized data) فایل خروجی قرار میگیرد.
- extern int i;
- یک ارجاع تعریفنشده، که فضایی تخصیص نمیدهد. باید در جایی تعریفی یا یک نماد عمومی برای متغیر وجود داشته باشد.
- int i;
- یک نماد عمومی. اگر فقط (یک یا چند) نماد عمومی برای یک متغیر وجود داشته باشد، در ناحیه دادههای مقداردهینشده فایل خروجی قرار میگیرد. پیونددهنده چند نماد عمومی را برای همان متغیر در یک نماد واحد ادغام میکند. اگر اندازههای متفاوتی داشته باشند، بزرگترین اندازه را انتخاب میکند. در صورتی که تعریفی از همان متغیر وجود داشته باشد، پیونددهنده نماد عمومی را به یک اعلان تبدیل میکند.
گزینه --warn-common میتواند پنج نوع هشدار تولید کند. هر هشدار از یک جفت خط تشکیل شده است: خط اول نمادی را که بهتازگی با آن مواجه شده شرح میدهد، و خط دوم نماد پیشین مواجهشده با همان نام را توصیف میکند. یک یا هر دو نماد، یک نماد عمومی خواهند بود.
- 1.
- تبدیل یک
نماد عمومی
به یک
ارجاع،
زیرا
پیشتر
تعریفی
برای این
نماد وجود
دارد.
<file>(<section>): warning: common of `<symbol>' overridden by definition <file>(<section>): warning: defined here
- 2.
- تبدیل یک
نماد عمومی
به یک
ارجاع،
زیرا بعداً
تعریفی
برای این
نماد
مشاهده شده
است. این
همانند
حالت قبلی
است، به جز
اینکه
نمادها با
ترتیبی
متفاوت
مشاهده
شدهاند.
<file>(<section>): warning: definition of `<symbol>' overriding common <file>(<section>): warning: common is here
- 3.
- ادغام یک
نماد عمومی
با یک نماد
عمومی
پیشینِ
هماندازه.
<file>(<section>): warning: multiple common of `<symbol>' <file>(<section>): warning: previous common is here
- 4.
- ادغام یک
نماد عمومی
با یک نماد
عمومی
پیشینِ
بزرگتر.
<file>(<section>): warning: common of `<symbol>' overridden by larger common <file>(<section>): warning: larger common is here
- 5.
- ادغام یک
نماد عمومی
با یک نماد
عمومی
پیشینِ
کوچکتر.
این همانند
حالت قبلی
است، به جز
اینکه
نمادها با
ترتیبی
متفاوت
مشاهده
شدهاند.
<file>(<section>): warning: common of `<symbol>' overriding smaller common <file>(<section>): warning: smaller common is here
- --warn-constructors
- اگر از هرگونه سازنده سراسری (global constructor) استفاده شود هشدار میدهد. این فقط برای چند قالب فایل شیء کاربرد دارد. برای قالبهایی مانند COFF یا ELF، پیونددهنده قادر به تشخیص استفاده از سازندههای سراسری نیست.
- --warn-execstack
- --warn-execstack-objects
- --no-warn-execstack
- در پلتفرمهای ELF، چنانچه از پیونددهنده خواسته شود فایل خروجی حاوی یک پشته قابلاجرا (executable stack) ایجاد کند، ممکن است پیامهای هشدار تولید نماید. سه وضعیت ممکن وجود دارد:
- 1.
- هیچ هشداری تولید نکن.
- 2.
- همیشه هشدار تولید کن، حتی اگر پشته قابلاجرا از طریق گزینه خط فرمان -z execstack درخواست شده باشد.
- 3.
- تنها در صورتی هشدار تولید کن که یک فایل شیء درخواست پشته قابلاجرا کند، اما اگر گزینه -z execstack به کار رفته باشد هشداری نده.
وضعیت پیشفرض به نحوه پیکربندی پیونددهنده در زمان ساخت بستگی دارد. گزینه --no-warn-execstack همواره پیونددهنده را در وضعیت بدون هشدار قرار میدهد. گزینه --warn-execstack پیونددهنده را در وضعیت همیشه هشدار قرار میدهد. گزینه --warn-execstack-objects پیونددهنده را در وضعیت هشدار فقط برای فایلهای شیء قرار میدهد.
نکته: فایلهای ورودی با قالب ELF میتوانند با داشتن بخش .note.GNU-stack که بیت قابلیت اجرا در پرچمهای بخش آن تنظیم شده است، نیاز خود به یک پشته قابلاجرا را مشخص کنند. آنها همچنین میتوانند با داشتن همان بخش بدون فعال بودن بیت پرچم قابلیت اجرا، مشخص کنند که به پشته قابلاجرا نیازی ندارند. اگر یک فایل ورودی بخش .note.GNU-stack را نداشته باشد، رفتار پیشفرض وابسته به معماری مقصد (target) است. برای برخی مقاصد، عدم وجود چنین بخشی بیانگر آن است که پشته قابلاجرا لازم است. این مورد اغلب مشکلی برای فایلهای اسمبلی دستنویس به شمار میرود.
- --no-error-execstack
- اگر
پیونددهنده
بخواهد یک
پیام هشدار
دربارهٔ یک
پشتهٔ
اجرایی
ایجاد کند،
گزینهٔ --error-execstack
در عوض آن
هشدار را به
یک خطا
تبدیل
میکند.
توجه - این
گزینه
وضعیت
تولید
هشدار execstack
پیونددهنده
را تغییر
نمیدهد. از
--warn-execstack یا --warn-execstack-objects
برای تعیین
یک وضعیت
هشدار مشخص
استفاده
کنید.
گزینهٔ --no-error-execstack رفتار پیشفرضِ تولید پیامهای هشدار را بازمیگرداند.
- --warn-multiple-gp
- هشدار میدهد اگر چندین مقدار اشارهگر سراسری (global pointer) در فایل خروجی مورد نیاز باشد. این مورد فقط برای پردازندههای خاصی مانند Alpha معنادار است. به طور مشخص، برخی پردازندهها مقادیر ثابتِ بزرگ را در یک بخش ویژه قرار میدهند. یک ثبات ویژه (اشارهگر سراسری) به میانهٔ این بخش اشاره میکند، به گونهای که مقادیر ثابت میتوانند به شکل کارآمد از طریق حالت آدرسدهی نسبی ثبات مبنا بارگذاری شوند. از آنجا که آفست در حالت نسبی ثبات مبنا ثابت و نسبتاً کوچک است (مثلاً ۱۶ بیت)، این امر حداکثر اندازهٔ مخزن ثوابت (constant pool) را محدود میسازد. بنابراین، در برنامههای بزرگ، اغلب استفاده از چندین مقدار اشارهگر سراسری برای توانایی آدرسدهی به همهٔ ثوابتِ ممکن ضروری است. این گزینه باعث میشود هر زمان که این حالت پیش بیاید، هشداری صادر شود.
- --warn-once
- برای هر نماد تعریفنشده فقط یک بار هشدار میدهد، نه یک بار به ازای هر پیمانهای که به آن ارجاع دارد.
- --warn-rwx-segments
- --no-warn-rwx-segments
- هشدار
میدهد اگر
پیونددهنده
یک قطعهٔ (segment)
بارگذاریپذیر
با اندازهٔ
غیرصفر
بسازد که هر
سه پرچم
دسترسی
خواندن،
نوشتن و
اجرا در آن
تنظیم شده
باشد. چنین
قطعهای
نشاندهندهٔ
یک
آسیبپذیری
امنیتی
بالقوه است.
علاوه بر
این، اگر یک
قطعهٔ
ذخیرهسازی
محلی رشته (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 را به یک فایل اجرایی مستقل از موقعیت (PIE) یا شیء اشتراکی (shared object) اضافه کند.
- --warn-alternate-em
- هشدار میدهد اگر یک شیء دارای کد ماشین ELF جایگزین باشد.
- --warn-unresolved-symbols
- اگر پیونددهنده بخواهد یک نماد حلنشده را گزارش دهد (گزینهٔ --unresolved-symbols را ببینید)، به طور عادی یک خطا ایجاد میکند. این گزینه باعث میشود به جای آن یک هشدار ایجاد کند.
- --error-unresolved-symbols
- این گزینه رفتار پیشفرض پیونددهنده مبنی بر ایجاد خطا هنگام گزارش نمادهای حلنشده را بازمیگرداند.
- --whole-archive
- به ازای هر
بایگانی (archive)
ذکرشده در
خط فرمان پس
از گزینهٔ
--whole-archive، تمام
فایلهای
شیء موجود
در بایگانی
را در
پیونددهی
بگنجانید،
به جای آنکه
بایگانی
برای یافتن
فایلهای
شیء مورد
نیاز جستجو
شود. این
مورد
معمولاً
برای تبدیل
یک فایل
بایگانی به
یک
کتابخانهٔ
اشتراکی (shared library)
به کار
میرود و
همهٔ شیءها
را مجبور
میسازد در
کتابخانهٔ
اشتراکیِ
حاصل
گنجانده
شوند. این
گزینه
میتواند
بیش از یک
بار
استفاده
شود.
این گزینه در میان جفتگزینهٔ --start-lib/--end-lib مجاز نیست.
دو نکته هنگام استفاده از این گزینه از طریق gcc: نخست، gcc این گزینه را نمیشناسد، بنابراین باید از -Wl,-whole-archive استفاده کنید. دوم، فراموش نکنید که پس از فهرست بایگانیهای خود از -Wl,-no-whole-archive استفاده کنید، زیرا gcc فهرست بایگانیهای خود را به پیوند شما میافزاید و ممکن است نخواهید این پرچم بر آنها نیز تأثیر بگذارد.
- --link-mapless
- بایگانیهایی را که فاقد نمایه (یا همان نقشهٔ نماد یا symbol map) هستند، برای تمام بایگانیهای بعدی ذکرشده در خط فرمان میپذیرد. در صورت نبودن، چنین نمایهای به طور داخلی و در حین اجرا به بهای کاهش کارایی ساخته میشود. این حالت پیشفرض است.
- --wrap=symbol
- از یک تابع
پوشاننده (wrapper
function) برای 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 info) در ".eh_frame" برای بخشهای کد تولیدشده توسط پیونددهنده مانند PLT. این گزینه در صورتی که اطلاعات بازگردانیِ تولیدشده توسط پیونددهنده پشتیبانی شود، به طور پیشفرض فعال است.
- --discard-sframe
- اطلاعات ردگیری پشتهٔ (stack trace) ".sframe" را از خروجی حذف میکند. این گزینه همچنین از ایجاد دادههای ردگیری پشتهٔ SFrame برای بخشهای کدِ تولیدشده توسط پیونددهنده مانند PLT جلوگیری میکند. این گزینه به طور پیشفرض غیرفعال است..IP --enable-new-dtags 4
- --disable-new-dtags
- این پیونددهنده میتواند تگهای پویای جدید را در ELF ایجاد کند؛ اما سیستمهای قدیمیتر ELF ممکن است آنها را متوجه نشوند. اگر --enable-new-dtags را مشخص کنید، تگهای پویای جدید در صورت نیاز ایجاد شده و تگهای پویای قدیمیتر حذف خواهند شد. اگر --disable-new-dtags را مشخص کنید، هیچ تگ پویای جدیدی ایجاد نخواهد شد. بهطور پیشفرض، تگهای پویای جدید ایجاد نمیشوند. توجه داشته باشید که این گزینهها تنها برای سیستمهای ELF در دسترس هستند.
- --hash-size=number
- تنظیم اندازه پیشفرض جدولهای درهمسازی پیونددهنده به یک عدد اول نزدیک به number. افزایش این مقدار میتواند مدتزمان لازم برای انجام وظایف پیونددهنده را به قیمت افزایش حافظه مورد نیاز پیونددهنده کاهش دهد. به همین ترتیب، کاهش این مقدار میتواند نیازهای حافظه را به بهای کاهش سرعت کم کند. مقدار پیشفرض در شرایط عادی 4051 و در صورت استفاده از گزینه خط فرمان --reduce-memory-overheads برابر 1021 است.
- --hash-style=style
- تعیین نوع جدول(های) درهمسازی پیونددهنده. مقدار style میتواند "sysv" برای بخش کلاسیک ".hash" در ELF، مقدار "gnu" برای بخش سبک جدید گنو ".gnu.hash"، یا "both" برای هر دو جدول درهمسازی کلاسیک ELF ".hash" و سبک جدید GNU ".gnu.hash" باشد. مقدار پیشفرض به نحوه پیکربندی پیونددهنده بستگی دارد، اما برای بیشتر سیستمهای مبتنی بر لینوکس "both" خواهد بود.
- --compress-debug-sections=none
- --compress-debug-sections=zlib
- --compress-debug-sections=zlib-gnu
- --compress-debug-sections=zlib-gabi
- --compress-debug-sections=zstd
- در
بسترهای
ELF، این
گزینهها
نحوه
فشردهسازی
بخشهای
دیباگ DWARF را
با استفاده
از zlib کنترل
میکنند.
گزینه --compress-debug-sections=none بخشهای دیباگ DWARF را فشرده نمیکند. گزینه --compress-debug-sections=zlib-gnu بخشهای دیباگ DWARF را فشرده کرده و نام آنها را طوری تغییر میدهد که به جای .debug با .zdebug شروع شوند. گزینه --compress-debug-sections=zlib-gabi نیز بخشهای دیباگ DWARF را فشرده میکند، اما به جای تغییر نام آنها، پرچم SHF_COMPRESSED را در سرآیند بخشها تنظیم مینماید.
گزینه --compress-debug-sections=zlib یک نام مستعار برای --compress-debug-sections=zlib-gabi است.
گزینه --compress-debug-sections=zstd بخشهای دیباگ DWARF را با استفاده از zstd فشرده میکند.
توجه داشته باشید که این گزینه بر هرگونه فشردهسازی در بخشهای دیباگ ورودی ارجحیت دارد؛ بنابراین، به عنوان مثال اگر یک باینری با --compress-debug-sections=none پیوند داده شود، هرگونه بخش دیباگ فشردهشده در فایلهای ورودی قبل از کپی شدن در باینری خروجی از حالت فشرده خارج خواهد شد.
رفتار فشردهسازی پیشفرض بسته به هدف مورد نظر و گزینههای پیکربندی استفادهشده در ساخت زنجیره ابزار متفاوت است. رفتار پیشفرض را میتوان با بررسی خروجی گزینه --help در پیونددهنده تعیین کرد.
- --reduce-memory-overheads
- این گزینه
نیازمندیهای
حافظه در
زمان اجرای
ld را به قیمت
کاهش سرعت
پیوند
دادن، کاهش
میدهد. این
گزینه برای
انتخاب
الگوریتم
قدیمی O(n^2) جهت
تولید فایل
نقشه
پیوند، به
جای
الگوریتم
جدید O(n)
معرفی شد که
حدود ۴۰٪
حافظه
بیشتری
برای
ذخیرهسازی
نمادها
مصرف
میکند.
اثر دیگر این سوئیچ، تنظیم اندازه پیشفرض جدول درهمسازی روی 1021 است که باز هم به بهای طولانیتر شدن زمان اجرای پیونددهنده، در مصرف حافظه صرفهجویی میکند. البته اگر از سوئیچ --hash-size استفاده شده باشد، این کار انجام نخواهد شد.
سوئیچ --reduce-memory-overheads ممکن است در نسخههای آینده پیونددهنده برای فعال کردن موازنههای دیگر نیز به کار گرفته شود.
- --max-cache-size=size
- بهطور معمول ld اطلاعات بازنشانی و جدولهای نمادِ فایلهای ورودی را با اندازه نامحدود در حافظه میانگیر میکند. این گزینه حداکثر اندازه حافظه پنهان را روی size تنظیم میکند. توجه داشته باشید - اگر از گزینه خط فرمان --no-keep-memory استفاده شده باشد، پیونددهنده به گونهای عمل میکند که گویی حداکثر اندازه حافظه پنهان روی 0 تنظیم شده است - یعنی هیچچیز نگه داشته نمیشود.
- --build-id
- --build-id=style
- درخواست
ایجاد یک
بخش
یادداشت ELF
با نام
".note.gnu.build-id" یا
یک بخش COFF با
نام ".buildid".
محتویات
این
یادداشت
بیتهای
یکتایی
هستند که
این فایل
پیوندیافته
را مشخص
میکنند.
مقدار style
میتواند
"uuid" برای
استفاده از
۱۲۸ بیت
تصادفی؛
"sha1" برای
استفاده از
درهمسازی
۱۶۰ بیتی SHA1،
مقدار
"md5" برای
استفاده از
درهمسازی
۱۲۸ بیتی MD5،
یا "xx"
برای
استفاده از
درهمسازی
۱۲۸ بیتی XXHASH
روی
بخشهای
هنجاری
محتویات
خروجی؛ یا
"0xhexstring"
برای
استفاده از
یک رشته
بیتی
برگزیده به
صورت تعداد
زوجی از
ارقام
شانزدهشانزدهی
(نویسههای
"-" و
":" بین
جفترقمها
نادیده
گرفته
میشوند)
باشد. اگر style
حذف شود، از
"sha1"
استفاده
خواهد شد.
سبکهای "md5"، "sha1" و "xx" شناسهای تولید میکنند که در یک فایل خروجی یکسان همواره یکسان است، اما تقریباً بهطور قطع در میان تمام فایلهای خروجی غیریکسان، یکتا خواهد بود. این شناسه به منظور مقایسه به عنوان یک جمعآزمای برای محتویات فایل در نظر گرفته نشده است. یک فایل پیوندیافته ممکن است بعداً توسط ابزارهای دیگر تغییر یابد، اما رشته بیت شناسه ساخت (build ID) که فایل پیوندیافته اصلی را مشخص میکند، تغییر نمیکند.
ارسال مقدار "none" برای style، تنظیمات اعمالشده توسط هر گزینه قبلی "--build-id" در خط فرمان را غیرفعال میکند.
- --package-metadata=JSON
- درخواست ایجاد یک بخش یادداشت ELF با نام ".note.package". محتویات این یادداشت طبق مشخصات فراداده بسته، در قالب JSON است. برای اطلاعات بیشتر ببینید: https://systemd.io/ELF_PACKAGE_METADATA آرگومان JSON از درصدکدگذاری و کدگذاریهای %[string] زیر (که در آن string به نام موجود در مراجع نویسه نامگذاریشده HTML اشاره دارد) پشتیبانی میکند: %[comma] برای ,، %[lbrace] برای {، %[quot] برای "، %[rbrace] برای }، و %[space] برای نویسه فاصله. اگر آرگومان JSON وجود نداشته باشد یا خالی باشد، در صورت فعال بودن یادداشت فراداده توسط مورد قبلی گزینه --package-metadata، ایجاد آن غیرفعال میشود. اگر پیونددهنده با libjansson ساخته شده باشد، رشته JSON اعتبارسنجی خواهد شد.
پیونددهنده PE از گزینه -shared پشتیبانی میکند که باعث میشود خروجی به جای یک فایل اجرایی معمولی، یک کتابخانه پیوندیافته پویا (DLL) باشد. هنگام استفاده از این گزینه باید نام خروجی را به صورت "*.dll" مشخص کنید. علاوه بر این، پیونددهنده بهطور کامل از فایلهای استاندارد "*.def" پشتیبانی میکند که میتوانند مانند یک فایل شیء در خط فرمان پیونددهنده مشخص شوند (در واقع، باید قبل از آرشیوهایی قرار گیرد که نمادها را از آنها صادر میکند، تا اطمینان حاصل شود که درست مانند یک فایل شیء معمولی پیوند داده میشوند).
علاوه بر گزینههای مشترک برای تمام هدفها، پیونددهنده PE از گزینههای خط فرمان بیشتری پشتیبانی میکند که مخصوص هدف PE هستند. گزینههایی که مقدار میگیرند، میتوانند با یک فاصله یا یک علامت مساوی از مقدار خود جدا شوند.
- --add-stdcall-alias
- در صورت مشخص شدن، نمادهای دارای پسوند stdcall (@nn) هم به همان صورت که هستند و هم با پسوند حذفشده صادر خواهند شد. [این گزینه مخصوص پورتهای پیونددهنده با هدف PE است]
- --base-file file
- استفاده از file به عنوان نام فایلی برای ذخیره آدرسهای پایه تمام بازنشانیهای مورد نیاز جهت تولید DLLها با dlltool. [این گزینه مخصوص پورتهای پیونددهنده با هدف PE است]
- --dll
- ایجاد یک DLL به جای یک فایل اجرایی معمولی. همچنین میتوانید از -shared استفاده کنید یا یک "LIBRARY" را در یک فایل ".def" مشخص نمایید. [این گزینه مخصوص پورتهای پیونددهنده با هدف PE است]
- --enable-long-section-names
- --disable-long-section-names
- گونههای PE از قالب شیء COFF افزونهای اضافه میکنند که اجازه میدهد از نامهای بخش طولانیتر از هشت نویسه (محدودیت معمولی برای COFF) استفاده شود. بهطور پیشفرض، این نامها تنها در فایلهای شیء مجاز هستند، زیرا ایمیجهای اجرایی کاملاً پیوندیافته فاقد جدول رشته COFF مورد نیاز برای پشتیبانی از نامهای طولانیتر هستند. به عنوان یک افزونه گنو، میتوان با استفاده از این دو گزینه، امکان استفاده از آنها را در ایمیجهای اجرایی نیز فراهم کرد، یا (احتمالاً بدون دلیل خاصی!) استفاده از آن را در فایلهای شیء غیرمجاز ساخت. ایمیجهای اجرایی تولیدشده با این نامهای طولانی بخش، تا حدی غیر استاندارد هستند زیرا یک جدول رشته را با خود حمل میکنند، و ممکن است هنگام بررسی با ابزارهای غیر گنو آگاه به PE مانند نمایشگرها و دامپرهای فایل، خروجی گیجکنندهای ایجاد نمایند. با این حال، GDB برای یافتن بخشهای اطلاعات دیباگ Dwarf-2 در یک ایمیج اجرایی در زمان اجرا به استفاده از نامهای طولانی بخش PE وابسته است؛ بنابراین اگر هیچکدام از این گزینهها در خط فرمان مشخص نشده باشد، هرگاه ld هنگام پیوند یک ایمیج اجرایی و عدم حذف نمادها متوجه حضور اطلاعات دیباگ شود، با لغو رفتار پیشفرض و از نظر فنی درست، نامهای بخش طولانی را فعال خواهد کرد. [این گزینه مخصوص پورتهای پیونددهنده با هدف PE است].IP --enable-stdcall-fixup 4
- --disable-stdcall-fixup
- اگر فرآیند پیوند نمادی را بیابد که نتواند آن را حل کند، با جستجو به دنبال نماد تعریفشدهٔ دیگری که تنها در قالب نام نماد (cdecl در برابر stdcall) تفاوت دارد، تلاش میکند یک «پیوند فازی» (fuzzy linking) انجام دهد و آن نماد را با پیوند دادن به مورد منطبق حل نماید. برای نمونه، نماد تعریفنشدهٔ "_foo" ممکن است به تابع "_foo@12" پیوند یابد، یا نماد تعریفنشدهٔ "_bar@16" ممکن است به تابع "_bar" پیوند داده شود. هنگامی که پیونددهنده چنین کاری انجام میدهد، یک هشدار چاپ میکند، زیرا معمولاً فرآیند پیوند باید با شکست مواجه میشد، اما گاهی کتابخانههای وارداتی (import libraries) تولیدشده از dllهای شخص ثالث ممکن است برای قابل استفاده بودن به این ویژگی نیاز داشته باشند. اگر --enable-stdcall-fixup را مشخص کنید، این ویژگی کاملاً فعال شده و هشدارها چاپ نمیشوند. اگر --disable-stdcall-fixup را مشخص کنید، این ویژگی غیرفعال شده و چنین عدم تطابقهایی خطا در نظر گرفته میشوند. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --leading-underscore
- --no-leading-underscore
- برای بیشتر هدفها، پیشوند پیشفرض نماد یک خط زیرین (_) است و در توضیحات هدف تعریف میشود. با این گزینه میتوان پیشوند پیشفرض خط زیرین برای نمادها را غیرفعال/فعال کرد. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --export-all-symbols
- در صورت تعیین، تمام نمادهای سراسری موجود در اشیائی که برای ساخت یک DLL استفاده شدهاند، توسط DLL صادر خواهند شد. توجه داشته باشید در صورتی که در غیر این صورت هیچ نماد صادرشدهای وجود نداشته باشد، این حالت پیشفرض است. هنگامی که نمادها به طور صریح از طریق فایلهای DEF یا به طور ضمنی از طریق ویژگیهای تابع (function attributes) صادر میشوند، پیشفرض این است که هیچ چیز دیگری صادر نشود مگر اینکه این گزینه مشخص شده باشد. توجه داشته باشید که نمادهای "DllMain@12"، "DllEntryPoint@0"، "DllMainCRTStartup@12" و "impure_ptr" به طور خودکار صادر نخواهند شد. همچنین، نمادهای واردشده از سایر DLLها دوباره صادر نخواهند شد، و همینطور نمادهایی که ساختار داخلی DLL را مشخص میکنند مانند نمادهایی که با "_head_" آغاز یا به "_iname" ختم میشوند. علاوه بر این، هیچ نمادی از "libgcc"، "libstd++"، "libmingw32" یا "crtX.o" صادر نخواهد شد. نمادهایی که نام آنها با "__rtti_" یا "__builtin_" آغاز میشود، جهت تسهیل ساخت DLLهای ++C صادر نخواهند شد. در نهایت، فهرست گستردهای از نمادهای خصوصی cygwin وجود دارد که صادر نمیشوند (بدیهی است که این مورد تنها هنگام ساخت DLLها برای هدفهای cygwin اعمال میشود). این نمادهای مستثنی در cygwin عبارتند از: "_cygwin_dll_entry@12"، "_cygwin_crt0_common@8"، "_cygwin_noncygwin_dll_entry@12"، "_fmode"، "_impure_ptr"، "cygwin_attach_dll"، "cygwin_premain0"، "cygwin_premain1"، "cygwin_premain2"، "cygwin_premain3" و "environ". [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --exclude-symbols symbol,symbol,...
- فهرستی از نمادها را مشخص میکند که نباید به طور خودکار صادر شوند. نام نمادها میتواند با کاما یا دونقطه از یکدیگر جدا شود. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --exclude-all-symbols
- مشخص میکند که هیچ نمادی نباید به طور خودکار صادر شود. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --file-alignment
- تراز فایل (file alignment) را تعیین میکند. بخشهای موجود در فایل همواره در آفستهایی از فایل آغاز میشوند که مضربی از این عدد باشند. مقدار پیشفرض آن ۵۱۲ است. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --heap reserve
- --heap reserve,commit
- میزان حافظه بر حسب بایت را جهت رزرو کردن (و در صورت تمایل تثبیت کردن یا commit) برای استفاده به عنوان هیپ (heap) در این برنامه مشخص میکند. مقدار پیشفرض ۱ مگابایت رزروشده و ۴ کیلوبایت تثبیتشده است. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --kill-at
- در صورت تعیین، پسوندهای stdcall (به شکل @nn) پیش از صادر شدن نمادها، از آنها حذف میشوند. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --large-address-aware
- در صورت تعیین، بیت مربوطه در فیلد «Characteristics» از سرایند COFF تنظیم میشود تا مشخص کند این فایل اجرایی از آدرسهای مجازی بزرگتر از ۲ گیگابایت پشتیبانی میکند. این گزینه باید همراه با سوییچ /3GB یا /USERVA=value بر حسب مگابایت در بخش «[operating systems]» از فایل BOOT.INI به کار رود؛ در غیر این صورت، این بیت هیچ اثری نخواهد داشت. [این گزینه مختص پورت هدفگذاریشده برای i386 PE در پیونددهنده است]
- --disable-large-address-aware
- اثر گزینهٔ پیشین --large-address-aware را خنثی میکند. این مورد زمانی کاربرد دارد که --large-address-aware همواره توسط راهانداز کامپایلر (مانند Cygwin gcc) تنظیم شده باشد اما فایل اجرایی از آدرسهای مجازی بزرگتر از ۲ گیگابایت پشتیبانی نکند. [این گزینه مختص پورت هدفگذاریشده برای i386 PE در پیونددهنده است]
- --major-image-version value
- شمارهٔ اصلی «image version» را تعیین میکند. مقدار پیشفرض ۱ است. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --major-os-version value
- شمارهٔ اصلی «os version» را تعیین میکند. مقدار پیشفرض ۴ است. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --major-subsystem-version value
- شمارهٔ اصلی «subsystem version» را تعیین میکند. مقدار پیشفرض ۴ است. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --minor-image-version value
- شمارهٔ فرعی «image version» را تعیین میکند. مقدار پیشفرض ۰ است. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --minor-os-version value
- شمارهٔ فرعی «os version» را تعیین میکند. مقدار پیشفرض ۰ است. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --minor-subsystem-version value
- شمارهٔ فرعی «subsystem version» را تعیین میکند. مقدار پیشفرض ۰ است. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --output-def file
- پیونددهنده فایل file را ایجاد خواهد کرد که حاوی یک فایل DEF متناظر با DLL تولیدشده توسط پیونددهنده است. این فایل DEF (که باید به صورت "*.def" نامگذاری شود) میتواند برای ایجاد یک کتابخانهٔ وارداتی با "dlltool" استفاده شود یا به عنوان مرجعی برای نمادهای صادرشدهٔ خودکار یا ضمنی به کار رود. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --enable-auto-image-base
- --enable-auto-image-base=value
- به طور خودکار پایهٔ ایمیج را برای DLLها انتخاب میکند، که در صورت تمایل از پایهٔ value آغاز میشود، مگر اینکه مقداری با استفاده از آرگومان "--image-base" مشخص شده باشد. با استفاده از هشی که از نام dll برای ایجاد پایههای ایمیج یکتا برای هر DLL تولید میشود، از تداخلها و بازنشانیها (relocations) در حافظه که میتوانند اجرای برنامه را به تأخیر بیندازند جلوگیری میشود. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --disable-auto-image-base
- پایهٔ ایمیج یکتا را به طور خودکار ایجاد نمیکند. در صورتی که پایهٔ ایمیجی توسط کاربر مشخص نشده باشد ("--image-base")، از پیشفرض سکو استفاده میشود. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --dll-search-prefix string
- هنگام پیوند پویا به یک dll بدون کتابخانهٔ وارداتی، به جای "lib<basename>.dll"، ترجیحاً به دنبال "<string><basename>.dll" میگردد. این رفتار امکان تمایز آسان بین DLLهای ساختهشده برای «زیرسکو»های مختلف را فراهم میسازد: native، cygwin، uwin، pw و غیره. برای نمونه، DLLهای cygwin معمولاً از "--dll-search-prefix=cyg" استفاده میکنند. [این گزینه مختص پورتهای هدفگذاریشده برای PE در پیونددهنده است]
- --enable-auto-import
- پیوند
پیشرفتهای
میان
"_symbol" و
"__imp__symbol"
برای وارد
کردن
دادهها (DATA imports)
از DLLها
انجام
میدهد؛
بنابراین
دور زدن
سازوکار dllimport
در سمت
کاربر و
ارجاع به
نام
نمادهای
بدون
دستکاری (unmangled)
امکانپذیر
میشود.
[این گزینه
مختص
پورتهای
هدفگذاریشده
برای PE در
پیونددهنده
است]
نکات زیر مربوط به پیادهسازی اولیهٔ این ویژگی است و امروزه برای هدفهای Cygwin و MinGW منسوخ به شمار میرود.
نکته: استفاده از افزونهٔ 'auto-import' باعث میشود که بخش متنی (text section) از فایل ایمیج قابل نوشتن شود. این امر با مشخصات قالب PE-COFF منتشر شده توسط مایکروسافت مطابقت ندارد.
نکته - استفاده از افزونهٔ 'auto-import' همچنین موجب میشود دادههای فقطخواندنی که معمولاً باید در بخش .rdata قرار گیرند، در بخش .data قرار داده شوند. این به منظور دور زدن مشکلی در مورد constها است که در اینجا شرح داده شده است: http://www.cygwin.com/ml/cygwin/2004-09/msg01101.html
استفاده از 'auto-import' عموماً «بدون مشکل کار خواهد کرد» -- اما گاهی اوقات ممکن است این پیام را مشاهده کنید:
"variable '<var>' can't be auto-imported. Please read the documentation for ld's "--enable-auto-import" for details."
این پیام زمانی ظاهر میشود که یک (زیر)عبارت به نشانیای دسترسی یابد که در نهایت حاصل جمع دو مقدار ثابت است (جدولهای وارداتی Win32 تنها یکی را مجاز میدانند). مواردی که این وضعیت ممکن است در آنها رخ دهد شامل دسترسی به فیلدهای عضو متغیرهای ساختاری (struct) واردشده از یک DLL، و همچنین استفاده از یک اندیس ثابت درون یک متغیر آرایهای واردشده از یک DLL است. هر متغیر چندکلمهای (آرایهها، structها، long long و غیره) ممکن است این شرایط خطا را تحریک کند. با این حال، صرفنظر از نوع دادهٔ دقیق متغیر صادرشدهٔ ناسازگار، ld همواره آن را تشخیص داده، هشدار صادر میکند و خارج میشود.
صرفنظر از نوع دادهٔ متغیر صادرشده، روشهای متعددی برای رفع این مشکل وجود دارد:
یک روش، استفاده از سوییچ --enable-runtime-pseudo-reloc است. این گزینه وظیفهٔ تنظیم مراجع در کد کلاینت شما را به محیط زمان اجرا واگذار میکند؛ بنابراین این روش تنها زمانی کار میکند که محیط زمان اجرا از این قابلیت پشتیبانی نماید.
راهکار دوم این است که یکی از «ثابتها» اجباراً به یک متغیر تبدیل شود -- یعنی در زمان کامپایل ناشناخته و غیرقابل بهینهسازی باشد. برای آرایهها، دو احتمال وجود دارد: الف) متغیر کردن اندیسپذیر (نشانی آرایه)، یا ب) متغیر کردن اندیس «ثابت». بدین ترتیب: extern type extern_array[]; extern_array[1] --> { volatile type *t=extern_array; t[1] }
یا
extern type extern_array[]; extern_array[1] --> { volatile int t=1; extern_array[t] }برای ساختارها (و اکثر انواع دادههای چندکلمهای دیگر) تنها گزینه این است که خود ساختار (یا 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 پیوند داده خواهد شد، یا صرفاً در حال ساخت/پیوند به یک کتابخانه ایستا هستید. در هنگام انتخاب میان روشهای مختلف برای حل مشکل «آدرس مستقیم با آفست ثابت» ('direct address with constant offset')، باید کاربردهای معمول در دنیای واقعی را در نظر بگیرید:
اصلی:
--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 از DLLها، تلاشی برای پیوند پیچیدهٔ "_symbol" به "__imp__symbol" انجام نمیدهد. [این گزینه مختص پورتهای هدفگیرندهٔ PE در پیونددهنده است]
- --enable-runtime-pseudo-reloc
- اگر کُد شما حاوی عبارات توصیفشده در بخش --enable-auto-import باشد (یعنی واردسازیهای DATA از DLL با آفست غیرصفر)، این گزینه برداری از «بازمکانیهای کاذب زمان اجرا» ('runtime pseudo relocations') ایجاد میکند که میتواند توسط محیط زمان اجرا برای تنظیم ارجاعات به چنین دادههایی در کُد کلاینت شما استفاده شود. [این گزینه مختص پورتهای هدفگیرندهٔ PE در پیونددهنده است]
- --disable-runtime-pseudo-reloc
- برای واردسازیهای DATA با آفست غیرصفر از DLLها، بازمکانیهای کاذب ایجاد نمیکند. [این گزینه مختص پورتهای هدفگیرندهٔ PE در پیونددهنده است]
- --enable-extra-pe-debug
- اطلاعات اشکالزدایی اضافی مربوط به thunking نمادهای auto-import را نمایش میدهد. [این گزینه مختص پورتهای هدفگیرندهٔ PE در پیونددهنده است]
- --section-alignment
- تراز بخش (section alignment) را تنظیم میکند. بخشها در حافظه همیشه در آدرسهایی آغاز میشوند که مضربی از این عدد باشند. مقدار پیشفرض 0x1000 است. [این گزینه مختص پورتهای هدفگیرندهٔ PE در پیونددهنده است]
- --stack reserve
- --stack reserve,commit
- تعداد بایتهای حافظه را برای رزرو (و در صورت تمایل تخصیص یا commit) جهت استفاده به عنوان پشته (stack) برای این برنامه مشخص میکند. پیشفرض 2MB رزروشده و 4K تخصیصیافته است. [این گزینه مختص پورتهای هدفگیرندهٔ PE در پیونددهنده است]
- --subsystem which
- --subsystem which:major
- --subsystem which:major.minor
- زیرسیستمی
را که
برنامهٔ
شما تحت آن
اجرا خواهد
شد مشخص
میکند.
مقادیر
مجاز برای
which عبارتند
از: "native"،
"windows"،
"console"،
"posix" و
"xbox".
همچنین
میتوانید
نسخهٔ
زیرسیستم
را نیز
بهصورت
اختیاری
تنظیم کنید.
مقادیر
عددی نیز
برای which
پذیرفته
میشوند.
[این گزینه
مختص
پورتهای
هدفگیرندهٔ
PE در
پیونددهنده
است]
گزینههای زیر پرچمهایی را در فیلد "DllCharacteristics" در سرایند فایل PE تنظیم میکنند: [این گزینهها مختص پورتهای هدفگیرندهٔ PE در پیونددهنده هستند]
- --high-entropy-va
- --disable-high-entropy-va
- تصویر با
تصادفیسازی
چیدمان
فضای آدرس (ASLR)
۶۴ بیتی
سازگار است.
این گزینه
بهطور
پیشفرض
برای
تصاویر PE ۶۴
بیتی در
اهداف MinGW
فعال است.
این گزینه همچنین مستلزم --dynamicbase و --enable-reloc-section است. [این گزینه مختص پورتهای هدفگیرندهٔ PE ۶۴ بیتی در پیونددهنده است]
- --dynamicbase
- --disable-dynamicbase
- آدرس پایهٔ تصویر ممکن است با استفاده از تصادفیسازی چیدمان فضای آدرس (ASLR) بازمکانی شود. این قابلیت در MS Windows Vista معرفی شد. این گزینه بهطور پیشفرض برای اهداف MinGW فعال است اما میتواند از طریق گزینهٔ --disable-dynamicbase غیرفعال شود. این گزینه همچنین مستلزم --enable-reloc-section است.
- --forceinteg
- --disable-forceinteg
- بررسیهای یکپارچگی کُد را اجباری میکند. این گزینه بهطور پیشفرض غیرفعال است.
- --nxcompat
- --disable-nxcompat
- تصویر با قابلیت جلوگیری از اجرای دادهها (Data Execution Prevention) سازگار است. این قابلیت در MS Windows XP SP2 معرفی شد. این گزینه بهطور پیشفرض برای اهداف MinGW فعال است..IP --no-isolation 4
- --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 سازگار است (Terminal Server aware). این گزینه بهطور پیشفرض غیرفعال است.
- --insert-timestamp
- --no-insert-timestamp
- یک برچسب
زمانی
واقعی در
تصویر درج
میکند. این
رفتار
پیشفرض
است زیرا با
کدهای
قدیمی
سازگاری
دارد و به
این معنی
است که
تصویر با
دیگر
ابزارهای
اختصاصی
کار خواهد
کرد. مشکل
این
پیشفرض آن
است که با
هر بار
پیوند دادن
سورسهای
یکسان،
تصاویر
اندکی
متفاوت
تولید
میشوند.
گزینهٔ
--no-insert-timestamp
میتواند
برای درج
مقدار صفر
در برچسب
زمانی
استفاده
شود تا
تضمین شود
که
باینریهای
تولیدشده
از
سورسهای
یکسان،
کاملاً
یکسان
مقایسه
میشوند.
اگر --insert-timestamp فعال باشد، زمان درجشده یا زمانی است که پیونددهی انجام میشود یا در صورت تعریف متغیر محیطی "SOURCE_DATE_EPOCH"، تعداد ثانیههای سپریشده از مبدأ زمانی یونیکس (Unix epoch) طبق آنچه آن متغیر مشخص کرده خواهد بود.
- --enable-reloc-section
- --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 را در اطلاعات بازگشایی فریم غیرفعال میکند.
- --branch-stub
- این گزینه با درج بخشهای استاب انشعاب (branch stub) در زمان نیاز جهت گسترش دامنهٔ انشعابها، تعدیل انشعاب (branch relaxation) پیونددهنده را فعال میکند. این گزینه معمولاً لازم نیست زیرا C-SKY از دستورالعملهای پرش و فراخوانی (branch and call) پشتیبانی میکند که میتوانند به کل محدودهٔ حافظه دسترسی داشته باشند و تعدیل انشعاب معمولاً توسط کامپایلر یا اسمبلر مدیریت میشود.
- --stub-group-size=N
- این گزینه امکان کنترل دقیقتر ایجاد استابهای انشعاب پیونددهنده را فراهم میآورد. این گزینه حداکثر اندازهٔ گروهی از بخشهای ورودی را که میتواند توسط یک بخش استاب مدیریت شود، تعیین میکند. مقدار منفی برای N بخشهای استاب را پس از انشعابهایشان قرار میدهد، در حالی که مقدار مثبت اجازه میدهد بخشهای استاب قبل یا بعد از انشعابها ظاهر شوند. مقادیر 1 یا -1 نشان میدهند که پیونددهنده باید پیشفرضهای مناسب را برگزیند.
پیونددهندههای 68HC11 و 68HC12 از گزینههای ویژهای برای کنترل نگاشت تعویض بانک حافظه و تولید کد ترامپولین پشتیبانی میکنند.
- --no-trampoline
- این گزینه تولید ترامپولین را غیرفعال میکند. بهطور پیشفرض، برای هر تابع دور (far function) که با استفاده از دستورالعمل "jsr" فراخوانی شود، یک ترامپولین تولید میشود (این حالت زمانی رخ میدهد که اشارهگری به یک تابع دور گرفته شود).
- --bank-window name
- این گزینه نام ناحیهٔ حافظه در مشخصات MEMORY را که پنجرهٔ بانک حافظه را توصیف میکند، به پیونددهنده مشخص میسازد. تعریف چنین ناحیهای سپس توسط پیونددهنده برای محاسبهٔ صفحهبندی و آدرسها درون پنجرهٔ حافظه استفاده میشود.
گزینههای زیر برای کنترل نحوهٔ مدیریت تولید GOT هنگام پیوندزدن برای مقصدهای 68K پشتیبانی میشوند.
- --got=type
- این گزینه به پیونددهنده اعلام میکند که از کدام طرح تولید GOT استفاده کند. type باید یکی از موارد single، negative، multigot یا target باشد. برای اطلاعات بیشتر به مدخل Info برای ld مراجعه کنید.
گزینههای زیر برای کنترل تولید دستورالعملهای microMIPS و بررسیهای بازنشانی انشعاب برای گذارهای حالت ISA هنگام پیوندزدن برای مقصدهای MIPS پشتیبانی میشوند.
- --insn32
- --no-insn32
- این گزینهها انتخاب دستورالعملهای microMIPS استفادهشده در کدهای تولیدشده توسط پیونددهنده را کنترل میکنند؛ مانند آنچه در PLT یا استابهای مقیدسازی تنبل (lazy binding stubs) یا در تعدیل (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
- این گزینهها تولید دستورالعملهای فشرده توسط پیونددهنده در مدخلهای PLT را برای MIPS R6 کنترل میکنند.
برای مقصد pdp11-aout، سه گونه از قالب خروجی را میتوان با گزینههای زیر انتخاب و تولید کرد. گونهٔ پیشفرض برای pdp11-aout گزینهٔ --omagic است، در حالی که برای سایر مقصدها --nmagic پیشفرض است. گزینهٔ --imagic تنها برای مقصد pdp11-aout تعریف شده است، در حالی که سایر گزینهها به گونهای که برای مقصد pdp11-aout اعمال میشوند در اینجا شرح داده شدهاند.
- -N
- --omagic
- خروجی را در سرایند a.out بهعنوان "OMAGIC" (0407) نشانهگذاری میکند تا نشان دهد که قطعهٔ کد (text segment) نباید در برابر نوشتن محافظت شود و نباید اشتراکی باشد. از آنجا که هر دو بخش text و data هم قابل خواندن و هم قابل نوشتن هستند، بخش داده بلافاصله و بهصورت متوالی پس از قطعهٔ کد تخصیص داده میشود. این قدیمیترین قالب برای برنامههای اجرایی PDP11 است و از ابتدا تا 2.11BSD در سیستمهای PDP11 Unix برای ld پیشفرض بوده است..IP -n 4
- --nmagic
- خروجی را در سرآیند a.out به صورت "NMAGIC" (0410) علامتگذاری میکند تا نشان دهد زمانی که فایل خروجی اجرا میشود، بخش کد (text) فقطخواندنی بوده و میان تمام فرایندهایی که همان فایل را اجرا میکنند قابل اشتراکگذاری خواهد بود. این شامل انتقال ناحیههای داده به اولین مرز صفحهٔ ۸ کیلوبایتی ممکن پس از پایان کد است. این گزینه یک قالب pure executable (اجرایی ناب) ایجاد میکند.
- -z
- --imagic
- خروجی را در سرآیند a.out به صورت "IMAGIC" (0411) علامتگذاری میکند تا نشان دهد زمانی که فایل خروجی اجرا میشود، بخشهای کد برنامه و داده با استفاده از قابلیت فضای مجزای دستورالعمل و داده در واحد مدیریت حافظه (MMU) مدلهای بزرگتر PDP11، در فضاهای آدرس جداگانه بارگذاری خواهند شد. این امر فضای آدرس در دسترس برنامه را دو برابر میکند. قطعهٔ کد دوباره ناب (pure)، محافظتشده در برابر نوشتن و قابل اشتراکگذاری است. تنها تفاوت در قالب خروجی بین این گزینه و سایر گزینهها، علاوه بر عدد جادویی، این است که هر دو بخش کد و داده از مکان 0 شروع میشوند. گزینهٔ -z این قالب را در 2.11BSD انتخاب میکرد. این گزینه یک قالب separate executable (اجرایی مجزا) ایجاد میکند.
- --no-omagic
- برای pdp11-aout معادل --nmagic است.
محیط (ENVIRONMENT)
میتوانید رفتار ld را با متغیرهای محیطی "GNUTARGET"، "LDEMULATION" و "COLLECT_NO_DEMANGLE" تغییر دهید.
"GNUTARGET" قالب شیء فایل ورودی را در صورتی که از -b (یا معادل آن --format) استفاده نکنید، تعیین میکند. مقدار آن باید یکی از نامهای BFD برای یک قالب ورودی باشد. اگر هیچ "GNUTARGET" در محیط وجود نداشته باشد، ld از قالب طبیعی هدف استفاده میکند. اگر "GNUTARGET" روی "default" تنظیم شده باشد، BFD تلاش میکند با بررسی فایلهای باینری ورودی، قالب ورودی را شناسایی کند؛ این روش معمولاً موفقیتآمیز است، اما ابهامات بالقوهای وجود دارد، چرا که هیچ روشی برای اطمینان از یکتا بودن عدد جادویی مورد استفاده برای تعیین قالبهای فایل شیء وجود ندارد. با این حال، رویهٔ پیکربندی برای BFD در هر سیستم، قالب مرسوم آن سیستم را در ابتدای فهرست جستجو قرار میدهد، بنابراین ابهامات به نفع شیوهٔ مرسوم برطرف میشوند.
"LDEMULATION" شبیهسازی پیشفرض را در صورتی که از گزینهٔ -m استفاده نکنید تعیین میکند. این شبیهسازی میتواند جنبههای مختلفی از رفتار پیونددهنده، بهویژه اسکریپت پیونددهندهٔ پیشفرض را تحت تأثیر قرار دهد. میتوانید شبیهسازیهای موجود را با گزینههای --verbose یا -V فهرست کنید. اگر گزینهٔ -m استفاده نشود، و متغیر محیطی "LDEMULATION" تعریف نشده باشد، شبیهسازی پیشفرض بستگی به نحوهٔ پیکربندی پیونددهنده خواهد داشت.
بهطور معمول، پیونددهنده بهطور پیشفرض نمادها را رمزگشایی (demangle) میکند. با این حال، اگر "COLLECT_NO_DEMANGLE" در محیط تنظیم شده باشد، پیشفرض آن عدم رمزگشایی نمادها خواهد بود. این متغیر محیطی به روش مشابهی توسط برنامهٔ لفاف پیونددهندهٔ "gcc" استفاده میشود. این پیشفرض میتواند با گزینههای --demangle و --no-demangle لغو (override) شود.
اگر گزینهٔ خاص PE/COFF یعنی --insert-timestamp فعال باشد و متغیر محیطی SOURCE_DATE_EPOCH تعریف شده باشد، مقدار برچسب زمانی در این متغیر به جای زمان فعلی در سرآیند COFF درج خواهد شد.
اگر متغیر محیطی "LD_STATS" تعریف شده باشد، اطلاعات استفاده از منابع پیونددهنده ثبت خواهد شد، درست مانند اینکه از گزینهٔ --stats استفاده شده باشد. اگر متغیر "LD_STATS" یک مقدار رشتهای داشته باشد، از آن به عنوان نام فایلی که اطلاعات باید در آن ذخیره شود استفاده خواهد شد. در غیر این صورت اطلاعات به جریان خروجی استاندارد ارسال خواهد شد.
همچنین ببینید (SEE ALSO)
ar(1)، nm(1)، objcopy(1)، objdump(1)، readelf(1) و مدخلهای Info برای binutils و ld..SH "کپیرایت و تکثیر (COPYRIGHT)" حق نشر (c) 1991-2026 متعلق به Free Software Foundation, Inc. است.
اجازهٔ کپی، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نسخهٔ 1.3 یا هر نسخهٔ جدیدتر منتشرشده توسط Free Software Foundation اعطا میشود؛ بدون بخشهای تغییرناپذیر (Invariant Sections)، بدون متون روی جلد (Front-Cover Texts)، و بدون متون پشت جلد (Back-Cover Texts). نسخهای از این مجوز در بخشی تحت عنوان «GNU Free Documentation License» گنجانده شده است.
| 2026-07-26 | binutils-2.47 |