| LD(1) | GNU Development Tools | LD(1) |
نام (NAME)
ld - پیونددهنده گنو
خلاصه دستور (SYNOPSIS)
ld [options] objfile ...
توضیحات (DESCRIPTION)
ld تعدادی از فایلهای شیء و بایگانی (archive) را ترکیب کرده، دادههای آنها را بازنشانی (relocate) میکند و ارجاعات نمادها را پیوند میدهد. معمولاً آخرین مرحله در کامپایل یک برنامه، اجرای ld است.
ld فایلهای «زبان فرمان پیونددهنده» (Linker Command Language) را که در یک فرامجموعه از نحو Link Editor Command Language متعلق به AT&T نوشته شدهاند میپذیرد تا کنترلی صریح و کامل بر فرایند پیونددهی فراهم کند.
این صفحهٔ راهنما زبان فرمان را شرح نمیدهد؛ برای جزئیات کامل پیرامون زبان فرمان و دیگر جنبههای پیونددهنده گنو، مدخل ld را در "info" مشاهده کنید.
این نسخه از ld از کتابخانههای چندمنظورهٔ BFD برای کار بر روی فایلهای شیء استفاده میکند. این امر به ld اجازه میدهد تا فایلهای شیء را در قالبهای مختلف بسیار---برای مثال COFF یا "a.out"---بخواند، ترکیب کند و بنویسد. قالبهای مختلف میتوانند به یکدیگر پیوند داده شوند تا هر نوع فایل شیء موجودی را تولید کنند.
پیونددهنده گنو گذشته از انعطافپذیریاش، در ارائه اطلاعات تشخیصی بسیار مفیدتر از سایر پیونددهندهها عمل میکند. بسیاری از پیونددهندهها بهمحض مواجهه با خطا فوراً اجرا را متوقف میکنند؛ اما در صورت امکان، ld به اجرا ادامه میدهد و به شما اجازه میدهد خطاهای دیگر را نیز شناسایی کنید (یا در برخی موارد، با وجود خطا به یک فایل خروجی دست یابید).
پیونددهنده گنو ld برای پوشش دادن طیف گستردهای از شرایط و تا حد ممکن سازگار بودن با سایر پیونددهندهها طراحی شده است. در نتیجه، شما گزینههای بسیاری برای کنترل رفتار آن در اختیار دارید..SH "گزینهها (OPTIONS)" پیونددهنده از انبوهی از گزینههای خط فرمان پشتیبانی میکند، اما در عمل تنها تعداد اندکی از آنها در هر زمینهٔ خاص به کار میروند. برای نمونه، یک کاربرد متداول ld، پیوند دادن فایلهای شیء استاندارد Unix بر روی یک سیستم Unix استاندارد و پشتیبانیشده است. در چنین سیستمی، برای پیوند دادن فایل "hello.o":
ld -o <output> /lib/crt0.o hello.o -lc
این دستور به ld میگوید که فایلی به نام output را در نتیجهٔ پیوند دادن فایل "/lib/crt0.o" با "hello.o" و کتابخانهٔ "libc.a" (که از دایرکتوریهای جستجوی استاندارد دریافت میشود) تولید کند. (توضیحات مربوط به گزینهٔ -l را در ادامه ببینید.)
برخی از گزینههای خط فرمان ld را میتوان در هر کجای خط فرمان مشخص کرد. با این حال، گزینههایی که به فایلها اشاره دارند، مانند -l یا -T، باعث میشوند که فایل نسبت به فایلهای شیء و سایر گزینههای مربوط به فایل، دقیقاً در همان نقطهای که گزینه در خط فرمان ظاهر میشود خوانده شود. تکرار گزینههای غیرفایلی با آرگومانهای متفاوت، یا اثری نخواهد داشت و یا موارد پیشین آن گزینه را (آنهایی که در سمت چپتر خط فرمان قرار دارند) بازنویسی میکند. گزینههایی که مشخص کردن چندبارهٔ آنها معنادار است، در توضیحات زیر ذکر شدهاند.
آرگومانهای غیرگزینهای فایلهای شیء یا آرشیوهایی هستند که باید به یکدیگر پیوند داده شوند. این آرگومانها میتوانند پس از گزینههای خط فرمان، پیش از آنها یا در میان آنها قرار گیرند، به جز اینکه یک آرگومان فایل شیء نمیتواند بین یک گزینه و آرگومان آن قرار داده شود.
معمولاً پیونددهنده با حداقل یک فایل شیء فراخوانی میشود، اما میتوانید اشکال دیگر فایلهای ورودی باینری را نیز با استفاده از -l، -R و زبان دستور اسکریپت مشخص کنید. اگر در کل هیچ فایل ورودی باینری مشخص نشده باشد، پیونددهنده هیچ خروجیای تولید نمیکند و پیام No input files را صادر مینماید.
اگر پیونددهنده نتواند قالب یک فایل شیء را تشخیص دهد، فرض خواهد کرد که آن یک اسکریپت پیونددهنده است. اسکریپتی که به این روش مشخص شود، اسکریپت اصلی پیونددهنده را که برای پیوند به کار میرود (خواه اسکریپت پیشفرض پیونددهنده باشد و خواه اسکریپت مشخصشده با استفاده از -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" شامل فهرستی جداشده با دونقطه از رابطهای حسابرسی برای استفاده خواهد بود. اگر پیونددهنده هنگام جستجوی کتابخانههای اشتراکی به شیئی با یک مدخل حسابرسی برخورد کند، یک مدخل متناظر "DT_DEPAUDIT" در فایل خروجی اضافه خواهد کرد. این گزینه تنها بر روی بسترهای ELF که از رابط rtld-audit پشتیبانی میکنند معنی دارد.
- -b input-format
- --format=input-format
- برنامهٔ ld
ممکن است
طوری
پیکربندی
شده باشد که
از بیش از
یک نوع فایل
شیء
پشتیبانی
کند. اگر ld
شما به این
صورت
پیکربندی
شده باشد،
میتوانید
از گزینهٔ
-b برای
تعیین قالب
باینریِ
فایلهای
شیء ورودی
که در خط
فرمان پس از
این گزینه
میآیند،
استفاده
کنید. حتی
هنگامی که
ld برای
پشتیبانی
از
قالبهای
شیء
جایگزین
پیکربندی
شده است،
معمولاً
نیازی به
مشخص کردن
آن ندارید،
زیرا ld
باید طوری
پیکربندی
شده باشد که
رایجترین
قالب را در
هر ماشین به
عنوان قالب
ورودی
پیشفرض
انتظار
داشته باشد.
input-format یک
رشتهٔ متنی
است؛ نام
قالبی مشخص
که
کتابخانههای
BFD از آن
پشتیبانی
میکنند.
(میتوانید
قالبهای
باینری
موجود را با
دستور objdump -i
فهرست
کنید.)
اگر فایلهایی با یک قالب باینری غیرمعمول را پیوند میدهید، ممکن است بخواهید از این گزینه استفاده کنید. همچنین میتوانید با قرار دادن -b input-format پیش از هر گروه از فایلهای شیء با یک قالب خاص، از -b برای تغییر صریح قالبها (هنگام پیوند دادن فایلهای شیء با قالبهای مختلف) استفاده کنید.
قالب پیشفرض از متغیر محیطی "GNUTARGET" گرفته میشود.
شما همچنین میتوانید با استفاده از دستور "TARGET"، قالب ورودی را از داخل یک اسکریپت تعریف کنید؛
- -c MRI-commandfile
- --mri-script=MRI-commandfile
- برای سازگاری با پیونددهندههای تولیدشده توسط MRI، برنامهٔ ld فایلهای اسکریپت نوشتهشده به یک زبان دستوری جایگزین و محدود را میپذیرد که در بخش اسکریپتهای سازگار با MRI (MRI Compatible Script Files) از مستندات GNU ld شرح داده شده است. فایلهای اسکریپت MRI را با گزینهٔ -c معرفی کنید؛ برای اجرای اسکریپتهای پیونددهندهای که به زبان اسکریپتنویسی عمومی ld نوشته شدهاند از گزینهٔ -T استفاده نمایید. اگر MRI-cmdfile وجود نداشته باشد، ld آن را در دایرکتوریهای مشخصشده توسط گزینههای -L جستجو میکند.
- -d
- -dc
- -dp
- این سه گزینه معادل یکدیگرند؛ شکلهای متعددی برای سازگاری با سایر پیونددهندهها پشتیبانی میشوند. آنها حتی در صورتی که یک فایل خروجی قابلبازنشانی (relocatable) مشخص شده باشد (با -r)، فضا را به نمادهای مشترک تخصیص میدهند. دستور اسکریپت "FORCE_COMMON_ALLOCATION" نیز تأثیر یکسانی دارد.
- --depaudit AUDITLIB
- -P AUDITLIB
- افزودن AUDITLIB به مدخل "DT_DEPAUDIT" در بخش پویا (dynamic section). وجود AUDITLIB بررسی نمیشود، و از DT_SONAME مشخصشده در کتابخانه نیز استفاده نخواهد کرد. اگر چندین بار مشخص شود، "DT_DEPAUDIT" حاوی فهرستی از رابطهای حسابرسی جدا شده با دونقطه خواهد بود. این گزینه فقط در سکوهای ELF که از رابط rtld-audit پشتیبانی میکنند معنی دارد. گزینهٔ -P برای سازگاری با Solaris ارائه شده است.
- --enable-linker-version
- دستورالعمل
اسکریپت
پیونددهندهٔ
"LINKER_VERSION" را
که در Output Section Data
توضیح داده
شده است،
فعال
میکند. اگر
این
دستورالعمل
در یک
اسکریپت
پیونددهنده
استفاده
شود و این
گزینه فعال
شده باشد،
رشتهای
حاوی نسخهٔ
پیونددهنده
در نقطهٔ
فعلی درج
خواهد شد.
نکته - مکان این گزینه در خط فرمان پیونددهنده دارای اهمیت است. این گزینه تنها بر اسکریپتهای پیونددهندهای تأثیر میگذارد که پس از آن در خط فرمان بیایند، یا درون پیونددهنده تعبیه شده باشند.
- --disable-linker-version
- دستورالعمل اسکریپت پیونددهندهٔ "LINKER_VERSION" را غیرفعال میکند تا رشتهٔ نسخه را درج نکند. این حالت پیشفرض است.
- --enable-non-contiguous-regions
- این گزینه
از ایجاد
خطا در
صورتی که یک
بخش ورودی
در یک بخش
خروجی
منطبق جا
نشود،
جلوگیری
میکند.
پیونددهنده
تلاش
میکند تا
بخش ورودی
را به
بخشهای
خروجی
منطبق بعدی
تخصیص دهد و
تنها در
صورتی خطا
ایجاد
میکند که
هیچ بخش
خروجی به
اندازهٔ
کافی بزرگ
نباشد. این
قابلیت
زمانی مفید
است که
چندین
ناحیهٔ
حافظهٔ
غیرپیوسته
در دسترس
باشند و بخش
ورودی به
ناحیهٔ
خاصی نیاز
نداشته
باشد.
ترتیبی که
بخشهای
ورودی
ارزیابی
میشوند
تغییر
نمیکند،
برای مثال:
MEMORY { MEM1 (rwx) : ORIGIN = 0x1000, LENGTH = 0x14 MEM2 (rwx) : ORIGIN = 0x1000, LENGTH = 0x40 MEM3 (rwx) : ORIGIN = 0x2000, LENGTH = 0x40 } SECTIONS { mem1 : { *(.data.*); } > MEM1 mem2 : { *(.data.*); } > MEM2 mem3 : { *(.data.*); } > MEM3 } with input sections: .data.1: size 8 .data.2: size 0x10 .data.3: size 4 results in .data.1 affected to mem1, and .data.2 and .data.3 affected to mem2, even though .data.3 would fit in mem3.این گزینه با دستورهای INSERT ناسازگار است زیرا نحوهٔ نگاشت بخشهای ورودی به بخشهای خروجی را تغییر میدهد.
- --enable-non-contiguous-regions-warnings
- این گزینه هشدارها را هنگامی فعال میکند که "--enable-non-contiguous-regions" تطابقهای احتمالاً غیرمنتظرهای را در نگاشت بخشها مجاز میداند، که میتواند به جای شکست خوردن به دلیل جا نشدن در هیچ ناحیهٔ خروجی، بهطور بالقوه به دور انداختن بیسروصدای یک بخش منجر شود.
- -e entry
- --entry=entry
- استفاده از entry به عنوان نماد صریح برای شروع اجرای برنامهٔ شما، به جای نقطهٔ ورود پیشفرض. اگر هیچ نمادی با نام entry وجود نداشته باشد، پیونددهنده تلاش میکند entry را به عنوان یک عدد تجزیه کرده و از آن به عنوان نشانی ورود استفاده کند (عدد در مبنای ۱۰ تفسیر خواهد شد؛ میتوانید از 0x در ابتدا برای مبنای ۱۶ یا از یک 0 در ابتدا برای مبنای ۸ استفاده کنید). برای i386 PE، نماد entry همچنین میتواند نام اصلی تابع باشد (در صورت وجود، بدون زیرخط ابتدایی و/یا پسوند stdcall یعنی @number).
- --exclude-libs lib,lib,...
- فهرستی از کتابخانههای آرشیو را مشخص میکند که نمادهای آنها نباید بهطور خودکار صادر شوند. نامهای کتابخانهها را میتوان با کاما یا دونقطه جدا کرد. مشخص کردن "--exclude-libs ALL" نمادهای موجود در تمام کتابخانههای آرشیو را از صدور خودکار مستثنی میکند. این گزینه فقط برای پورت هدف i386 PE پیونددهنده و برای پورتهای هدف ELF در دسترس است. برای i386 PE، نمادهایی که صراحتاً در یک فایل .def فهرست شدهاند، صرفنظر از این گزینه همچنان صادر میشوند. برای پورتهای هدف ELF، با نمادهای متأثر از این گزینه به عنوان پنهان (hidden) رفتار خواهد شد.
- --exclude-modules-for-implib module,module,...
- فهرستی از فایلهای شیء یا اعضای آرشیو را مشخص میکند که نمادهای آنها نباید بهطور خودکار صادر شوند، اما باید بهطور کامل در کتابخانهٔ وارداتی (import library) که در طول پیوند تولید میشود کپی شوند. نام پودمانها را میتوان با کاما یا دونقطه جدا کرد و باید دقیقاً با نام فایلهای استفاده شده توسط ld برای باز کردن فایلها مطابقت داشته باشد؛ برای اعضای آرشیو، این صرفاً نام عضو است، اما برای فایلهای شیء، نام فهرستشده باید دقیقاً شامل هر مسیری باشد که برای مشخص کردن فایل ورودی در خط فرمان پیونددهنده استفاده شده است. این گزینه فقط برای پورت هدف i386 PE پیونددهنده در دسترس است. نمادهایی که صراحتاً در یک فایل .def فهرست شدهاند، صرفنظر از این گزینه همچنان صادر میشوند.
- -E
- --export-dynamic
- --no-export-dynamic
- هنگام ساخت
یک فایل
اجرایی با
پیوند
پویا،
استفاده از
گزینهٔ -E
یا گزینهٔ
--export-dynamic باعث
میشود
پیونددهنده
تمام
نمادها را
به جدول
نمادهای
پویا اضافه
کند. جدول
نمادهای
پویا
مجموعهای
از نمادها
است که در
زمان اجرا
از اشیاء
پویا قابل
مشاهده
هستند.
اگر از هیچیک از این گزینهها استفاده نکنید (یا از گزینهٔ --no-export-dynamic برای بازگرداندن رفتار پیشفرض استفاده کنید)، جدول نمادهای پویا معمولاً فقط حاوی آن دسته از نمادهایی خواهد بود که توسط شیء پویای مشخصشدهای در پیوند ارجاع داده شده باشند.
اگر از "dlopen" برای بارگذاری یک شیء پویا استفاده میکنید که به جای یک شیء پویای دیگر، نیاز به ارجاع به نمادهای تعریفشده توسط برنامه دارد، احتمالاً هنگام پیوند دادن خود برنامه باید از این گزینه استفاده کنید.
همچنین در صورتی که قالب خروجی از آن پشتیبانی کند، میتوانید از فهرست پویا برای کنترل نمادهایی که باید به جدول نمادهای پویا اضافه شوند استفاده کنید. توضیحات --dynamic-list را ببینید.
توجه داشته باشید که این گزینه مختص پورتهای هدف ELF است. هدفهای PE از عملکردی مشابه برای صادر کردن تمام نمادها از یک DLL یا EXE پشتیبانی میکنند؛ توضیحات --export-all-symbols را در زیر ببینید.
- --export-dynamic-symbol=glob
- هنگام ساخت یک فایل اجرایی با پیوند پویا، نمادهای منطبق با glob به جدول نمادهای پویا اضافه خواهند شد. هنگام ساخت یک کتابخانهٔ اشتراکی، ارجاعات به نمادهای منطبق با glob به تعاریف موجود در کتابخانهٔ اشتراکی مقید نخواهند شد. این گزینه هنگام ساخت یک کتابخانهٔ اشتراکی و در صورتی که -Bsymbolic یا --dynamic-list مشخص نشده باشند، بیاثر است. این گزینه فقط در سکوهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنی دارد.
- --export-dynamic-symbol-list=file
- برای هر الگو در فایل، یک --export-dynamic-symbol مشخص میکند. قالب فایل همانند گرهٔ نسخه بدون حوزه (scope) و نام گره است. برای اطلاعات بیشتر VERSION را ببینید.
- -EB
- پیوند دادن اشیاء big-endian. این امر بر قالب پیشفرض خروجی تأثیر میگذارد.
- -EL
- پیوند دادن اشیاء little-endian. این امر بر قالب پیشفرض خروجی تأثیر میگذارد.
- -f name
- --auxiliary=name
- هنگام ساخت
یک شیء
اشتراکی ELF،
فیلد داخلی
DT_AUXILIARY را روی
نام
مشخصشده
تنظیم
میکند. این
کار به
پیونددهندهٔ
پویا اعلام
میکند که
جدول
نمادهای
شیء
اشتراکی
باید به
عنوان یک
پالایهٔ
کمکی بر روی
جدول
نمادهای
شیء
اشتراکی name
استفاده
شود.
اگر بعداً برنامهای را با این شیء پالایه پیوند دهید، هنگام اجرای برنامه، پیونددهندهٔ پویا فیلد DT_AUXILIARY را خواهد دید. اگر پیونددهندهٔ پویا هر نمادی را از شیء پالایه حل کند، ابتدا بررسی میکند که آیا تعریفی در شیء اشتراکی name وجود دارد یا خیر. اگر تعریفی وجود داشته باشد، به جای تعریف موجود در شیء پالایه استفاده خواهد شد. لزومی ندارد شیء اشتراکی name وجود داشته باشد. بنابراین شیء اشتراکی name میتواند برای ارائهٔ یک پیادهسازی جایگزین از عملکردهای خاص، احتمالاً برای اشکالزدایی یا کارایی ویژهٔ ماشین، استفاده شود.
این گزینه ممکن است بیش از یک بار مشخص شود. مدخلهای DT_AUXILIARY به ترتیبی که در خط فرمان ظاهر میشوند ایجاد خواهند شد.
- -F name
- --filter=name
- هنگام ساخت
یک شیء
اشتراکی ELF،
فیلد داخلی
DT_FILTER را روی
نام
مشخصشده
تنظیم
میکند. این
کار به
پیونددهندهٔ
پویا اعلام
میکند که
جدول
نمادهای
شیء
اشتراکی در
حال ساخت
باید به
عنوان یک
پالایه بر
روی جدول
نمادهای
شیء
اشتراکی name
استفاده
شود.
اگر بعداً برنامهای را با این شیء پالایه پیوند دهید، هنگام اجرای برنامه، پیونددهندهٔ پویا فیلد DT_FILTER را خواهد دید. پیونددهندهٔ پویا نمادها را طبق معمول بر اساس جدول نمادهای شیء پالایه حل میکند، اما در عمل به تعاریف موجود در شیء اشتراکی name پیوند خواهد خورد. بنابراین شیء پالایه میتواند برای انتخاب زیرمجموعهای از نمادهای ارائهشده توسط شیء name استفاده شود.
برخی از پیونددهندههای قدیمیتر از گزینهٔ -F در سرتاسر یک زنجیره ابزار کامپایل برای مشخص کردن قالب فایلهای شیء ورودی و خروجی استفاده میکردند. پیونددهندهٔ GNU از سازوکارهای دیگری برای این منظور استفاده میکند: گزینههای -b، --format، --oformat، دستور "TARGET" در اسکریپتهای پیونددهنده، و متغیر محیطی "GNUTARGET". پیونددهندهٔ GNU زمانی که در حال ساخت یک شیء اشتراکی ELF نباشد، گزینهٔ -F را نادیده خواهد گرفت..IP -fini=name 4 هنگام ساخت یک فایل اجرایی یا شیء مشترک ELF، با تنظیم DT_FINI بر روی نشانی تابع، نام name را در زمان تخلیه (unload) شدن فایل اجرایی یا شیء مشترک فراخوانی میکند. بهطور پیشفرض، پیونددهنده از "_fini" بهعنوان تابع مورد نظر برای فراخوانی استفاده میکند.
- -g
- نادیده گرفته میشود. جهت سازگاری با سایر ابزارها فراهم شده است.
- -G value
- --gpsize=value
- حداکثر اندازهٔ اشیایی را که قرار است با استفاده از ثبات GP بهینهسازی شوند، روی size تنظیم میکند. این گزینه فقط برای قالبهای فایل شیء نظیر 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 را مشخص میکند، صدق نمیکند.
پیونددهنده یک بایگانی را تنها یک بار و در همان مکانی که در خط فرمان مشخص شده است جستجو میکند. اگر بایگانی نمادی را تعریف کند که در یک فایل شیء قبل از بایگانی در خط فرمان تعریفنشده بود، پیونددهنده فایل(های) مربوطه را از بایگانی شامل خواهد کرد. با این حال، یک نماد تعریفنشده در یک فایل شیء که پس از آن در خط فرمان ظاهر میشود، باعث نخواهد شد که پیونددهنده مجدداً بایگانی را جستجو کند.
برای روشی جهت وادار کردن پیونددهنده به جستجوی چندبارهٔ بایگانیها، گزینهٔ -( را ببینید.
میتوانید یک بایگانی یکسان را چندین بار در خط فرمان فهرست کنید.
این نوع جستجوی بایگانی برای پیونددهندههای Unix استاندارد است. با این وجود، اگر از ld در AIX استفاده میکنید، توجه داشته باشید که این رفتار با پیونددهندهٔ AIX تفاوت دارد.
- -L searchdir
- --library-path=searchdir
- مسیر searchdir را
به فهرست
مسیرهایی
که ld برای
یافتن
کتابخانههای
بایگانی و
اسکریپتهای
کنترلی ld
جستجو
میکند،
اضافه
میکند.
میتوانید
از این
گزینه به هر
تعداد بار
استفاده
کنید.
دایرکتوریها
به ترتیبی
که در خط
فرمان مشخص
شدهاند
جستجو
میشوند.
دایرکتوریهای
مشخصشده
در خط
فرمان، قبل
از
دایرکتوریهای
پیشفرض
جستجو
میشوند.
تمام
گزینههای
-L، صرفنظر
از ترتیبی
که در آن
ظاهر
شدهاند،
بر تمام
گزینههای
-l اعمال
میشوند.
گزینههای
-L بر نحوهٔ
جستجوی ld
برای یک
اسکریپت
پیونددهنده
تأثیری
ندارند،
مگر اینکه
گزینهٔ -T
مشخص شده
باشد.
اگر searchdir با "=" یا $SYSROOT شروع شود، این پیشوند با sysroot prefix جایگزین خواهد شد، که توسط گزینهٔ --sysroot کنترل شده یا در زمان پیکربندی پیونددهنده تعیین میشود.
مجموعه مسیرهای پیشفرضی که جستجو میشوند (بدون اینکه با -L مشخص شده باشند) به حالت شبیهسازی که ld استفاده میکند، و در برخی موارد نیز به نحوهٔ پیکربندی آن بستگی دارد.
این مسیرها را میتوان در یک اسکریپت پیوند با دستور "SEARCH_DIR" نیز مشخص کرد. دایرکتوریهایی که به این شیوه مشخص میشوند، در همان نقطهای که اسکریپت پیونددهنده در خط فرمان ظاهر میشود، جستجو میشوند.
- -m emulation
- پیونددهندهٔ
emulation را
شبیهسازی
میکند.
میتوانید
شبیهسازیهای
موجود را با
گزینههای
--verbose یا -V
فهرست کنید.
اگر از گزینهٔ -m استفاده نشود، در صورت تعریف بودن متغیر محیطی "LDEMULATION"، شبیهسازی از آن گرفته میشود.
در غیر این صورت، شبیهسازی پیشفرض به نحوهٔ پیکربندی پیونددهنده بستگی خواهد داشت.
- --remap-inputs=pattern=filename
- --remap-inputs-file=file
- این
گزینهها
امکان
تغییر دادن
نام
فایلهای
ورودی را
پیش از
اقدام
پیونددهنده
به باز کردن
آنها
فراهم
میکنند.
گزینهٔ
--remap-inputs=foo.o=bar.o باعث
میشود هر
تلاشی برای
بارگذاری
فایلی با
نام foo.o، در
عوض تلاش
کند فایلی
با نام bar.o را
بارگذاری
نماید.
الگوهای
جانشین (wildcard)
در نام فایل
نخست مجاز
هستند؛
بنابراین
--remap-inputs=foo*.o=bar.o هر
فایل
ورودیِ
منطبق با foo*.o
را به bar.o
تغییر نام
میدهد.
شکل جایگزین این گزینه، --remap-inputs-file=filename، اجازه میدهد بازنگاشتها از یک فایل خوانده شوند. هر خط در فایل میتواند شامل یک بازنگاشت واحد باشد. خطوط خالی نادیده گرفته میشوند. هر چیزی از یک نویسهٔ هش (#) تا انتهای خط بهعنوان یک توضیح در نظر گرفته شده و نادیده گرفته میشود. الگوی نگاشت را میتوان با فاصله یا نویسهٔ مساوی (=) از نام فایل جدا کرد.
این گزینهها را میتوان چندین بار مشخص کرد. محتویات آنها انباشته میشوند. بازنگاشتها به ترتیبی که در خط فرمان ظاهر شدهاند پردازش خواهند شد، و اگر از یک فایل آمده باشند، به ترتیبی که در آن فایل قرار دارند. اگر تطابقی رخ دهد، هیچ بررسی بیشتری برای آن نام فایل انجام نخواهد شد.
اگر نام فایل جایگزین /dev/null یا صرفاً NUL باشد، بازنگاشت عملاً باعث نادیده گرفته شدن فایل ورودی خواهد شد. این میتواند راهکاری مناسب برای آزمودن حذف فایلهای ورودی از یک محیط ساخت پیچیده باشد.
توجه داشته باشید که این گزینه به موقعیت مکانی وابسته است و تنها بر نامفایلهایی اثر میگذارد که پس از آن در خط فرمان میآیند. بنابراین:
ld foo.o --remap-inputs=foo.o=bar.o
هیچ تأثیری نخواهد داشت، در حالی که:
ld --remap-inputs=foo.o=bar.o foo.o
نام فایل ورودی foo.o را به bar.o تغییر خواهد داد.
توجه - این گزینهها همچنین بر فایلهایی اثر میگذارند که توسط عبارتهای INPUT در اسکریپتهای پیونددهنده به آنها ارجاع داده شده است. اما از آنجا که اسکریپتهای پیونددهنده پس از خوانده شدن کل خط فرمان پردازش میشوند، موقعیت گزینههای بازنگاشت در خط فرمان اهمیتی ندارد.
اگر گزینهٔ verbose فعال باشد، هر نگاشتی که مطابقت یابد گزارش خواهد شد، اگرچه باز هم لازم است گزینهٔ verbose در خط فرمان قبل از اینکه نامفایلهای بازنگاشتشده ظاهر شوند فعال شده باشد.
اگر گزینههای -Map یا --print-map فعال باشند، فهرست بازنگاشت در خروجی نگاشت (map output) گنجانده خواهد شد.
- -M
- --print-map
- یک نقشهٔ پیوند (link map) را در خروجی استاندارد چاپ میکند. نقشهٔ پیوند اطلاعاتی دربارهٔ پیوند ارائه میدهد، شامل موارد زیر:
- نحوه تخصیص نمادهای عمومی (common symbols).
- تمامی اعضای آرشیو گنجاندهشده در پیوند، به همراه ذکر نمادی که سبب وارد شدن آن عضو آرشیو شده است.
- مقادیر
تخصیصیافته
به نمادها.
نکته - نمادهایی که مقدار آنها با عبارتی محاسبه میشود که شامل ارجاع به مقدار قبلی همان نماد است، ممکن است نتیجه درستی در نگاشت پیوند (link map) نمایش ندهند. این بدان دلیل است که پیونددهنده نتایج میانی را دور میاندازد و تنها مقدار نهایی یک عبارت را حفظ میکند. در چنین شرایطی، پیونددهنده مقدار نهایی را درون قلابها (کروشهها) نمایش خواهد داد. بنابراین به عنوان مثال یک اسکریپت پیونددهنده حاوی:
foo = 1 foo = foo * 4 foo = foo + 8
در صورت استفاده از گزینه -M، خروجی زیر را در نگاشت پیوند تولید خواهد کرد:
0x00000001 foo = 0x1 [0x0000000c] foo = (foo * 0x4) [0x0000000c] foo = (foo + 0x8)
برای اطلاعات بیشتر درباره عبارتها در اسکریپتهای پیونددهنده، Expressions را ببینید.
- نحوه ادغام
ویژگیهای
گنو (GNU properties).
هنگامی که پیونددهنده بخشهای ورودی .note.gnu.property را در یک بخش خروجی .note.gnu.property ادغام میکند، برخی از ویژگیها حذف یا بهروزرسانی میشوند. این اقدامات در نگاشت پیوند گزارش میشوند. برای مثال:
Removed property 0xc0000002 to merge foo.o (0x1) and bar.o (not found)
این نشان میدهد که ویژگی 0xc0000002 در هنگام ادغام ویژگیها در foo.o (که مقدار ویژگی 0xc0000002 آن برابر با 0x1 است) و bar.o (که ویژگی 0xc0000002 را ندارد)، از خروجی حذف شده است.
Updated property 0xc0010001 (0x1) to merge foo.o (0x1) and bar.o (0x1)
این نشان میدهد که مقدار ویژگی 0xc0010001 در خروجی هنگام ادغام ویژگیها در foo.o (که مقدار ویژگی 0xc0010001 آن 0x1 است) و bar.o (که مقدار ویژگی 0xc0010001 آن 0x1 است)، به 0x1 بهروزرسانی شده است.
- در برخی
مقصدهای ELF،
فهرستی از
تصحیحات (fixups)
درجشده
توسط --relax
foo.o: Adjusting branch at 0x00000008 towards "far" in section .text
این نشان میدهد که انشعاب در 0x00000008 در foo.o که نماد "far" را در بخش .text هدف قرار داده بود، با یک trampoline جایگزین شده است.
- --print-map-discarded
- --no-print-map-discarded
- چاپ کردن (یا چاپ نکردن) فهرست بخشهای دور ریختهشده و جمعآوریشده به عنوان زباله (garbage collected) در نگاشت پیوند. بهطور پیشفرض فعال است.
- --print-map-locals
- --no-print-map-locals
- چاپ کردن (یا چاپ نکردن) نمادهای محلی در نگاشت پیوند. پیش از نام نمادهای محلی متن (local) چاپ خواهد شد، و پس از تمام نمادهای سراسری در یک بخش معین فهرست میشوند. نمادهای محلی موقت (معمولاً نمادهایی که با .L شروع میشوند) در خروجی گنجانده نخواهند شد. بهطور پیشفرض غیرفعال است.
- -n
- --nmagic
- همترازی بخشها بر اساس صفحه (page alignment) را خاموش کرده و پیوند با کتابخانههای مشترک را غیرفعال میکند. اگر قالب خروجی از شمارههای جادویی به سبک یونیکس پشتیبانی کند، خروجی را به عنوان "NMAGIC" علامتگذاری میکند.
- -N
- --omagic
- بخشهای text و data را به صورت خواندنی و نوشتنی تنظیم میکند. همچنین، قطعه داده (data segment) را همتراز صفحه نمیکند، و پیوند با کتابخانههای مشترک را غیرفعال میسازد. اگر قالب خروجی از شمارههای جادویی به سبک یونیکس پشتیبانی کند، خروجی را به عنوان "OMAGIC" علامتگذاری میکند. نکته: اگرچه بخش text نوشتنی برای مقصدهای PE-COFF مجاز است، اما با مشخصات قالبی که توسط مایکروسافت منتشر شده است مطابقت ندارد.
- --no-omagic
- این گزینه بیشتر اثرات گزینه -N را خنثی میکند. این گزینه بخش text را فقطخواندنی میکند و قطعه داده را وادار به همترازی با صفحه مینماید. نکته - این گزینه پیوند با کتابخانههای مشترک را فعال نمیکند. برای این منظور از -Bdynamic استفاده کنید.
- -o output
- --output=output
- استفاده از
output به عنوان
نام
برنامهای
که توسط ld
تولید
میشود؛
اگر این
گزینه مشخص
نشود، نام
پیشفرض a.out
استفاده
خواهد شد.
دستور
اسکریپت
"OUTPUT" نیز
میتواند
نام فایل
خروجی را
مشخص کند.
نکته - پیونددهنده فایل خروجی را قبل از شروع نوشتن درون آن حذف خواهد کرد. این کار حتی اگر به دلیل بروز خطا پیوند کامل نشود نیز انجام خواهد شد.
نکته - پیونددهنده بررسی میکند تا مطمئن شود نام فایل خروجی با نام هیچیک از فایلهای ورودی یکسان نباشد، اما فقط همین. بهویژه، پیونددهنده اعتراضی نخواهد کرد اگر فایل خروجی موجب رونویسی روی یک فایل منبع یا فایل مهم دیگری شود. بنابراین در سیستمهای ساخت (build systems) توصیه میشود که از گزینه -o به عنوان آخرین گزینه در خط فرمان پیونددهنده استفاده شود. برای مثال در نظر بگیرید:
ld -o $(EXE) $(OBJS) ld $(OBJS) -o $(EXE)
اگر متغیر EXE به هر دلیلی تعریف نشده باشد، نگارش اول دستور پیونددهنده میتواند در نهایت منجر به حذف یکی از فایلهای شیء شود (اولین فایل در فهرست OBJS)، در حالی که نگارش دوم دستور پیونددهنده یک پیام خطا تولید خواهد کرد و چیزی را حذف نخواهد کرد.
- --dependency-file=depfile
- یک فایل وابستگی در depfile مینویسد. این فایل حاوی قاعدهای مناسب برای "make" است که فایل خروجی و تمامی فایلهای ورودی خواندهشده برای تولید آن را توصیف میکند. این خروجی مشابه خروجی کامپایلر با -M -MP است. توجه داشته باشید که گزینهای شبیه به -MM در کامپایلر برای مستثنی کردن «فایلهای سیستم» وجود ندارد (که بر خلاف «سرفایلهای سیستم» در کامپایلر، مفهوم دقیقی در پیونددهنده نیست). بنابراین خروجی --dependency-file همیشه مختص وضعیت دقیق نصب در سیستمی است که در آن تولید شده، و نباید بدون ویرایش دقیق در makefileهای توزیعشده کپی شود.
- -O level
- اگر level یک مقدار عددی بزرگتر از صفر باشد، ld خروجی را بهینهسازی میکند. این کار ممکن است بهمیزان قابل توجهی بیشتر طول بکشد و بنابراین احتمالاً باید فقط برای باینری نهایی فعال شود. در حال حاضر این گزینه فقط بر تولید کتابخانههای مشترک ELF تأثیر میگذارد. نگارشهای آینده پیونددهنده ممکن است استفاده بیشتری از این گزینه بکنند. همچنین هماکنون تفاوتی در رفتار پیونددهنده برای مقادیر مختلف غیرصفر این گزینه وجود ندارد. این مورد نیز ممکن است در نگارشهای آینده تغییر یابد.
- -plugin name
- بهکارگیری
یک افزونه
در فرایند
پیوند.
پارامتر name
نام فایل
مطلق (مسیر
کامل)
افزونه است.
معمولاً
این
پارامتر
هنگام
استفاده از
بهینهسازی
زمان پیوند
(LTO)، بهطور
خودکار
توسط
کامپایلر
اضافه
میشود،
اما
کاربران در
صورت تمایل
میتوانند
افزونههای
خود را نیز
اضافه کنند.
توجه داشته باشید که مکان افزونههای منشعب از کامپایلر با محلی که برنامههای ar، nm و ranlib افزونههای خود را در آن جستجو میکنند متفاوت است. برای اینکه آن دستورها بتوانند از یک افزونه مبتنی بر کامپایلر استفاده کنند، افزونه ابتدا باید در دایرکتوری ${libdir}/bfd-plugins کپی شود. تمام افزونههای پیونددهنده مبتنی بر gcc با نسخههای پیشین سازگار هستند، بنابراین صرفاً کپی کردن جدیدترین نسخه کفایت میکند..IP --push-state 4 گزینهٔ --push-state اجازه میدهد وضعیت فعلی پرچمهایی که نحوهٔ رفتار با فایلهای ورودی را کنترل میکنند ذخیره شود، تا بتوان بعداً همهٔ آنها را با یک گزینهٔ متناظر --pop-state بازیابی کرد.
گزینههای تحت پوشش عبارتند از: -Bdynamic، -Bstatic، -dn، -dy، -call_shared، -non_shared، -static، -N، -n، --whole-archive، --no-whole-archive، -r، -Ur، --copy-dt-needed-entries، --no-copy-dt-needed-entries، --as-needed، --no-as-needed و -a.
یک کاربرد این گزینه در مشخصات pkg-config است. هنگامی که با گزینهٔ --libs استفاده میشود، تمام کتابخانههایی که احتمالاً نیاز هستند فهرست شده و در نتیجه ممکن است همیشه پیوند شوند. بهتر است چیزی شبیه به این بازگردانده شود:
-Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state
- --pop-state
- اثر --push-state را باطل کرده و مقادیر قبلی پرچمهای کنترلکنندهٔ رفتار با فایلهای ورودی را بازیابی میکند.
- -q
- --emit-relocs
- بخشها و
محتویات
بازنشانی
(relocation) را در
فایلهای
اجرایی
کاملاً
پیوندخورده
باقی
میگذارد.
ابزارهای
تحلیل و
بهینهسازی
پس از پیوند
ممکن است
برای اعمال
اصلاحات
صحیح روی
فایلهای
اجرایی به
این
اطلاعات
نیاز داشته
باشند. این
کار منجر به
بزرگتر
شدن
اندازهٔ
فایلهای
اجرایی
میشود.
این گزینه در حال حاضر تنها روی بسترهای ELF پشتیبانی میشود.
- --force-dynamic
- فایل خروجی را وادار میکند تا بخشهای پویا (dynamic sections) داشته باشد. این گزینه ویژهٔ مقصدهای VxWorks است.
- -r
- --relocatable
- خروجی
بازنشانیپذیر
(relocatable) تولید
میکند---یعنی
فایل
خروجیای
تولید
میکند که
میتواند
به نوبهٔ
خود به
عنوان
ورودی برای
ld عمل کند.
این عمل
معمولاً
پیوند
جزئی (partial linking)
نامیده
میشود. به
عنوان یک
اثر جانبی،
در
محیطهایی
که از اعداد
جادویی (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
- برای
برنامههایی
که از
سازندهها
(constructors) یا
نابودکنندهها
(destructors) استفاده
نمیکنند،
یا برای
سیستمهای
مبتنی بر ELF،
این گزینه
معادل -r
است: خروجیِ
بازآدرسپذیر
(relocatable) تولید
میکند---یعنی،
یک فایل
خروجی که به
نوبهٔ خود
میتواند
به عنوان
ورودی برای
ld به کار
رود. با این
حال برای
سایر
فایلهای
دودویی،
گزینهٔ -Ur
مشابه -r
است، اما
ارجاعات به
سازندهها
و
نابودکنندهها
را نیز
حلوفصل
میکند.
برای سیستمهایی که در آنها -r و -Ur رفتاری متفاوت دارند، استفاده از -Ur روی فایلهایی که خود با -Ur پیوند یافتهاند کارساز نخواهد بود؛ پس از آنکه جدول سازنده ساخته شد، چیزی نمیتوان به آن افزود. از -Ur تنها برای آخرین پیوند جزئی، و از -r برای سایر موارد استفاده کنید.
- --orphan-handling=MODE
- چگونگی
رسیدگی به
بخشهای
یتیم (orphan sections) را
کنترل
میکند. بخش
یتیم، بخشی
است که
صراحتاً در
اسکریپت
پیوندساز
از آن نام
برده نشده
است.
MODE میتواند هر یک از مقادیر زیر را داشته باشد:
- "place"
- بخشهای یتیم بر اساس راهبرد توصیفشده در Orphan Sections درون یک بخش خروجیِ مناسب قرار میگیرند. گزینهٔ --unique نیز بر نحوهٔ قرارگیری بخشها تأثیر میگذارد.
- "discard"
- تمام بخشهای یتیم با قرار داده شدن در بخش /DISCARD/ دور ریخته میشوند.
- "warn"
- پیوندساز بخش یتیم را مانند "place" قرار داده و همچنین یک هشدار صادر میکند.
- "error"
- در صورت پیدا شدن هرگونه بخش یتیم، پیوندساز با یک خطا خارج خواهد شد.
در صورت مشخص نشدن --orphan-handling، حالت پیشفرض "place" است.
- --unique[=SECTION]
- برای هر بخش ورودی که با SECTION مطابقت دارد، یا اگر آرگومان نویسهعام اختیاری SECTION مشخص نشده باشد، برای هر بخش ورودی یتیم یک بخش خروجی جداگانه ایجاد میکند. بخش یتیم بخشی است که صراحتاً در اسکریپت پیوندساز مشخص نشده است. میتوانید از این گزینه چندین بار در خط فرمان استفاده کنید؛ این گزینه از ادغام معمول بخشهای ورودی همنام جلوگیری کرده و بر انتسابهای بخش خروجی در یک اسکریپت پیوندساز تقدم مییابد.
- -v
- --version
- -V
- شمارهٔ نگارش ld را نمایش میدهد. گزینهٔ -V شبیهسازیهای پشتیبانیشده را نیز فهرست میکند. همچنین توضیحات مربوط به --enable-linker-version را در Options,,Command-line Options ببینید که میتواند برای درج رشتهٔ نگارش پیوندساز در یک فایل دودویی استفاده شود.
- -x
- --discard-all
- تمام نمادهای محلی را حذف میکند.
- -X
- --discard-locals
- تمام نمادهای محلی موقت را حذف میکند. (این نمادها با پیشوندهای برچسب محلی مختص به سیستم آغاز میشوند، معمولاً .L برای سیستمهای ELF یا L برای سیستمهای سنتی a.out.)
- -y symbol
- --trace-symbol=symbol
- نام هر فایل
پیوندشدهای
را که symbol در
آن ظاهر
میشود،
چاپ میکند.
این گزینه
میتواند
به هر تعداد
بار مشخص
شود. در
بسیاری از
سیستمها
لازم است یک
خط زیرین (_)
به ابتدای
نام نماد
افزوده شود.
این گزینه زمانی مفید است که نمادی تعریفنشده در پیوند خود دارید، اما نمیدانید ارجاع به آن از کجا آمده است.
- -Y path
- مسیر path را به مسیر پیشفرض جستجوی کتابخانه میافزاید. این گزینه برای سازگاری با Solaris تعبیه شده است.
- -z keyword
- کلیدواژههای شناختهشده عبارتند از:
- call-nop=prefix-addr
- call-nop=suffix-nop
- call-nop=prefix-byte
- call-nop=suffix-byte
- لایهٔ پرکنندهٔ (padding) ۱ بایتی "NOP" را هنگام تبدیل فراخوانی غیرمستقیم به یک تابع محلی تعریفشده، مانند foo، از طریق مدخل GOT آن مشخص میکند. call-nop=prefix-addr عبارت "0x67 call foo" را تولید میکند. call-nop=suffix-nop عبارت "call foo 0x90" را تولید میکند. call-nop=prefix-byte عبارت "byte call foo" را تولید میکند. call-nop=suffix-byte عبارت "call foo byte" را تولید میکند. در i386 و x86_64 پشتیبانی میشود.
- cet-report=none
- cet-report=warning
- cet-report=error
- نحوهٔ گزارش ویژگیهای ناموجود GNU_PROPERTY_X86_FEATURE_1_IBT و GNU_PROPERTY_X86_FEATURE_1_SHSTK را در بخش ورودی .note.gnu.property تعیین میکند. گزینهٔ cet-report=none، که پیشفرض است، باعث میشود پیوندساز ویژگیهای ناموجود در فایلهای ورودی را گزارش نکند. cet-report=warning باعث میشود پیوندساز برای ویژگیهای ناموجود در فایلهای ورودی هشدار صادر کند. cet-report=error باعث میشود پیوندساز برای ویژگیهای ناموجود در فایلهای ورودی خطا صادر کند. توجه داشته باشید که ibt گزارش ویژگی ناموجود GNU_PROPERTY_X86_FEATURE_1_IBT را غیرفعال کرده و shstk گزارش ویژگی ناموجود GNU_PROPERTY_X86_FEATURE_1_SHSTK را غیرفعال خواهد کرد. در Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- combreloc
- nocombreloc
- چندین بخش بازآدرسدهی پویا را با یکدیگر ترکیب کرده و مرتب میکند تا حافظهٔ نهان جستجوی نمادهای پویا بهبود یابد. در صورت استفاده از nocombreloc این کار انجام نمیشود.
- common
- nocommon
- در طول یک پیوند بازآدرسپذیر، نمادهای عمومی (common) را با نوع 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
- شیء را به عنوان نیازمند پشتهٔ (stack) قابل اجرا علامتگذاری میکند.
- global
- این گزینه فقط هنگام ساخت یک شیء اشتراکی معنادار است. این گزینه نمادهای تعریفشده توسط این شیء اشتراکی را برای تفکیک نماد کتابخانههایی که متعاقباً بارگذاری میشوند در دسترس قرار میدهد.
- globalaudit
- این گزینه فقط هنگام ساخت یک فایل اجرایی پویا معنادار است. این گزینه فایل اجرایی را با تنظیم بیت "DF_1_GLOBAUDIT" در برچسب پویای "DT_FLAGS_1" به عنوان نیازمند بازرسی سراسری (global auditing) علامتگذاری میکند. بازرسی سراسری مستلزم آن است که هر کتابخانهٔ بازرسی تعریفشده از طریق گزینههای خط فرمان --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
- این گزینه فقط هنگام ساخت یک شیء اشتراکی معنادار است. شیء را بهگونهای علامتگذاری میکند که مقداردهی اولیهٔ زمان اجرای آن قبل از مقداردهی اولیهٔ زمان اجرای هر شیء دیگری که همزمان به فرآیند آورده شده است، رخ دهد. به همین ترتیب، خاتمهسازی (finalization) زمان اجرای شیء پس از خاتمهسازی زمان اجرای سایر اشیاء رخ خواهد داد.
- 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 تولیدشده توسط پیونددهنده را که به جای متغیرهای تعریفشده در کتابخانههای اشتراکی استفاده میشوند، غیرفعال میکند. ممکن است منجر به بازنشانیهای متن (text relocations) پویا شود.
- nodefaultlib
- مشخص میکند که جستجوی بارگذار پویا برای وابستگیهای این شیء باید هرگونه مسیر پیشفرض جستجوی کتابخانه را نادیده بگیرد.
- nodelete
- مشخص میکند که شیء نباید در زمان اجرا از حافظه تخلیه شود..IP nodlopen 4 مشخص میکند که شیء برای "dlopen" در دسترس نیست.
- nodump
- مشخص میکند که شیء نمیتواند توسط "dldump" دامپ (dump) شود.
- noexecstack
- شیء را طوری علامتگذاری میکند که نیازی به پشتهٔ قابل اجرا نداشته باشد.
- noextern-protected-data
- هنگام ساخت یک کتابخانهٔ مشترک، با نمادهای دادهای حفاظتشده مانند نمادهای خارجی رفتار نمیکند. این گزینه رفتار پیشفرض پسانهٔ پیونددهنده را لغو میکند. میتوان از آن برای دور زدن بازنشانیهای نادرست تولیدشده توسط کامپایلر روی نمادهای دادهای حفاظتشده استفاده کرد. بهروزرسانیهای اعمالشده روی نمادهای دادهای حفاظتشده توسط ماژولی دیگر، برای کتابخانهٔ مشترک حاصل قابل مشاهده نخواهند بود. برای i386 و x86-64 پشتیبانی میشود.
- noreloc-overflow
- بررسی سرریز بازنشانی را غیرفعال میکند. اگر در زمان اجرا هیچ سرریز بازنشانی پویایی رخ ندهد، میتوان از این گزینه برای غیرفعال کردن بررسی سرریز بازنشانی استفاده کرد. برای x86_64 پشتیبانی میشود.
- memory-seal
- nomemory-seal
- به فایل اجرایی یا کتابخانهٔ مشترک دستور میدهد که تمام قطعههای PT_LOAD باید مهر و موم (seal) شوند تا از دستکاریهای بعدی (مانند تغییر پرچمهای حفاظت، اندازهٔ قطعه، یا حذف نگاشت) جلوگیری شود. این یک مقاومسازی امنیتی است که نیازمند پشتیبانی سیستم است. این گزینه "GNU_PROPERTY_MEMORY_SEAL" را در بخش ".note.gnu.property" تولید میکند.
- now
- هنگام تولید فایل اجرایی یا کتابخانهٔ مشترک، آن را طوری علامتگذاری میکند تا به پیونددهندهٔ پویا اعلام کند تمام نمادها را هنگام شروع برنامه، یا زمانی که کتابخانهٔ مشترک با "dlopen" بارگذاری میشود حل کند، به جای اینکه حل فراخوانی تابع را تا زمان اولین فراخوانی آن به تعویق بیندازد.
- origin
- مشخص میکند که شیء نیازمند رسیدگی به $ORIGIN در مسیرها است.
- pack-relative-relocs
- nopack-relative-relocs
- بازنشانی نسبی فشرده را در فایلهای اجرایی مستقل از موقعیت و کتابخانههای مشترک تولید میکند. این گزینه مدخلهای "DT_RELR"، "DT_RELRSZ" و "DT_RELRENT" را به بخش پویا اضافه میکند. هنگام ساخت فایل اجرایی وابسته به موقعیت و خروجی قابل بازنشانی نادیده گرفته میشود. گزینهٔ nopack-relative-relocs حالت پیشفرض است که بازنشانی نسبی فشرده را غیرفعال میکند. هنگام پیوند با GNU C Library، یک وابستگی نسخهٔ نماد GLIBC_ABI_DT_RELR به کتابخانهٔ C مشترک به خروجی اضافه میشود. برای i386 و x86-64 پشتیبانی میشود.
- relro
- norelro
- یک سرآیند قطعهٔ ELF "PT_GNU_RELRO" در شیء ایجاد میکند. این کار قطعهای از حافظه را مشخص میکند که در صورت پشتیبانی، باید پس از بازنشانی فقطخواندنی شود. تعیین common-page-size کوچکتری از اندازهٔ صفحهٔ سیستم، این حفاظت را بیاثر خواهد کرد. در صورت استفاده از norelro، قطعهٔ ELF "PT_GNU_RELRO" ایجاد نمیشود.
- report-relative-reloc
- بازنشانیهای نسبی پویای تولیدشده توسط پیونددهنده را گزارش میدهد. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- sectionheader
- nosectionheader
- سرآیند بخش را تولید میکند. در صورت استفاده از nosectionheader سرآیند بخش تولید نمیشود. sectionheader حالت پیشفرض است.
- separate-code
- noseparate-code
- یک سرآیند قطعهٔ "PT_LOAD" مجزا برای کد در شیء ایجاد میکند. این کار قطعهای از حافظه را مشخص میکند که تنها باید شامل دستورالعملها باشد و باید در صفحاتی کاملاً مجزا از هر دادهٔ دیگر قرار گیرد. در صورت استفاده از noseparate-code، قطعهٔ "PT_LOAD" مجزا برای کد ایجاد نمیشود.
- shstk
- ویژگی GNU_PROPERTY_X86_FEATURE_1_SHSTK را در بخش .note.gnu.property تولید میکند تا سازگاری با Intel Shadow Stack را نشان دهد. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- stack-size=value
- اندازهٔ پشته را برای یک قطعهٔ ELF "PT_GNU_STACK" مشخص میکند. تعیین مقدار صفر، ایجاد هرگونه قطعهٔ پیشفرض "PT_GNU_STACK" با اندازهٔ غیرصفر را لغو میکند.
- start-stop-gc
- nostart-stop-gc
- هنگامی که --gc-sections فعال باشد، ارجاع از یک بخش نگهداشتهشده به "__start_SECNAME" یا "__stop_SECNAME" باعث میشود همهٔ بخشهای ورودی به نام "SECNAME" نیز نگه داشته شوند، مشروط بر اینکه "SECNAME" به عنوان یک شناسهٔ C قابل نمایش باشد و "__start_SECNAME" یا "__stop_SECNAME" توسط پیونددهنده ایجاد شده باشد. گزینهٔ -z start-stop-gc این رفتار را غیرفعال میکند و اجازه میدهد بخشها به گونهای جمعآوری زباله (garbage collect) شوند که گویی نمادهای ساختگی ویژه تعریف نشدهاند. -z start-stop-gc بر تعریف "__start_SECNAME" یا "__stop_SECNAME" در یک فایل شیء یا اسکریپت پیونددهنده تأثیری ندارد. چنین تعریفی به ترتیب مانع از ارائهٔ نماد ساختگی "__start_SECNAME" یا "__stop_SECNAME" توسط پیونددهنده شده و بنابراین رفتار ویژهٔ جمعآوری زباله را برای آن ارجاعها متوقف میکند.
- start-stop-visibility=value
- نمایانی نماد ELF را برای نمادهای ساختگی "__start_SECNAME" و "__stop_SECNAME" مشخص میکند. مقدار value باید دقیقاً یکی از مقادیر default، internal، hidden یا protected باشد. اگر هیچ گزینهٔ -z start-stop-visibility داده نشود، برای سازگاری با گذشته از protected استفاده میشود. با این حال، قویاً توصیه میشود در برنامهها و کتابخانههای مشترک جدید از -z start-stop-visibility=hidden استفاده شود تا این نمادها بین شیءهای مشترک صادر نشوند، چرا که معمولاً این کار مد نظر نیست.
- text
- notext
- textoff
- اگر DT_TEXTREL تنظیم شده باشد، یعنی اگر شیء مستقل از موقعیت یا مشترک دارای بازنشانیهای پویا در بخشهای فقطخواندنی باشد، خطا گزارش میکند. در صورت استفاده از notext یا textoff خطایی گزارش نمیشود.
- undefs
- ارجاعهای به نمادهای حلنشده از فایلهای شیء عادی را، چه هنگام ایجاد فایل اجرایی و چه هنگام ایجاد کتابخانهٔ مشترک، گزارش نمیکند. این گزینه معکوس -z defs است.
- unique-symbol
- nounique-symbol
- از نامهای تکراری نمادهای محلی در جدول رشتهٔ نمادها جلوگیری میکند. در صورت استفاده از unique-symbol، عبارت "."number"" را به نامهای تکراری نمادهای محلی اضافه میکند. nounique-symbol حالت پیشفرض است.
- x86-64-baseline
- x86-64-v2
- x86-64-v3
- x86-64-v4
- سطح ISA مورد نیاز برای x86-64 را در بخش .note.gnu.property مشخص میکند. x86-64-baseline مقدار "GNU_PROPERTY_X86_ISA_1_BASELINE" را تولید میکند. x86-64-v2 مقدار "GNU_PROPERTY_X86_ISA_1_V2" را تولید میکند. x86-64-v3 مقدار "GNU_PROPERTY_X86_ISA_1_V3" را تولید میکند. x86-64-v4 مقدار "GNU_PROPERTY_X86_ISA_1_V4" را تولید میکند. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- isa-level-report=none
- isa-level-report=all
- isa-level-report=needed
- isa-level-report=used
- نحوهٔ گزارش سطوح ISA مربوط به x86-64 در فایلهای قابل بازنشانی ورودی را مشخص میکند. isa-level-report=none که پیشفرض است، باعث میشود پیونددهنده سطوح ISA مربوط به x86-64 را در فایلهای ورودی گزارش نکند. isa-level-report=all باعث میشود پیونددهنده سطوح ISA مربوط به x86-64 مورد نیاز و استفادهشده در فایلهای ورودی را گزارش کند. isa-level-report=needed باعث میشود پیونددهنده سطوح ISA مربوط به x86-64 مورد نیاز در فایلهای ورودی را گزارش کند. isa-level-report=used باعث میشود پیونددهنده سطوح ISA مربوط به x86-64 استفادهشده در فایلهای ورودی را گزارش کند. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
سایر کلیدواژهها به منظور سازگاری با Solaris نادیده گرفته میشوند.
- --no-gnu-tls-tag
- افزودن وابستگی برچسب نسخه "GLIBC_ABI_GNU_TLS" در برنامهها و کتابخانههای اشتراکی خروجی هنگام پیوند با glibc، در صورتی که فایلهای شیءِ بازنشانیپذیر (relocatable) ورودی تابع "___tls_get_addr" را فراخوانی کنند. اگر خروجی در برابر glibc اجرا شود که برچسب نسخه "GLIBC_ABI_GNU_TLS" را تعریف نکرده است، بارگذاری و اجرای آن در زمان اجرا با شکست مواجه خواهد شد. مگر اینکه در زمان ساخت پیونددهنده توسط گزینه پیکربندی --disable-gnu-tls-tag غیرفعال شده باشد، هنگامی که هیچ گزینهای مشخص نشده باشد، اگر ورودیها فراخوانی "___tls_get_addr" داشته باشند و libc.so برچسب نسخه "GLIBC_ABI_GNU_TLS" را تعریف کند، پیونددهنده وابستگی این برچسب نسخه را اضافه خواهد کرد. پشتیبانیشده برای Linux/i386.
- --gnu2-tls-tag
- --no-gnu2-tls-tag
- افزودن وابستگی برچسب نسخه "GLIBC_ABI_GNU2_TLS" در برنامهها و کتابخانههای اشتراکی خروجی هنگام پیوند با glibc، در صورتی که فایلهای شیءِ بازنشانیپذیر ورودی دارای بازنشانی "R_386_TLS_DESC_CALL" یا "R_X86_64_TLSDESC_CALL" باشند. خروجی در برابر نسخهای از glibc که برچسب نسخه "GLIBC_ABI_GNU2_TLS" را تعریف نکرده باشد، در زمان اجرا بارگذاری و اجرا نخواهد شد. مگر اینکه در زمان ساخت پیونددهنده توسط گزینه پیکربندی --disable-gnu2-tls-tag غیرفعال شده باشد، چنانچه هیچ گزینهای مشخص نشود، پیونددهنده در صورتی که ورودیها دارای بازنشانی "R_386_TLS_DESC_CALL" یا "R_X86_64_TLSDESC_CALL" باشند و libc.so برچسب نسخه "GLIBC_ABI_GNU2_TLS" را تعریف کرده باشد، وابستگی این برچسب نسخه را اضافه خواهد کرد. پشتیبانیشده برای Linux/i386 و Linux/x86_64.
- -( archives -)
- --start-group archives --end-group
- آرگومان archives
باید
فهرستی از
فایلهای
آرشیو باشد.
آنها
میتوانند
نامهای
صریح فایل
یا
گزینههای
-l باشند.
آرشیوهای مشخصشده بهطور مکرر جستجو میشوند تا زمانی که هیچ ارجاع تعریفنشدهٔ جدیدی ایجاد نشود. بهطور معمول، یک آرشیو تنها یک بار و به همان ترتیبی که در خط فرمان مشخص شده جستجو میشود. اگر نمادی در آن آرشیو برای رفع یک نماد تعریفنشده مورد ارجاع توسط شیئی در آرشیوی که بعداً در خط فرمان آمده نیاز باشد، پیونددهنده قادر به رفع آن ارجاع نخواهد بود. با گروهبندی آرشیوها، همگی آنها بهطور مکرر جستجو میشوند تا تمامی ارجاعات ممکن برطرف شوند.
استفاده از این گزینه هزینه کارایی چشمگیری دارد. بهتر است تنها زمانی استفاده شود که ارجاعات دَوَرانی اجتنابناپذیری بین دو یا چند آرشیو وجود داشته باشد.
- --accept-unknown-input-arch
- --no-accept-unknown-input-arch
- به پیونددهنده اعلام میکند فایلهای ورودی که معماری آنها قابل تشخیص نیست را بپذیرد. فرض بر این است که کاربر از عمل خود آگاه است و عمداً میخواهد این فایلهای ورودی ناشناخته را پیوند دهد. این رفتار، پیش از نگارش 2.14 رفتار پیشفرض پیونددهنده بود. رفتار پیشفرض از نگارش 2.14 به بعد رد کردن چنین فایلهای ورودی است، و از این رو گزینه --accept-unknown-input-arch برای بازگرداندن رفتار پیشین اضافه شده است.
- --as-needed
- --no-as-needed
- این گزینه
بر
برچسبهای
DT_NEEDED در ELF برای
کتابخانههای
پویایی که
پس از گزینه
--as-needed در خط
فرمان ذکر
شدهاند
تأثیر
میگذارد.
بهطور
معمول
پیونددهنده
برای هر
کتابخانه
پویایی که
در خط فرمان
ذکر شده یک
برچسب DT_NEEDED
اضافه
میکند،
بدون توجه
به اینکه
آیا
کتابخانه
واقعاً
مورد نیاز
است یا خیر.
گزینه --as-needed
باعث
میشود
برچسب DT_NEEDED
تنها برای
کتابخانهای
صادر شود که
در همان
نقطه از
پیوند یک
ارجاع نماد
تعریفنشده
غیرضعیف (non-weak)
از یک فایل
شیء
معمولی، یا
در صورتی که
کتابخانه
در
فهرستهای
DT_NEEDED سایر
کتابخانههای
مورد نیاز
یافت نشود،
یک ارجاع
نماد
تعریفنشده
غیرضعیف از
یک
کتابخانه
پویای مورد
نیاز دیگر
را برطرف
کند.
فایلهای
شیء یا
کتابخانههایی
که پس از
کتابخانه
مورد نظر در
خط فرمان
ظاهر
میشوند
تأثیری بر
اینکه آن
کتابخانه
مورد نیاز
تشخیص داده
شود ندارند.
این رفتار
مشابه
قواعد
استخراج
فایلهای
شیء از
آرشیوها
است. گزینه
--no-as-needed رفتار
پیشفرض را
بازیابی
میکند.
نکته: در سیستمهای مبتنی بر لینوکس گزینه --as-needed همچنین بر رفتار گزینههای --rpath و --rpath-link تأثیر میگذارد. برای جزئیات بیشتر به توضیحات --rpath-link مراجعه کنید.
- --add-needed
- --no-add-needed
- این دو گزینه به دلیل شباهت نامهایشان به گزینههای --as-needed و --no-as-needed منسوخ شدهاند. آنها با گزینههای --copy-dt-needed-entries و --no-copy-dt-needed-entries جایگزین شدهاند.
- -assert keyword
- این گزینه برای سازگاری با SunOS نادیده گرفته میشود.
- -Bdynamic
- -dy
- پیوند با کتابخانههای پویا. این گزینه تنها در بسترهایی که از کتابخانههای اشتراکی پشتیبانی میکنند معنادار است. این گزینه معمولاً در چنین بسترهایی پیشفرض است. انواع مختلف این گزینه برای سازگاری با سیستمهای گوناگون تعبیه شده است. میتوانید از این گزینه چندین بار در خط فرمان استفاده کنید: این گزینه بر جستجوی کتابخانه برای گزینههای -l که پس از آن میآیند تأثیر میگذارد.
- -Bgroup
- پرچم "DF_1_GROUP" را در مدخل "DT_FLAGS_1" در بخش پویا (dynamic section) تنظیم میکند. این امر باعث میشود پیونددهنده زمان اجرا، جستجوها برای این شیء و وابستگیهای آن را تنها درون گروه مربوطه انجام دهد. گزینه --unresolved-symbols=report-all بهطور ضمنی اعمال میشود. این گزینه تنها بر روی بسترهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنادار است.
- -Bstatic
- -dn
- -static
- پیوند ندادن با کتابخانههای اشتراکی. این گزینه تنها در بسترهایی که از کتابخانههای اشتراکی پشتیبانی میکنند معنادار است. شکلهای مختلف این گزینه برای سازگاری با سیستمهای گوناگون است. میتوانید از این گزینه چندین بار در خط فرمان استفاده کنید: این گزینه بر جستجوی کتابخانه برای گزینههای -l که پس از آن میآیند تأثیر میگذارد. این گزینه همچنین بهطور ضمنی --unresolved-symbols=report-all را اعمال میکند. این گزینه میتواند همراه با -shared استفاده شود؛ انجام این کار بدان معناست که یک کتابخانه اشتراکی ساخته میشود اما تمامی ارجاعات خارجی کتابخانه باید با دریافت مدخلها از کتابخانههای ایستا (static) برطرف شوند.
- -Bsymbolic
- هنگام ساخت یک کتابخانه اشتراکی، ارجاعات به نمادهای سراسری را به تعاریف موجود در همان کتابخانه اشتراکی (در صورت وجود) مقید میکند. معمولاً این امکان برای برنامهای که با یک کتابخانه اشتراکی پیوند خورده وجود دارد که تعاریف موجود در کتابخانه اشتراکی را بازنویسی (override) کند. این گزینه تنها بر روی بسترهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنادار است.
- -Bsymbolic-functions
- هنگام ساخت یک کتابخانه اشتراکی، ارجاعات به نمادهای توابع سراسری را به تعاریف موجود در همان کتابخانه اشتراکی (در صورت وجود) مقید میکند. این گزینه تنها بر روی بسترهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنادار است.
- -Bno-symbolic
- این گزینه میتواند گزینههای -Bsymbolic و -Bsymbolic-functions را که پیشتر مشخص شدهاند لغو کند.
- --dynamic-list=dynamic-list-file
- نام یک فایل
فهرست پویا
را به
پیونددهنده
مشخص
میکند. این
گزینه
معمولاً
هنگام
ایجاد
کتابخانههای
اشتراکی
برای تعیین
فهرستی از
نمادهای
سراسری
استفاده
میشود که
ارجاعات
آنها نباید
به تعاریف
درون
کتابخانه
اشتراکی
مقید شود،
یا هنگام
ساخت
فایلهای
اجرایی با
پیوند پویا
برای تعیین
فهرستی از
نمادها که
باید به
جدول
نمادها در
فایل
اجرایی
اضافه شوند
به کار
میرود. این
گزینه تنها
بر روی
بسترهای ELF
که از
کتابخانههای
اشتراکی
پشتیبانی
میکنند
معنادار
است.
قالب فهرست پویا همانند گره نسخه (version node) بدون دامنه و نام گره است. برای اطلاعات بیشتر VERSION را ببینید.
- --dynamic-list-data
- شامل کردن تمام نمادهای سراسری داده در فهرست پویا.
- --dynamic-list-cpp-new
- ارائه فهرست پویای توکار برای عملگرهای new و delete در ++C. این گزینه عمدتاً برای ساخت کتابخانه اشتراکی libstdc++ مفید است..IP --dynamic-list-cpp-typeinfo 4 فهرست پویای توکار را برای شناسایی نوع زمان اجرای ++C فراهم میکند.
- --check-sections
- --no-check-sections
- از پیونددهنده میخواهد که نشانیهای بخشها را پس از تخصیص، برای بررسی هرگونه همپوشانی بررسی نکند. پیونددهنده در حالت عادی این بررسی را انجام میدهد و در صورت یافتن هرگونه همپوشانی، پیامهای خطای مناسبی تولید میکند. پیونددهنده از بخشهای موجود در همپوشانها (overlays) آگاه است و آنها را مجاز میشمارد. رفتار پیشفرض را میتوان با استفاده از سوییچ خط فرمان --check-sections بازگرداند. همپوشانی بخشها معمولاً برای پیوندهای با قابلیت جابهجایی (relocatable) بررسی نمیشود. در این حالت میتوانید با استفاده از گزینه --check-sections بررسی را اجباری کنید.
- --copy-dt-needed-entries
- --no-copy-dt-needed-entries
- این گزینه
بر نحوه
برخورد با
کتابخانههای
پویایی
تأثیر
میگذارد
که توسط
برچسبهای
DT_NEEDED درون
کتابخانههای
پویای ELF ذکر
شده در خط
فرمان مورد
ارجاع قرار
گرفتهاند.
پیونددهنده
در حالت
عادی برای
هر
کتابخانهای
که در یک
برچسب DT_NEEDED در
یک
کتابخانه
پویای
ورودی ذکر
شده باشد،
برچسب DT_NEEDED را
به باینری
خروجی
اضافه
نمیکند. با
این حال، با
مشخص کردن
--copy-dt-needed-entries در خط
فرمان،
مدخلهای DT_NEEDED
هر
کتابخانه
پویایی که
پس از آن
بیاید
اضافه
خواهد شد.
رفتار
پیشفرض را
میتوان با
--no-copy-dt-needed-entries
بازگرداند.
این گزینه همچنین بر تحلیل نمادها در کتابخانههای پویا تأثیر میگذارد. با --copy-dt-needed-entries، کتابخانههای پویای ذکر شده در خط فرمان با دنبال کردن برچسبهای DT_NEEDED آنها به کتابخانههای دیگر، بهطور بازگشتی جستجو میشوند تا نمادهای مورد نیاز باینری خروجی حل شوند. با این حال با تنظیمات پیشفرض، جستجوی کتابخانههای پویایی که پس از آن میآیند در خود همان کتابخانه پویا متوقف خواهد شد. هیچ پیوند DT_NEEDED برای تحلیل نمادها پیمایش نخواهد شد.
- --cref
- یک جدول
ارجاع
متقابل (cross reference)
خروجی
میدهد. اگر
فایل نگاشت
پیونددهنده
در حال
تولید
باشد، جدول
ارجاع
متقابل در
فایل نگاشت
چاپ میشود.
در غیر این
صورت، روی
خروجی
استاندارد
چاپ میشود.
قالب این جدول عمداً ساده است تا در صورت نیاز بتوان آن را به راحتی توسط یک اسکریپت پردازش کرد. نمادها به ترتیب نام چاپ میشوند. برای هر نماد، فهرستی از نامهای فایل ارائه میشود. اگر نماد تعریف شده باشد، اولین فایل ذکر شده محل تعریف آن است. اگر نماد به عنوان یک مقدار مشترک (common) تعریف شده باشد، فایلهایی که در آنها این اتفاق افتاده در ادامه ظاهر میشوند. در نهایت، تمام فایلهایی که به آن نماد ارجاع میدهند فهرست میشوند.
- --ctf-variables
- --no-ctf-variables
- قالب اطلاعات اشکالزدایی CTF از بخشی پشتیبانی میکند که نامها و نوعهای متغیرهای موجود در برنامه را که در هیچ جدول نمادی ظاهر نمیشوند، کدگذاری میکند. این متغیرها آشکارا نمیتوانند توسط اشکالزداهای سنتی از طریق نشانی مورد جستجو قرار گیرند، بنابراین فضای استفاده شده برای نوعها و نامهای آنها معمولاً هدر میرود: نوعها معمولاً کوچک هستند اما نامها اغلب چنین نیستند. گزینه --ctf-variables باعث تولید چنین بخشی میشود. رفتار پیشفرض را میتوان با --no-ctf-variables بازگرداند.
- --ctf-share-types=method
- روش مورد استفاده برای اشتراکگذاری نوعها بین واحدهای ترجمه در CTF را تنظیم میکند.
- تمام نوعهایی را که فاقد تعاریف مبهم هستند در فرهنگ لغت مشترک قرار میدهد، جایی که اشکالزداها میتوانند به راحتی به آنها دسترسی داشته باشند، حتی اگر فقط در یک واحد ترجمه ظاهر شوند. این مقدار پیشفرض است.
- تنها نوعهایی را که در چندین واحد ترجمه ظاهر میشوند در فرهنگ لغت مشترک قرار میدهد: نوعهایی با تنها یک تعریف، به فرهنگ لغتهای ویژه هر واحد ترجمه میروند. نوعهایی با تعاریف مبهم در چندین واحد ترجمه، همواره در فرهنگ لغتهای ویژه هر واحد ترجمه قرار میگیرند. این امر موجب بزرگتر شدن حجم CTF میشود، اما ممکن است مقدار CTF را در فرهنگ لغت مشترک کاهش دهد. برای پروژههای بسیار بزرگ، این کار ممکن است باز کردن CTF را سرعت ببخشد و در زمان اجرا حافظه مصرفی استفادهکننده از CTF را کاهش دهد.
- --no-define-common
- این گزینه
از تخصیص
نشانی به
نمادهای
عمومی (Common)
جلوگیری
میکند.
دستور
اسکریپت
"INHIBIT_COMMON_ALLOCATION"
اثر مشابهی
دارد.
گزینه --no-define-common امکان تفکیک تصمیمگیری برای تخصیص نشانی به نمادهای عمومی را از انتخاب نوع فایل خروجی فراهم میکند؛ در غیر این صورت یک نوع خروجی غیرقابل جابهجایی تخصیص نشانی به نمادهای عمومی را اجباری میسازد. استفاده از --no-define-common اجازه میدهد نمادهای عمومی که از یک کتابخانه اشتراکی به آنها ارجاع شده است، فقط در برنامه اصلی نشانیدهی شوند. این امر فضای تکراری بلااستفاده در کتابخانه اشتراکی را حذف میکند، و همچنین از هرگونه سردرگمی احتمالی در تحلیل به نسخه تکراری اشتباه در زمانی که چندین ماژول پویا با مسیرهای جستجوی تخصصی برای تحلیل نماد در زمان اجرا وجود دارند، جلوگیری میکند.
- --force-group-allocation
- این گزینه باعث میشود که پیونددهنده اعضای گروه بخش (section group) را مانند بخشهای ورودی عادی قرار دهد و گروههای بخش را حذف کند. این رفتار پیشفرض برای یک پیوند نهایی است، اما میتوان از این گزینه برای تغییر رفتار یک پیوند با قابلیت جابهجایی (-r) استفاده کرد. دستور اسکریپت "FORCE_GROUP_ALLOCATION" اثر مشابهی دارد.
- --defsym=symbol=expression
- یک نماد
سراسری در
فایل خروجی
ایجاد
میکند که
حاوی نشانی
مطلقی است
که توسط expression
مشخص شده
است.
میتوانید
به هر تعداد
بار که برای
تعریف
چندین نماد
در خط فرمان
لازم است از
این گزینه
استفاده
کنید. شکل
محدودی از
محاسبات
ریاضی برای
expression در این
زمینه
پشتیبانی
میشود:
میتوانید
یک مقدار
ثابت
هگزادسیمال
یا نام یک
نماد موجود
را ارائه
دهید، یا از
"+" و
"-" برای
جمع یا
تفریق
ثابتهای
هگزادسیمال
یا نمادها
استفاده
کنید. اگر
به عبارات
پیچیدهتری
نیاز
دارید،
استفاده از
زبان دستور
پیونددهنده
را از طریق
یک اسکریپت
در نظر
بگیرید.
نکته:
نباید هیچ
فاصله خالی
میان symbol،
علامت
مساوی ("=") و
expression وجود
داشته باشد.
پیونددهنده آرگومانهای --defsym و آرگومانهای -T را به ترتیب پردازش میکند؛ قرار دادن --defsym قبل از -T، نماد را قبل از پردازش اسکریپت پیونددهنده از -T تعریف خواهد کرد، در حالی که قرار دادن --defsym پس از -T، نماد را پس از پردازش اسکریپت پیونددهنده تعریف میکند. این تفاوت پیامدهایی برای عباراتی درون اسکریپت پیونددهنده دارد که از نمادهای --defsym استفاده میکنند؛ اینکه کدام ترتیب درست است بستگی به هدف شما دارد.
- --demangle[=style]
- --no-demangle
- این گزینهها نمادزدایی (demangle) نام نمادها در پیامهای خطا و سایر خروجیها را کنترل میکنند. هنگامی که به پیونددهنده دستور نمادزدایی داده میشود، تلاش میکند نام نمادها را به شیوهای خوانا نمایش دهد: اگر در قالب فایل شیء از زیرخطهای ابتدایی استفاده شده باشد آنها را حذف میکند، و نامهای درهمریخته نمادهای ++C را به نامهای خوانا برای کاربر تبدیل میکند. کامپایلرهای مختلف سبکهای درهمریزی متفاوتی دارند. از آرگومان اختیاری سبک نمادزدایی میتوان برای انتخاب سبک مناسب برای کامپایلر خود استفاده کرد. پیونددهنده بهطور پیشفرض نمادزدایی میکند مگر اینکه متغیر محیطی COLLECT_NO_DEMANGLE تنظیم شده باشد. این گزینهها ممکن است برای نادیده گرفتن رفتار پیشفرض استفاده شوند.
- -Ifile
- --dynamic-linker=file
- نام پیونددهنده پویا را تعیین میکند. این گزینه فقط هنگام ایجاد فایلهای اجرایی ELF با پیوند پویا معنادار است. پیونددهنده پویای پیشفرض معمولاً درست است؛ از این گزینه استفاده نکنید مگر اینکه بدانید در حال انجام چه کاری هستید.
- --no-dynamic-linker
- هنگام تولید یک فایل اجرایی، درخواست استفاده از یک پیونددهنده پویا در زمان بارگذاری را حذف میکند. این مورد فقط برای فایلهای اجرایی ELF که حاوی جابهجاییهای پویا هستند معنادار است، و معمولاً به کد نقطه ورود (entry point) نیاز دارد که قادر به پردازش این جابهجاییها باشد.
- --embedded-relocs
- این گزینه شبیه به گزینه --emit-relocs است، با این تفاوت که جابهجاییها در یک بخش ویژه مقصد ذخیره میشوند. این گزینه تنها توسط مقصدهای BFIN، CR16 و M68K پشتیبانی میشود.
- --disable-multiple-abs-defs
- تعاریف چندگانه با نمادهای گنجانده شده در نام فایل فراخوانیشده توسط -R یا --just-symbols را مجاز نمیداند.
- --fatal-warnings
- --no-fatal-warnings
- با تمام هشدارها مانند خطا رفتار میکند. رفتار پیشفرض را میتوان با گزینه --no-fatal-warnings بازگرداند..IP -w 4
- --no-warnings
- هیچ پیام هشدار یا خطایی را نمایش نمیدهد. در صورت فعال بودن --fatal-warnings، این گزینه آن را لغو میکند. از این گزینه میتوان زمانی استفاده کرد که مشخص است باینری خروجی کار نخواهد کرد، اما همچنان نیاز به ایجاد آن وجود دارد.
- --force-exe-suffix
- اطمینان
حاصل
میکند که
فایل خروجی
پسوند .exe
دارد.
اگر یک فایل خروجی کاملاً پیوندیافته که با موفقیت ساخته شده است پسوند ".exe" یا ".dll" نداشته باشد، این گزینه پیونددهنده را وادار میکند تا فایل خروجی را با همان نام و با پسوند ".exe" کپی کند. این گزینه هنگام استفاده از makefileهای دستنخوردهٔ یونیکس روی میزبان مایکروسافت ویندوز مفید است، زیرا برخی از نسخههای ویندوز یک ایمیج را اجرا نمیکنند مگر اینکه به پسوند ".exe" ختم شود.
- --gc-sections
- --no-gc-sections
- جمعآوری
زباله (garbage collection)
بخشهای
ورودی
استفادهنشده
را فعال
میکند. در
مقصدهایی
که از این
گزینه
پشتیبانی
نمیکنند،
نادیده
گرفته
میشود.
رفتار
پیشفرض
(عدم انجام
این
جمعآوری
زباله) را
میتوان با
مشخص کردن
--no-gc-sections در خط
فرمان
بازگرداند.
توجه داشته
باشید که
جمعآوری
زباله برای
مقصدهای با
قالب COFF و PE
پشتیبانی
میشود،
اما
پیادهسازی
آن در حال
حاضر
آزمایشی در
نظر گرفته
میشود.
گزینهٔ --gc-sections با بررسی نمادها و بازنشانیها (relocations) تصمیم میگیرد که کدام بخشهای ورودی استفاده شدهاند. بخشی که حاوی نماد ورودی (entry symbol) است و تمام بخشهای حاوی نمادهایی که در خط فرمان تعریفنشده هستند نگهداشته خواهند شد، همانند بخشهای حاوی نمادهایی که توسط اشیاء پویا ارجاع داده شدهاند. توجه داشته باشید هنگام ساخت کتابخانههای اشتراکی، پیونددهنده باید فرض کند که به هر نماد قابلمشاهدهای ارجاع داده شده است. پس از تعیین این مجموعهٔ اولیه از بخشها، پیونددهنده بهطور بازگشتی هر بخشی را که توسط بازنشانیهای آنها ارجاع داده شده است به عنوان استفادهشده علامتگذاری میکند. گزینههای --entry، --undefined و --gc-keep-exported را ببینید.
این گزینه را میتوان هنگام انجام پیوند جزئی (که با گزینهٔ -r فعال میشود) تنظیم کرد. در این حالت، ریشهٔ نمادهای نگهداشتهشده باید صراحتاً توسط یکی از گزینههای --entry، --undefined یا --gc-keep-exported یا با دستور "ENTRY" در اسکریپت پیونددهنده مشخص شود.
به عنوان یک افزونهٔ گنو (GNU)، بخشهای ورودی ELF که با پرچم "SHF_GNU_RETAIN" علامتگذاری شده باشند، جمعآوری زباله نخواهند شد.
- --print-gc-sections
- --no-print-gc-sections
- فهرست کردن تمام بخشهای حذفشده توسط جمعآوری زباله. این فهرست در خروجی خطای استاندارد (stderr) چاپ میشود. این گزینه تنها زمانی مؤثر است که جمعآوری زباله از طریق گزینهٔ --gc-sections فعال شده باشد. رفتار پیشفرض (فهرست نکردن بخشهای حذفشده) را میتوان با تعیین --no-print-gc-sections در خط فرمان بازگرداند.
- --gc-keep-exported
- هنگامی که --gc-sections فعال است، این گزینه از جمعآوری زباله برای بخشهای ورودی استفادهنشدهای که حاوی نمادهای سراسری با نمایانیِ (visibility) پیشفرض یا محافظتشده هستند، جلوگیری میکند. این گزینه برای فایلهای اجرایی در نظر گرفته شده است که در آنها، بخشهای بدون ارجاع در غیر این صورت صرفنظر از نمایانی بیرونی نمادهای موجود در آنها جمعآوری زباله میشدند. توجه داشته باشید که این گزینه هنگام پیوند اشیاء اشتراکی هیچ تأثیری ندارد، زیرا پیشاپیش رفتار پیشفرض همین است. این گزینه تنها برای مقصدهای با قالب ELF پشتیبانی میشود.
- --print-output-format
- نام قالب خروجی پیشفرض (که احتمالاً تحت تأثیر سایر گزینههای خط فرمان قرار گرفته است) را چاپ میکند. این همان رشتهای است که در دستور "OUTPUT_FORMAT" اسکریپت پیونددهنده ظاهر میشود.
- --print-memory-usage
- اندازهٔ
استفادهشده،
اندازهٔ کل
و درصد
استفادهشده
از نواحی
حافظه
ایجادشده
با دستور MEMORY
را چاپ
میکند. این
گزینه در
مقصدهای
تعبیهشده
برای داشتن
دیدی سریع
از میزان
حافظهٔ
آزاد مفید
است. قالب
خروجی
دارای یک
سربرگ و یک
سطر به ازای
هر ناحیه
است. خروجی
هم برای
انسان
خوانا بوده
و هم به
راحتی توسط
ابزارها
تجزیه
میشود. در
اینجا
نمونهای
از خروجی
آورده شده
است:
Memory region Used Size Region Size %age Used ROM: 256 KB 1 MB 25.00% RAM: 32 B 2 GB 0.00%نکته: اگر میخواهید از میزان مصرف حافظه توسط خود پیونددهنده مطلع شوید، گزینهٔ --stats این کار را انجام خواهد داد.
- --help
- خلاصهای از گزینههای خط فرمان را در خروجی استاندارد چاپ کرده و خارج میشود.
- --target-help
- خلاصهای از تمام گزینههای مختص مقصد را در خروجی استاندارد چاپ کرده و خارج میشود.
- -Map=mapfile
- نقشهٔ
پیوند (link map) را
در فایل mapfile
چاپ میکند.
توضیحات
مربوط به
گزینهٔ -M
را در بالا
ببینید. اگر
mapfile صرفاً
نویسهٔ
"-"
باشد، نقشه
در stdout نوشته
خواهد شد.
مشخص کردن یک دایرکتوری به عنوان mapfile باعث میشود نقشهٔ پیوند به صورت فایلی در داخل آن دایرکتوری نوشته شود. به طور معمول نام فایل درون دایرکتوری بر اساس نام پایه (basename) فایل output به همراه پسوند ".map" محاسبه میشود. اما اگر از نویسهٔ ویژهٔ "%" استفاده شود، این نویسه با مسیر کامل فایل خروجی جایگزین خواهد شد. علاوه بر این، اگر نویسهای پس از نماد % وجود داشته باشد، پسوند ".map" دیگر اضافه نخواهد شد.
-o foo.exe -Map=bar [Creates ./bar] -o ../dir/foo.exe -Map=bar [Creates ./bar] -o foo.exe -Map=../dir [Creates ../dir/foo.exe.map] -o ../dir2/foo.exe -Map=../dir [Creates ../dir/foo.exe.map] -o foo.exe -Map=% [Creates ./foo.exe.map] -o ../dir/foo.exe -Map=% [Creates ../dir/foo.exe.map] -o foo.exe -Map=%.bar [Creates ./foo.exe.bar] -o ../dir/foo.exe -Map=%.bar [Creates ../dir/foo.exe.bar] -o ../dir2/foo.exe -Map=../dir/% [Creates ../dir/../dir2/foo.exe.map] -o ../dir2/foo.exe -Map=../dir/%.bar [Creates ../dir/../dir2/foo.exe.bar]
مشخص کردن بیش از یک نویسهٔ "%" یک خطا است.
اگر فایل نقشه از پیش وجود داشته باشد، توسط این عملیات بازنویسی خواهد شد.
- --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 کتابخانههای اشتراکی را در زمان بارگذاری وصلهکاری (patch) میکند تا هر تابعی را که برای معماری کنونی مناسبتر است انتخاب کند. این کار، برای مثال، بهمنظور انتخاب پویای یک تابع memset مناسب استفاده میشود.
- --error-handling-script=scriptname
- اگر این
گزینه مشخص
شود، هر
زمان که
خطایی رخ
دهد،
پیونددهنده
scriptname را
فراخوانی
میکند. با
این حال، در
حال حاضر
تنها دو نوع
خطا
پشتیبانی
میشوند:
نمادهای
مفقود و
کتابخانههای
مفقود. دو
آرگومان به
اسکریپت
ارسال
میشود:
کلمهٔ
کلیدی "undefined-symbol"
یا "missing-lib" و name
مربوط به
نماد
تعریفنشده
یا
کتابخانهٔ
مفقود. هدف
این است که
اسکریپت
پیشنهادهایی
را در مورد
محل یافتن
نماد یا
کتابخانه
به کاربر
ارائه دهد.
پس از پایان
اجرای
اسکریپت،
پیام خطای
عادی
پیونددهنده
نمایش داده
خواهد شد.
در دسترس بودن این گزینه توسط یک سوییچ در زمان پیکربندی کنترل میشود، بنابراین ممکن است در برخی پیادهسازیهای خاص وجود نداشته باشد.
- --no-undefined-version
- بهطور معمول هنگامی که یک نماد دارای نسخهٔ تعریفنشده باشد، پیونددهنده آن را نادیده میگیرد. این گزینه نمادهای دارای نسخهٔ تعریفنشده را غیرمجاز دانسته و در عوض یک خطای مهلک صادر میکند.
- --default-symver
- یک نسخهٔ نماد پیشفرض (همان soname) برای نمادهای صادرشدهٔ بدون نسخه ایجاد کرده و استفاده میکند.
- --default-imported-symver
- یک نسخهٔ نماد پیشفرض (همان soname) برای نمادهای واردشدهٔ بدون نسخه ایجاد کرده و استفاده میکند.
- --no-warn-mismatch
- بهطور معمول ld اگر سعی کنید فایلهای ورودی را که به دلیلی ناهماهنگ هستند—شاید به این دلیل که برای پردازندههای مختلف یا ترتیب بایتهای (endianness) متفاوتی کامپایل شدهاند—به هم پیوند دهید، خطایی صادر میکند. این گزینه به ld میگوید که باید چنین خطاهای احتمالی را بدون اعلام هشدار یا خطا مجاز بداند. از این گزینه تنها باید با احتیاط استفاده شود، در مواردی که اقدام خاصی انجام دادهاید که اطمینان میدهد خطاهای پیونددهنده نابجا هستند.
- --no-warn-search-mismatch
- بهطور معمول ld در صورتی که در طول جستجوی کتابخانه، یک کتابخانهٔ ناسازگار پیدا کند، یک هشدار صادر میکند. این گزینه آن هشدار را بیصدا میکند.
- --no-whole-archive
- اثر گزینهٔ --whole-archive را برای فایلهای آرشیو بعدی غیرفعال میکند.
- --noinhibit-exec
- فایل خروجی اجرایی را تا زمانی که همچنان قابل استفاده باشد، حفظ میکند. بهطور معمول، پیونددهنده در صورت برخورد با خطاها در طول فرایند پیوند، فایل خروجی تولید نمیکند؛ در صورت بروز هرگونه خطا، بدون نوشتن فایل خروجی خارج میشود.
- -nostdlib
- تنها دایرکتوریهای کتابخانهای را جستجو میکند که صریحاً در خط فرمان مشخص شدهاند. دایرکتوریهای کتابخانهای مشخصشده در اسکریپتهای پیونددهنده (از جمله اسکریپتهای پیونددهندهای که در خط فرمان مشخص شدهاند) نادیده گرفته میشوند.
- --oformat=output-format
- ld ممکن است طوری پیکربندی شده باشد که از بیش از یک نوع فایل شیء (object file) پشتیبانی کند. اگر ld شما به این شکل پیکربندی شده است، میتوانید از گزینهٔ --oformat برای مشخص کردن قالب باینری برای فایل شیء خروجی استفاده کنید. حتی زمانی که ld برای پشتیبانی از قالبهای شیء جایگزین پیکربندی شده است، معمولاً نیازی به مشخص کردن این مورد ندارید، زیرا ld باید طوری پیکربندی شده باشد که رایجترین قالب را در هر ماشین به عنوان قالب خروجی پیشفرض تولید کند. output-format یک رشتهٔ متنی است که نام یک قالب خاص پشتیبانیشده توسط کتابخانههای BFD میباشد. (میتوانید قالبهای باینری موجود را با objdump -i فهرست کنید.) دستور اسکریپت "OUTPUT_FORMAT" نیز میتواند قالب خروجی را مشخص کند، اما این گزینه آن را لغو و جایگزین میکند.
- --out-implib file
- یک کتابخانهٔ واردات (import library) در file متناظر با فایل اجرایی که پیونددهنده در حال تولید آن است (مانند یک DLL یا برنامهٔ ELF) ایجاد میکند. این کتابخانهٔ واردات (که برای DLLها باید "*.dll.a" یا "*.a" نامگذاری شود) میتواند برای پیوند دادن کلاینتها به فایل اجراییِ تولیدشده استفاده شود؛ این رفتار امکان نادیده گرفتن مرحلهٔ مجزای ایجاد کتابخانهٔ واردات (مانند "dlltool" برای DLLها) را فراهم میسازد. این گزینه تنها برای پورتهای پیونددهندهای که i386 PE و ELF را هدف قرار میدهند در دسترس است.
- -pie
- --pic-executable
- یک فایل اجرایی مستقل از موقعیت (position independent executable) ایجاد میکند. این قابلیت در حال حاضر تنها روی بسترهای ELF پشتیبانی میشود. فایلهای اجرایی مستقل از موقعیت توسط پیونددهندهٔ پویا به آدرس مجازیای که سیستمعامل برای آنها انتخاب میکند منتقل (relocate) میشوند، که میتواند بین دفعات مختلف اجرا متغیر باشد. آنها در سرایند فایل ELF با عنوان ET_DYN علامتگذاری میشوند، اما از جهات متعددی با کتابخانههای اشتراکی تفاوت دارند. بهویژه، نمادهای تعریفشده در یک PIE بهطور پیشفرض نمیتوانند توسط شیء دیگری بازنویسی شوند، بر خلاف آنچه در یک کتابخانهٔ اشتراکی ممکن است رخ دهد.
- -no-pie
- یک فایل اجرایی وابسته به موقعیت ایجاد میکند. این حالت پیشفرض است.
- -qmagic
- این گزینه برای سازگاری با Linux نادیده گرفته میشود.
- -Qy
- این گزینه برای سازگاری با SVR4 نادیده گرفته میشود.
- --relax
- --no-relax
- گزینهای
با اثرات
وابسته به
ماشین. این
گزینه تنها
روی چند
معماری
مقصد
پشتیبانی
میشود.
در برخی از پلتفرمها، گزینهٔ --relax بهینهسازیهای سراسری و مختص مقصد را انجام میدهد که با حل کردن آدرسدهیها در برنامه توسط پیونددهنده امکانپذیر میشوند؛ مانند سادهسازی حالتهای آدرسدهی، ساخت دستورالعملهای جدید، انتخاب نسخههای کوتاهتر از دستورالعملهای فعلی، و ادغام مقادیر ثابت.
در برخی از پلتفرمها، این بهینهسازیهای سراسری در زمان پیوند ممکن است اشکالزدایی نمادین (symbolic debugging) فایل اجرایی حاصل را غیرممکن سازد. مشخص شده است که این مورد برای خانوادهٔ پردازندههای Matsushita MN10200 و MN10300 صدق میکند.
در پلتفرمهایی که این ویژگی پشتیبانی میشود، گزینهٔ --no-relax آن را غیرفعال میکند.
در پلتفرمهایی که این ویژگی پشتیبانی نمیشود، هر دو گزینهٔ --relax و --no-relax پذیرفته میشوند، اما نادیده گرفته خواهند شد.
- --retain-symbols-file=filename
- تنها
نمادهای
فهرستشده
در فایل filename
را حفظ کرده
و تمام
موارد دیگر
را دور
میاندازد.
filename صرفاً یک
فایل متنی
ساده با یک
نام نماد در
هر خط است.
این گزینه
بهویژه در
محیطهایی
(مانند VxWorks) که
در آنها یک
جدول نماد
سراسری
بزرگ
بهتدریج
انباشته
میشود،
جهت
صرفهجویی
در حافظهٔ
زمان اجرا
مفید است.
گزینهٔ --retain-symbols-file نمادهای تعریفنشده، یا نمادهای مورد نیاز برای بازآراییها را دور نمیاندازد.
تنها میتوانید یک بار --retain-symbols-file را در خط فرمان مشخص کنید. این گزینه -s و -S را لغو و جایگزین میکند.
- -rpath=dir
- یک
دایرکتوری
را به مسیر
جستجوی
کتابخانه
در زمان
اجرا اضافه
میکند. این
گزینه
هنگام
پیوند یک
فایل
اجرایی ELF با
اشیاء
اشتراکی
استفاده
میشود.
تمام
آرگومانهای
-rpath به
یکدیگر
الحاق شده و
به
پیونددهندهٔ
زمان اجرا
تحویل داده
میشوند،
که از آنها
برای یافتن
محل اشیاء
اشتراکی در
زمان اجرا
استفاده
میکند.
گزینهٔ -rpath همچنین هنگام یافتن محل اشیاء اشتراکی که مورد نیاز اشیاء اشتراکیِ دیگر که صریحاً در پیوند گنجانده شدهاند استفاده میشود؛ توضیحات مربوط به گزینهٔ -rpath-link را ببینید. جستجوی -rpath به این روش تنها توسط پیونددهندههای بومی و پیونددهندههای متقاطع که با گزینهٔ --with-sysroot پیکربندی شدهاند پشتیبانی میشود.
اگر هنگام پیوند یک فایل اجرایی ELF از -rpath استفاده نشود، محتویات متغیر محیطی "LD_RUN_PATH" در صورت تعریف شدن استفاده خواهد شد.
گزینهٔ -rpath ممکن است در SunOS نیز استفاده شود. بهطور پیشفرض در SunOS، پیونددهنده یک مسیر جستجوی زمان اجرا را از تمام گزینههای -L که به آن داده شده است تشکیل میدهد. اگر یک گزینهٔ -rpath استفاده شود، مسیر جستجوی زمان اجرا منحصراً با استفاده از گزینههای -rpath تشکیل میشود و گزینههای -L نادیده گرفته میشوند. این میتواند هنگام استفاده از gcc مفید باشد، که گزینههای -L متعددی را اضافه میکند که ممکن است روی سیستمهای فایل متصلشده از طریق NFS باشند.
برای سازگاری با سایر پیونددهندههای ELF، اگر پس از گزینهٔ -R بهجای نام فایل یک نام دایرکتوری بیاید، مانند گزینهٔ -rpath با آن رفتار میشود..IP -rpath-link=dir 4 هنگام استفاده از ELF یا SunOS، ممکن است یک کتابخانه اشتراکی به کتابخانه دیگری نیاز داشته باشد. این حالت زمانی رخ میدهد که یک پیوند "ld -shared" یک کتابخانه اشتراکی را به عنوان یکی از فایلهای ورودی در بر گیرد.
هنگامی که پیونددهنده در حین انجام یک پیوند غیر اشتراکی و غیر قابل بازنشانی (non-relocatable) با چنین وابستگیای مواجه میشود، در صورتی که آن کتابخانه به طور صریح گنجانده نشده باشد، به طور خودکار تلاش میکند تا کتابخانه اشتراکی مورد نیاز را یافته و آن را در پیوند بگنجاند. در چنین حالتی، چندین دایرکتوری به ترتیبی که در زیر شرح داده شده است جستجو میشوند. گزینه -rpath-link نخستین مجموعه از دایرکتوریها را برای جستجو مشخص میکند. این گزینه میتواند دنبالهای از نام دایرکتوریها را با ارائه فهرستی از نامهای جداشده با دونقطه (:) یا با تکرار چندینباره در خط فرمان مشخص نماید.
نشانههای $ORIGIN و $LIB میتوانند در این دایرکتوریهای جستجو قرار گیرند. این نشانهها با مسیر کامل به دایرکتوری حاوی برنامه یا شیء اشتراکی برای $ORIGIN، و برای $LIB با lib - برای باینریهای ۳۲ بیتی - یا lib64 - برای باینریهای ۶۴ بیتی - جایگزین خواهند شد.
شکل جایگزین این نشانهها - ${ORIGIN} و ${LIB} - نیز میتواند استفاده شود. نشانه $PLATFORM پشتیبانی نمیشود.
گزینه --rpath-link باید با احتیاط استفاده شود، چرا که مسیر جستجویی را که ممکن است به صورت ثابت درون یک کتابخانه اشتراکی کامپایل شده باشد بازنویسی میکند. در چنین حالتی ممکن است به طور ناخواسته از مسیر جستجوی متفاوتی نسبت به آنچه پیونددهنده زمان اجرا استفاده میکرد استفاده شود.
هنگامی که کتابخانههای اشتراکی اضافی مورد نیاز باشند، پیونددهنده دایرکتوریها را به ترتیبی که در زیر آمده است جستجو میکند تا آنها را بیابد. البته توجه داشته باشید که این موضوع تنها در مورد کتابخانههای اضافی صدق میکند که برای برآورده ساختن وابستگیهای کتابخانههای اشتراکی از قبل گنجاندهشده نیاز هستند. این مورد شامل کتابخانههایی که از طریق گزینه خط فرمان -l وارد میشوند نمیشود. جستجو برای کتابخانههای -l تنها در دایرکتوریهای مشخصشده با گزینه -L انجام میگیرد.
- 1.
- هر دایرکتوری مشخصشده توسط گزینههای -rpath-link.
- 2.
- هر دایرکتوری مشخصشده توسط گزینههای -rpath. تفاوت بین -rpath و -rpath-link در این است که دایرکتوریهای مشخصشده توسط گزینههای -rpath درون فایل اجرایی گنجانده شده و در زمان اجرا استفاده میشوند، در حالی که گزینه -rpath-link تنها در زمان پیوند مؤثر است. جستجوی -rpath به این روش تنها توسط پیونددهندههای بومی (native) و پیونددهندههای متقاطع (cross linker) که با گزینه --with-sysroot پیکربندی شدهاند پشتیبانی میشود.
- 3.
- در یک سیستم ELF، برای پیونددهندههای بومی، در صورتی که گزینههای -rpath و -rpath-link استفاده نشده باشند، محتویات متغیر محیطی "LD_RUN_PATH" جستجو میشود.
- 4.
- در SunOS، اگر از گزینه -rpath استفاده نشده باشد، هر دایرکتوری مشخصشده با استفاده از گزینههای -L جستجو میشود.
- 5.
- برای یک پیونددهنده بومی، محتویات متغیر محیطی "LD_LIBRARY_PATH" جستجو میشود.
- 6.
- برای یک پیونددهنده بومی ELF، دایرکتوریهای موجود در "DT_RUNPATH" یا "DT_RPATH" یک کتابخانه اشتراکی برای کتابخانههای اشتراکی مورد نیاز آن جستجو میشوند. در صورت وجود مدخلهای "DT_RUNPATH"، مدخلهای "DT_RPATH" نادیده گرفته میشوند.
- 7.
- برای یک پیونددهنده در سیستم لینوکس، در صورت وجود فایل /etc/ld.so.conf، فهرست دایرکتوریهای موجود در آن فایل جستجو میشود. نکته: مسیر این فایل با مقدار "sysroot" (در صورت تعریف شدن) و سپس با هر رشته "prefix" (در صورتی که پیونددهنده با گزینه --prefix=<path> پیکربندی شده باشد) پیشوندگذاری میشود.
- 8.
- برای یک پیونددهنده بومی در سیستم FreeBSD، هر دایرکتوری مشخصشده توسط ماکروی "_PATH_ELF_HINTS" تعریفشده در فایل سرآیند elf-hints.h.
- 9.
- هر دایرکتوری مشخصشده توسط دستور "SEARCH_DIR" در یک اسکریپت پیونددهنده که در خط فرمان داده شده باشد، از جمله اسکریپتهای مشخصشده با -T (اما نه -dT).
- 10.
- دایرکتوریهای پیشفرض، معمولاً /lib و /usr/lib.
- 11.
- هر دایرکتوری مشخصشده توسط افزونه LDPT_SET_EXTRA_LIBRARY_PATH.
- 12.
- هر دایرکتوری مشخصشده توسط دستور "SEARCH_DIR" در یک اسکریپت پیونددهنده پیشفرض.
با این حال در سیستمهای مبتنی بر لینوکس یک نکته احتیاطی دیگر وجود دارد: اگر گزینه --as-needed فعال باشد و یک کتابخانه اشتراکی یافت شود که به طور معمول جستجو را برآورده میکند و این کتابخانه فاقد تگ DT_NEEDED برای libc.so باشد و کتابخانه اشتراکی دیگری در ادامه مجموعه دایرکتوریهای جستجو وجود داشته باشد که آن نیز جستجو را برآورده کند و این کتابخانه دوم دارای تگ DT_NEEDED برای libc.so باشد، آنگاه کتابخانه دوم به جای کتابخانه اول انتخاب خواهد شد.
اگر کتابخانه اشتراکی مورد نیاز یافت نشود، پیونددهنده هشداری صادر کرده و به فرایند پیوند ادامه خواهد داد.
- --section-ordering-file=script
- این گزینه
برای گسترش
اسکریپت
پیونددهنده
فعلی با
نگاشتهای
اضافی
بخشهای
ورودی به
بخشهای
خروجی
استفاده
میشود. این
فایل باید
از همان نحو
"SECTIONS" که
در
اسکریپتهای
عادی
پیونددهنده
به کار
میرود
استفاده
کند، اما
نباید کاری
به جز قرار
دادن
بخشهای
ورودی در
بخشهای
خروجی
انجام دهد.
@pxref{SECTIONS}
محدودیت دوم در مورد اسکریپت ترتیببندی بخشها این است که تنها میتواند به بخشهای خروجیای ارجاع دهد که از قبل توسط هر اسکریپت پیونددهندهای که در حال حاضر فعال است تعریف شده باشند (یعنی اسکریپت پیونددهنده پیشفرض یا اسکریپت مشخصشده در خط فرمان). با این حال، مزیت اسکریپت ترتیببندی بخشها در این است که بخشهای ورودی به ابتدای بخشهای خروجی نگاشت میشوند، تا بتوانند ترتیب بخشها را درون بخش خروجی تضمین کنند. به عنوان مثال، فرض کنید اسکریپت پیونددهنده پیشفرض به شکل زیر باشد:
SECTIONS { .text : { *(.text.hot) ; *(.text .text.*) } .data : { *(.data.big) ; *(.data .data.*) } }سپس اگر فایل ترتیببندی بخشی مانند این استفاده شود:
.text : { *(.text.first) ; *(.text.z*) } .data : { foo.o(.data.first) ; *(.data.small) }این حالت معادل اسکریپت پیونددهندهای شبیه به این خواهد بود:
SECTIONS { .text : { *(.text.first) ; *(.text.z*) ; *(.text.hot) ; *(.text .text.*) } .data : { foo.o(.data.first) ; *(.data.small) ; *(.data.big) ; *(.data .data.*) } }مزیت فایل ترتیببندی بخش در این است که میتواند برای مرتبسازی آن بخشهایی که برای کاربر اهمیت دارند استفاده شود، بدون اینکه نیازی به نگرانی در مورد سایر بخشها، یا نواحی حافظه، یا هر چیز دیگری باشد.
- ایجاد یک کتابخانه اشتراکی. این قابلیت در حال حاضر تنها روی پلتفرمهای ELF، XCOFF و SunOS پشتیبانی میشود. در SunOS، اگر از گزینه -e استفاده نشود و نمادهای تعریفنشدهای در پیوند وجود داشته باشد، پیونددهنده به طور خودکار یک کتابخانه اشتراکی ایجاد خواهد کرد.
- --sort-common
- --sort-common=ascending
- --sort-common=descending
- این گزینه به ld میگوید که هنگام قرار دادن نمادهای عمومی (common symbols) در بخشهای خروجی مناسب، آنها را بر اساس تراز (alignment) به ترتیب صعودی یا نزولی مرتب کند. ترازهای نماد که مد نظر قرار میگیرند عبارتند از: شانزده بایتی یا بزرگتر، هشت بایتی، چهار بایتی، دو بایتی، و یک بایتی. این کار برای جلوگیری از ایجاد شکاف بین نمادها به دلیل محدودیتهای تراز است. اگر هیچ ترتیبی برای مرتبسازی مشخص نشود، ترتیب نزولی فرض خواهد شد.
- --sort-section=name
- این گزینه "SORT_BY_NAME" را برای تمام الگوهای عام (wildcard) بخش در اسکریپت پیونددهنده اعمال میکند.
- --sort-section=alignment
- این گزینه "SORT_BY_ALIGNMENT" را برای تمام الگوهای عام (wildcard) بخش در اسکریپت پیونددهنده اعمال میکند.
- --spare-dynamic-tags=count
- این گزینه تعداد جایگاههای خالی را که باید در بخش .dynamic اشیاء اشتراکی ELF باقی بمانند مشخص میکند. ممکن است ابزارهای پسپردازش مانند prelinker به جایگاههای خالی نیاز داشته باشند. مقدار پیشفرض 5 است..IP --split-by-file[=size] 4 مشابه --split-by-reloc است، اما با رسیدن به size، برای هر فایل ورودی یک بخش خروجی جدید ایجاد میکند. در صورت مشخص نشدن، مقدار پیشفرض size برابر با ۱ است.
- --split-by-reloc[=count]
- تلاش میکند بخشهای اضافی در فایل خروجی ایجاد کند تا هیچ بخش خروجی منفردی در فایل بیش از count بازنشانی نداشته باشد. این گزینه هنگام تولید فایلهای بازنشانیپذیر بزرگ برای بارگیری در هستههای بیدرنگ خاص با قالب فایل شیء COFF مفید است؛ چرا که COFF نمیتواند بیش از ۶۵۵۳۵ بازنشانی را در یک بخش نمایش دهد. توجه داشته باشید که این قابلیت با قالبهای فایل شیئی که از بخشهای دلخواه پشتیبانی نمیکنند، کار نخواهد کرد. پیونددهنده بخشهای ورودی منفرد را برای بازتوزیع تفکیک نمیکند، بنابراین اگر یک بخش ورودی منفرد شامل بیش از count بازنشانی باشد، یک بخش خروجی نیز شامل همان تعداد بازنشانی خواهد بود. مقدار پیشفرض count برابر با ۳۲۷۶۸ است.
- --stats[=filename]
- محاسبه و
نمایش آمار
مربوط به
عملکرد
پیونددهنده،
مانند زمان
اجرا و
میزان مصرف
حافظه.
اگر آرگومان اختیاری filename ارائه نشود، تنها اطلاعات پایهای گزارش شده و به جریان خروجی خطای استاندارد ارسال میشود. اگر آرگومان filename مشخص شود، اطلاعات گسترده در فایل نامبرده نوشته خواهد شد. اگر filename تنها برابر با نماد - تنظیم شود، اطلاعات گسترده به جریان خروجی استاندارد ارسال میگردد. اگر نام filename با + آغاز شود، فایل به جای حالت بازنویسی، در حالت الحاق (append) باز میشود.
اگر گزینهٔ -Map فعال شده باشد، اطلاعات در فایل نگاشت نیز ثبت خواهد شد. نکته: اگر به هر دو گزینهٔ --stats و -Map آرگومانهای filename داده شده باشد و مقدار آنها یکسان باشد، اطلاعات تنها یک بار نوشته خواهد شد نه دو بار.
اگر متغیر محیطی "LD_STATS" تعریف شده باشد، رفتاری مشابه گزینهٔ --stats خواهد داشت. اگر مقدار این متغیر یک رشته باشد، به عنوان نام فایلی که اطلاعات باید در آن ثبت شود استفاده میشود. در غیر این صورت، اطلاعات به جریان خروجی استاندارد ارسال خواهد شد. استفاده از این متغیر محیطی امکان ثبت آمار را بدون نیاز به تغییر خط فرمان پیونددهنده فراهم میکند. نکته: اگر هم از متغیر محیطی و هم از گزینهٔ --stats استفاده شود، گزینهٔ --stats اولویت دارد.
اطلاعات گستردهٔ گزارششده شامل زمان پردازنده (cpu time) مصرفشده است و اگر فراخوانی کتابخانهٔ سیستم getrusage() در دسترس باشد، میزان مصرف حافظه نیز ثبت میشود. این اطلاعات برای بخشهای مجزای فرایند پیوند، که فازها (phases) نامیده میشوند، گزارش میگردد. به علاوه، اطلاعات برای یک فاز ویژه به نام ALL که کل فرایند پیوند را پوشش میدهد نیز گزارش میشود. توجه داشته باشید که فازهای منفرد میتوانند همپوشانی داشته یا شامل یکدیگر باشند؛ بنابراین نباید تصور کرد که کل منابع مصرفشده توسط پیونددهنده، حاصلجمع منابع مصرفی فازهای منفرد است.
علاوه بر این، هنگام گزارش اطلاعات گسترده، نسخهٔ پیونددهنده، آرگومانهای خط فرمان و زمان شروع پیونددهنده نیز گنجانده میشوند. این امر مدیریت شرایطی را که در آن چندین پیوند توسط یک سامانهٔ ساخت فراخوانی میشوند، آسانتر کرده و تشخیص دقیق اینکه کدام آرگومانها مسئول تولید آمار گزارششده بودهاند را ممکن میسازد.
خروجی گسترده چیزی شبیه به این خواهد بود:
Stats: linker version: (GNU Binutils) 2.44.50.20250401 Stats: linker started: Wed Apr 2 09:36:41 2025 Stats: args: ld -z norelro -z nomemory-seal -z no-separate-code -o a.out [...] Stats: phase cpu time memory user time system time Stats: name (microsec) (KiB) (seconds) (seconds) Stats: ALL 390082 217740 0 0 Stats: ctf processing 12 0 0 0 Stats: string merge 1324 0 0 0 Stats: parsing 349 288 0 0 Stats: plugins 1 0 0 0 Stats: processing files 259616 214524 0 0 Stats: write 116493 0 0 0
- --no-stats
- گزارش آمارهای استفاده را در صورتی که از طریق گزینهٔ خط فرمان --stats یا متغیر محیطی LD_STATS فعال شده باشد، غیرفعال میکند.
- --sysroot=directory
- استفاده از directory به عنوان مکان sysroot، که مقدار پیشفرض زمان پیکربندی (configure) را لغو میکند. این گزینه تنها توسط پیونددهندههایی پشتیبانی میشود که با --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، نشانی اولین بایت از نخستین قطعه را مشخص میکند. توجه داشته باشید که هنگام استفاده از -pie به همراه -Ttext-segment=org، فایل اجرایی خروجی به صورت ET_EXEC علامتگذاری میشود تا تضمین شود نشانی اولین بایت از قطعهٔ text در زمان اجرا حتماً برابر با org خواهد بود.
- -Trodata-segment=org
- هنگام ایجاد یک فایل اجرایی ELF یا شیء مشترک (shared object) برای مقصدی که در آن دادههای فقطخواندنی در قطعهای مستقل و جدا از کد اجرایی (text) قرار دارند، نشانی اولین بایت از قطعهٔ دادههای فقطخواندنی را مشخص میکند.
- -Tldata-segment=org
- هنگام ایجاد یک فایل اجرایی ELF یا شیء مشترک برای مدل حافظهٔ متوسط در معماری x86-64، نشانی اولین بایت از قطعهٔ ldata را تعیین میکند.
- --unresolved-symbols=method
- نحوهٔ مدیریت نمادهای حلنشده را مشخص میکند. چهار مقدار ممکن برای method وجود دارد:
- ignore-all
- هیچ نماد حلنشدهای را گزارش نمیکند.
- report-all
- تمام نمادهای حلنشده را گزارش میدهد. این مقدار پیشفرض است.
- ignore-in-object-files
- نمادهای حلنشدهای را که در کتابخانههای مشترک قرار دارند گزارش میدهد، اما اگر مربوط به فایلهای شیء معمولی باشند از آنها صرفنظر میکند.
- ignore-in-shared-libs
- نمادهای حلنشدهای را که از فایلهای شیء معمولی میآیند گزارش میدهد، اما اگر مربوط به کتابخانههای مشترک باشند از آنها چشمپوشی میکند. این گزینه زمانی مفید است که یک فایل باینری پویا ایجاد میشود و اطمینان وجود دارد که تمام کتابخانههای مشترک مورد ارجاع، در خط فرمان پیونددهنده قید شدهاند.
رفتار مربوط به خود کتابخانههای مشترک نیز میتواند توسط گزینهٔ --[no-]allow-shlib-undefined کنترل شود.
بهطور معمول پیونددهنده برای هر نماد حلنشدهٔ گزارششده یک پیام خطا تولید میکند، اما گزینهٔ --warn-unresolved-symbols میتواند این خطاها را به هشدار تغییر دهد.
- --verbose[=NUMBER]
- شماره نسخهٔ ld را نمایش داده و شبیهسازهای پیونددهندهٔ پشتیبانیشده را فهرست میکند. نمایش میدهد که کدام فایلهای ورودی میتوانند و کدامیک نمیتوانند باز شوند. اسکریپت پیونددهندهای که توسط پیونددهنده در حال استفاده است را نمایش میدهد. اگر آرگومان اختیاری NUMBER بزرگتر از ۱ (> 1) باشد، وضعیت نمادهای پلاگین نیز نمایش داده خواهد شد.
- --version-script=version-scriptfile
- نام یک اسکریپت نسخه را برای پیونددهنده مشخص میکند. این گزینه معمولاً هنگام ایجاد کتابخانههای اشتراکی جهت مشخص کردن اطلاعات تکمیلی دربارهٔ سلسلهمراتب نسخه برای کتابخانهٔ در حال ساخت به کار میرود. این گزینه تنها روی بسترهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند به طور کامل پشتیبانی میشود؛ VERSION را ببینید. این گزینه روی بسترهای PE به صورت جزئی پشتیبانی میشود که میتوانند از اسکریپتهای نسخه برای فیلتر کردن نمایانی نمادها در حالت auto-export استفاده کنند: هر نمادی که در اسکریپت نسخه با عنوان local مشخص شود صادر نخواهد شد.
- --warn-common
- هنگامی که
یک نماد
مشترک با
نماد مشترک
دیگری یا با
تعریف یک
نماد ترکیب
شود هشدار
میدهد.
پیونددهندههای
Unix این شیوهٔ
تا حدی
تسامحآمیز
را مجاز
میدانند،
اما
پیونددهندهها
در برخی از
سیستمعاملهای
دیگر چنین
اجازهای
نمیدهند.
این گزینه
به شما
امکان
میدهد
مشکلات
احتمالی
ناشی از
ترکیب
نمادهای
سراسری را
بیابید.
متأسفانه
برخی
کتابخانههای
C از این
شیوه
استفاده
میکنند،
بنابراین
ممکن است
هشدارهایی
دربارهٔ
نمادها در
کتابخانهها
و همچنین در
برنامههای
خود دریافت
کنید.
سه نوع نماد سراسری وجود دارد که در اینجا با مثالهای C نشان داده شدهاند:
- int i = 1;
- یک تعریف، که در بخش دادههای مقداردهیشدهٔ فایل خروجی قرار میگیرد.
- extern int i;
- یک ارجاع تعریفنشده، که فضایی را تخصیص نمیدهد. باید در جایی تعریفی یا نماد مشترکی برای این متغیر وجود داشته باشد.
- int i;
- یک نماد مشترک. اگر فقط (یک یا چند) نماد مشترک برای یک متغیر وجود داشته باشد، به ناحیهٔ دادههای مقداردهینشدهٔ فایل خروجی میرود. پیونددهنده چندین نماد مشترک برای یک متغیر یکسان را در یک نماد ادغام میکند. اگر اندازههای متفاوتی داشته باشند، بزرگترین اندازه را انتخاب میکند. در صورتی که تعریفی از همان متغیر وجود داشته باشد، پیونددهنده نماد مشترک را به یک اعلان تبدیل میکند.
گزینهٔ --warn-common میتواند پنج نوع هشدار تولید کند. هر هشدار شامل یک جفت خط است: خط نخست نمادی را که بهتازگی با آن مواجه شده توصیف میکند، و خط دوم نماد قبلیِ مواجهشده با همان نام را توصیف میکند. یک یا هر دوی این دو نماد، نماد مشترک خواهند بود.
- 1.
- تبدیل یک
نماد مشترک
به یک
ارجاع،
زیرا از پیش
تعریفی
برای این
نماد وجود
دارد.
<file>(<section>): warning: common of `<symbol>' overridden by definition <file>(<section>): warning: defined here
- 2.
- تبدیل یک
نماد مشترک
به یک
ارجاع،
زیرا در
ادامه با
تعریفی
برای این
نماد مواجه
شده است.
این مورد
مانند مورد
پیشین است،
جز اینکه با
نمادها به
ترتیبی
متفاوت
مواجه شده
است.
<file>(<section>): warning: definition of `<symbol>' overriding common <file>(<section>): warning: common is here
- 3.
- ادغام یک
نماد مشترک
با یک نماد
مشترک قبلی
با همان
اندازه.
<file>(<section>): warning: multiple common of `<symbol>' <file>(<section>): warning: previous common is here
- 4.
- ادغام یک
نماد مشترک
با یک نماد
مشترک
قبلیِ
بزرگتر.
<file>(<section>): warning: common of `<symbol>' overridden by larger common <file>(<section>): warning: larger common is here
- 5.
- ادغام یک
نماد مشترک
با یک نماد
مشترک
قبلیِ
کوچکتر.
این مورد
مانند مورد
پیشین است،
به جز اینکه
با نمادها
به ترتیبی
متفاوت
مواجه شده
است.
<file>(<section>): warning: common of `<symbol>' overriding smaller common <file>(<section>): warning: smaller common is here
- --warn-constructors
- اگر هر سازندهٔ سراسری استفاده شده باشد هشدار میدهد. این فقط برای چند قالب فایل شیء مفید است. برای قالبهایی مانند COFF یا ELF، پیونددهنده نمیتواند استفاده از سازندههای سراسری را تشخیص دهد.
- --warn-execstack
- --warn-execstack-objects
- --no-warn-execstack
- در بسترهای ELF، اگر از پیونددهنده خواسته شود فایل خروجی حاوی یک پشتهٔ قابل اجرا ایجاد کند، ممکن است پیامهای هشداری تولید کند. سه وضعیت ممکن وجود دارد:
- 1.
- هیچ هشداری تولید نکند.
- 2.
- همیشه هشدار تولید کند، حتی اگر پشتهٔ قابل اجرا از طریق گزینهٔ خط فرمان -z execstack درخواست شده باشد.
- 3.
- فقط در صورتی هشدار تولید کند که یک فایل شیء پشتهٔ قابل اجرا را درخواست کند، اما نه در حالتی که از گزینهٔ -z execstack استفاده شده باشد.
وضعیت پیشفرض بستگی به نحوهٔ پیکربندی پیونددهنده در زمان ساخت دارد. گزینهٔ --no-warn-execstack همواره پیونددهنده را در وضعیت بدون هشدار قرار میدهد. گزینهٔ --warn-execstack پیونددهنده را در وضعیت همیشه هشدار قرار میدهد. گزینهٔ --warn-execstack-objects پیونددهنده را در وضعیت هشدار فقط برای فایلهای شیء قرار میدهد.
نکته: فایلهای ورودی در قالب ELF میتوانند با داشتن بخش .note.GNU-stack همراه با تنظیم بودن بیت قابل اجرا در پرچمهای بخش خود، مشخص کنند که به پشتهٔ قابل اجرا نیاز دارند. آنها میتوانند با داشتن همان بخش، اما بدون تنظیم بودن بیت پرچم قابلیت اجرا، مشخص کنند که نیازی به پشتهٔ قابل اجرا ندارند. اگر یک فایل ورودی دارای بخش .note.GNU-stack نباشد، رفتار پیشفرض وابسته به معماری مقصد است. برای برخی اهداف، نبود چنین بخشی به این معناست که پشتهٔ قابل اجرا لازم است. این موضوع اغلب برای فایلهای اسمبلی دستساز یک مشکل به شمار میرود.
- --error-execstack
- --no-error-execstack
- اگر
پیونددهنده
قصد تولید
پیام هشدار
دربارهٔ
پشتهٔ قابل
اجرا را
داشته
باشد،
گزینهٔ --error-execstack
آن هشدار را
به یک خطا
تبدیل
میکند.
توجه - این
گزینه
وضعیت
تولید
هشدار execstack
پیونددهنده
را تغییر
نمیدهد.
برای تنظیم
یک وضعیت
هشداردهی
مشخص، از
--warn-execstack یا --warn-execstack-objects
استفاده
کنید.
گزینهٔ --no-error-execstack رفتار پیشفرض تولید پیامهای هشدار را بازیابی میکند.
- --warn-multiple-gp
- اگر مقادیر متعددی از اشارهگر سراسری در فایل خروجی مورد نیاز باشد، هشدار میدهد. این امر تنها برای برخی پردازندههای خاص، مانند Alpha، معنادار است. به طور مشخص، برخی پردازندهها مقادیر ثابت بزرگ را در بخشی ویژه قرار میدهند. یک ثبات خاص (اشارهگر سراسری) به میانهٔ این بخش اشاره میکند، تا ثابتها بتوانند از طریق یک حالت آدرسدهی نسبی به ثبات پایه بهطور کارآمد بارگذاری شوند. از آنجا که آفست در حالت نسبی به ثبات پایه ثابت و نسبتاً کوچک است (برای نمونه ۱۶ بیت)، این امر حداکثر اندازهٔ مخزن ثابتها را محدود میکند. بنابراین در برنامههای بزرگ، اغلب لازم است از مقادیر متعددی از اشارهگر سراسری استفاده شود تا بتوان همهٔ ثابتهای ممکن را آدرسدهی کرد. این گزینه باعث صدور هشدار در زمان رخ دادن این حالت میشود.
- --warn-once
- برای هر نماد تعریفنشده تنها یک بار هشدار میدهد، به جای آنکه به ازای هر ماژولی که به آن ارجاع دارد یک هشدار صادر کند..IP --warn-rwx-segments 4
- --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
- هشدار میدهد اگر نشانی یک بخش (section) خروجی به دلیل ترازسازی (alignment) تغییر کند. بهطور معمول، ترازسازی توسط یک بخش ورودی تعیین میشود. نشانی تنها در صورتی تغییر میکند که صراحتاً مشخص نشده باشد؛ یعنی اگر دستور "SECTIONS" نشانی آغازی برای آن بخش مشخص نکرده باشد.
- --warn-textrel
- هشدار میدهد اگر پیونددهنده DT_TEXTREL را به یک فایل اجرایی مستقل از موقعیت (PIE) یا شیء اشتراکی اضافه کند.
- --warn-alternate-em
- هشدار میدهد اگر یک شیء دارای کد ماشین جایگزین ELF باشد.
- --warn-unresolved-symbols
- اگر پیونددهنده قرار باشد یک نماد حلنشده را گزارش کند (گزینهٔ --unresolved-symbols را ببینید)، معمولاً یک خطا ایجاد میکند. این گزینه باعث میشود که به جای آن یک هشدار ایجاد کند.
- --error-unresolved-symbols
- رفتار پیشفرض پیونددهنده مبنی بر ایجاد خطا هنگام گزارش نمادهای حلنشده را بازمیگرداند.
- --whole-archive
- برای هر
بایگانی (archive)
ذکر شده در
خط فرمان پس
از گزینهٔ
--whole-archive، تمام
فایلهای
شیء درون آن
بایگانی را
در پیوند
لحاظ
میکند، به
جای آنکه
بایگانی را
صرفاً برای
فایلهای
شیء مورد
نیاز جستجو
کند. این
گزینه
معمولاً
برای تبدیل
یک فایل
بایگانی به
یک
کتابخانه
اشتراکی
استفاده
میشود و
درج اجباری
تمام اشیاء
را در
کتابخانهٔ
اشتراکیِ
حاصل تحمیل
میکند. از
این گزینه
میتوان
بیش از یک
بار
استفاده
کرد.
دو نکته هنگام استفاده از این گزینه از طریق gcc: نخست، gcc این گزینه را نمیشناسد، بنابراین باید از -Wl,-whole-archive استفاده کنید. دوم، فراموش نکنید که پس از فهرست بایگانیهای خود از -Wl,-no-whole-archive استفاده نمایید، چرا که gcc فهرست بایگانیهای خود را به پیوند شما اضافه میکند و ممکن است نخواهید این پرچم بر آنها نیز تأثیر بگذارد.
- --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. در صورتی که اطلاعات بازگشت پشتهٔ تولیدشده توسط پیونددهنده پشتیبانی شود، این گزینه بهطور پیشفرض روشن است. این گزینه همچنین تولید اطلاعات ردگیری پشته (stack trace) در ".sframe" را برای بخشهای کد تولیدشده توسط پیونددهنده مانند PLT کنترل میکند.
- --enable-new-dtags
- --disable-new-dtags
- این پیونددهنده میتواند برچسبهای پویای جدید (dynamic tags) را در ELF ایجاد کند. اما ممکن است سیستمهای قدیمیتر ELF آنها را درک نکنند. اگر --enable-new-dtags را مشخص کنید، برچسبهای پویای جدید بر حسب نیاز ایجاد شده و برچسبهای پویای قدیمیتر نادیده گرفته میشوند. اگر --disable-new-dtags را مشخص کنید، هیچ برچسب پویای جدیدی ایجاد نخواهد شد. بهطور پیشفرض، برچسبهای پویای جدید ایجاد نمیشوند. توجه داشته باشید که این گزینهها تنها برای سیستمهای ELF در دسترس هستند.
- --hash-size=number
- اندازهٔ پیشفرض جدولهای درهمسازی (hash tables) پیونددهنده را روی یک عدد اول نزدیک به number تنظیم میکند. افزایش این مقدار میتواند مدتزمان لازم برای انجام وظایف پیونددهنده را به بهای افزایش نیازمندیهای حافظه پیونددهنده کاهش دهد. به همین ترتیب، کاهش این مقدار میتواند نیازمندیهای حافظه را به بهای کاهش سرعت کاهش دهد.
- --hash-style=style
- نوع جدول(های) درهمسازی پیونددهنده را تعیین میکند. مقدار style میتواند "sysv" برای بخش کلاسیک ".hash" در ELF، مقدار "gnu" برای بخش سبک جدید گنو ".gnu.hash"، یا "both" برای هر دو جدول درهمسازی سنتی ELF ".hash" و سبک جدید گنو ".gnu.hash" باشد. پیشفرض بستگی به نحوهٔ پیکربندی پیونددهنده دارد، اما برای بیشتر سیستمهای مبتنی بر لینوکس "both" خواهد بود.
- --compress-debug-sections=none
- --compress-debug-sections=zlib
- --compress-debug-sections=zlib-gnu
- --compress-debug-sections=zlib-gabi
- --compress-debug-sections=zstd
- در بسترهای
ELF، این
گزینهها
نحوهٔ
فشردهسازی
بخشهای
اشکالزدایی
DWARF را با
استفاده از
zlib کنترل
میکنند.
گزینهٔ --compress-debug-sections=none بخشهای اشکالزدایی DWARF را فشرده نمیکند. گزینهٔ --compress-debug-sections=zlib-gnu بخشهای اشکالزدایی DWARF را فشرده کرده و نام آنها را تغییر میدهد تا به جای .debug با .zdebug آغاز شوند. گزینهٔ --compress-debug-sections=zlib-gabi نیز بخشهای اشکالزدایی DWARF را فشرده میکند، اما به جای تغییر نام، پرچم SHF_COMPRESSED را در سرآیند بخشها تنظیم مینماید.
گزینهٔ --compress-debug-sections=zlib نام مستعاری برای --compress-debug-sections=zlib-gabi است.
گزینهٔ --compress-debug-sections=zstd بخشهای اشکالزدایی DWARF را با استفاده از zstd فشرده میکند.
توجه داشته باشید که این گزینه بر هرگونه فشردهسازی در بخشهای اشکالزدایی ورودی ارجحیت دارد؛ بنابراین به عنوان مثال اگر یک دودویی با --compress-debug-sections=none پیوند داده شود، هر بخش اشکالزدایی فشرده در فایلهای ورودی پیش از کپی شدن در دودویی خروجی از حالت فشرده خارج خواهد شد.
رفتار فشردهسازی پیشفرض بسته به معماری مقصد مورد نظر و گزینههای پیکربندیِ استفادهشده در ساخت زنجیره ابزار (toolchain) متفاوت است. رفتار پیشفرض را میتوان با بررسی خروجی گزینهٔ --help پیونددهنده مشخص کرد..IP --reduce-memory-overheads 4 این گزینه نیازمندیهای حافظه را در زمان اجرای ld به قیمت کاهش سرعت پیوند دادن کاهش میدهد. این گزینه برای انتخاب الگوریتم قدیمی O(n^2) جهت تولید فایل نگاشت پیوند (link map)، به جای الگوریتم جدید O(n) که حدود ۴۰٪ حافظه بیشتری برای ذخیرهسازی نمادها مصرف میکند، معرفی شد.
اثر دیگر این سوئیچ، تنظیم اندازه پیشفرض جدول درهمسازی (hash table) روی ۱۰۲۱ است که باز هم به بهای افزایش زمان اجرای پیونددهنده در مصرف حافظه صرفهجویی میکند. با این حال اگر از سوئیچ --hash-size استفاده شده باشد، این کار انجام نمیشود.
همچنین ممکن است در نسخههای آینده پیونددهنده از سوئیچ --reduce-memory-overheads برای فعالسازی مصالحهها و موازنههای دیگری نیز استفاده شود.
- --max-cache-size=size
- ld معمولاً اطلاعات بازآرایی (relocation) و جدولهای نماد فایلهای ورودی را با اندازه نامحدود در حافظه نهان (cache) ذخیره میکند. این گزینه حداکثر اندازه حافظه نهان را روی size تنظیم میکند.
- --build-id
- --build-id=style
- درخواست
ایجاد یک
بخش
یادداشت ELF
با نام
".note.gnu.build-id" یا
یک بخش COFF با
نام ".buildid".
محتویات
این
یادداشت
بیتهای
یکتایی
هستند که
این فایل
پیوند
خورده را
مشخص
میکنند.
مقدار style
میتواند
"uuid" برای
استفاده از
۱۲۸ بیت
تصادفی؛
"sha1" برای
استفاده از
یک
درهمساز
۱۶۰ بیتی SHA1،
"md5" برای
استفاده از
یک
درهمساز
۱۲۸ بیتی MD5،
یا "xx"
برای
استفاده از
یک XXHASH صد و
بیست و هشت
بیتی بر روی
بخشهای
هنجاری
محتوای
خروجی؛ یا
"0xhexstring"
برای
استفاده از
یک رشته
بیتی
برگزیده که
بهصورت
تعداد زوجی
از ارقام
هگزادسیمال
مشخص شده
باشد
(نویسههای
"-" و
":" بین
جفتارقام
نادیده
گرفته
میشوند).
اگر style ذکر
نشود،
"sha1"
استفاده
میشود.
سبکهای "md5"، "sha1" و "xx" شناسهای تولید میکنند که در یک فایل خروجی یکسان همواره یکسان است، اما تقریباً بهطور قطع میان تمام فایلهای خروجی غیریکسان منحصربهفرد خواهد بود. این شناسه برای مقایسه به عنوان یک جمع کنترلی (checksum) برای محتوای فایل در نظر گرفته نشده است. یک فایل پیوند خورده ممکن است بعداً توسط ابزارهای دیگر تغییر کند، اما رشته بیتی شناسه ساخت (build ID) که فایل پیوند خورده اولیه را مشخص میکند تغییر نمییابد.
ارسال مقدار "none" برای style، تنظیمات ناشی از هر گزینه "--build-id" قبلی در خط فرمان را غیرفعال میکند.
- --package-metadata=JSON
- درخواست ایجاد یک بخش یادداشت ELF با نام ".note.package". محتوای این یادداشت، طبق مشخصات فراداده بسته (package metadata)، در قالب JSON است. برای اطلاعات بیشتر ببینید: https://systemd.io/ELF_PACKAGE_METADATA آرگومان JSON از کدگذاری درصدی (percent-encoding) و کدگذاریهای %[string] زیر (که در آن string به نام نویسه در مرجع نویسههای نامدار HTML اشاره دارد) پشتیبانی میکند: %[comma] برای ,، %[lbrace] برای {، %[quot] برای "، %[rbrace] برای } و %[space] برای نویسه فاصله (space). اگر آرگومان JSON وجود نداشته باشد یا خالی باشد، در صورتی که با تکرار قبلی گزینه --package-metadata فعال شده باشد، ایجاد یادداشت فراداده غیرفعال خواهد شد. اگر پیونددهنده با libjansson ساخته شده باشد، رشته JSON اعتبارسنجی خواهد شد.
پیونددهنده i386 PE از گزینه -shared پشتیبانی میکند که باعث میشود خروجی به جای یک فایل اجرایی عادی، یک کتابخانه پیوند پویا (DLL) باشد. هنگام استفاده از این گزینه، باید نام خروجی را "*.dll" بگذارید. علاوه بر این، پیونددهنده کاملاً از فایلهای استاندارد "*.def" پشتیبانی میکند که میتوانند مانند یک فایل شیء (object file) در خط فرمان پیونددهنده مشخص شوند (در واقع، باید پیش از بایگانیهایی که نمادها را از آنها صادر میکند قرار گیرد تا اطمینان حاصل شود که مانند یک فایل شیء عادی پیوند داده میشوند).
علاوه بر گزینههای مشترک میان همه هدفها، پیونددهنده i386 PE از گزینههای خط فرمان اضافی مختص به هدف i386 PE پشتیبانی میکند. گزینههایی که مقدار میگیرند میتوانند با یک فاصله یا علامت مساوی از مقادیر خود جدا شوند.
- --add-stdcall-alias
- در صورت تعیین، نمادهای دارای پسوند stdcall (@nn) هم به همان صورت اولیه و هم با حذف پسوند صادر خواهند شد. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --base-file file
- استفاده از file به عنوان نام فایلی که در آن آدرسهای پایه تمام بازآراییهای مورد نیاز برای تولید DLLها با dlltool ذخیره میشود. [این یک گزینه مختص i386 PE است]
- --dll
- ایجاد یک DLL به جای یک فایل اجرایی معمولی. همچنین میتوانید از -shared استفاده کرده یا یک "LIBRARY" را در یک فایل ".def" مشخص کنید. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --enable-long-section-names
- --disable-long-section-names
- گونههای PE از قالب شیء COFF افزونهای اضافه میکنند که امکان استفاده از نامهای بخش با طول بیش از هشت نویسه (محدودیت معمول برای COFF) را فراهم میکند. بهطور پیشفرض، این نامها فقط در فایلهای شیء مجاز هستند، زیرا ایمیجهای اجرایی کاملاً پیوند خورده جدول رشتههای COFF مورد نیاز برای پشتیبانی از نامهای طولانیتر را همراه ندارند. به عنوان یک افزونه گنو (GNU)، با استفاده از این دو گزینه میتوان استفاده از آنها را در ایمیجهای اجرایی نیز مجاز کرد یا (احتمالاً بدون فایده!) آن را در فایلهای شیء غیرمجاز ساخت. ایمیجهای اجرایی تولید شده با این نامهای طولانی بخش تا حدودی غیر استاندارد هستند زیرا یک جدول رشته را با خود حمل میکنند، و ممکن است هنگام بررسی با ابزارهای غیر گنو آشنا به PE، مانند نمایشدهندهها و دامپرهای فایل، خروجیهای گیجکنندهای ایجاد کنند. با این حال، GDB برای یافتن بخشهای اطلاعات اشکالزدایی Dwarf-2 در یک ایمیج اجرایی در زمان اجرا، به استفاده از نامهای طولانی بخش PE وابسته است؛ بنابراین اگر هیچکدام از گزینهها در خط فرمان مشخص نشده باشند، در صورتی که ld هنگام پیوند یک ایمیج اجرایی و بدون حذف نمادها متوجه حضور اطلاعات اشکالزدایی شود، با نادیده گرفتن رفتار پیشفرض و از نظر فنی درست، نامهای بخش طولانی را فعال میکند. [این گزینه برای تمام پورتهای هدف PE در پیونددهنده معتبر است]
- --enable-stdcall-fixup
- --disable-stdcall-fixup
- اگر پیوند با نمادی روبهرو شود که قادر به حلوفصل آن نباشد، تلاش میکند با جستجوی نماد تعریفشده دیگری که تفاوت آن تنها در قالب نام نماد است (cdecl در برابر stdcall)، «پیوند فازی» (fuzzy linking) انجام داده و با پیوند دادن به نماد منطبق، آن نماد را حلوفصل کند. به عنوان مثال، نماد تعریفنشده "_foo" ممکن است به تابع "_foo@12" پیوند یابد، یا نماد تعریفنشده "_bar@16" ممکن است به تابع "_bar" پیوند داده شود. هنگامی که پیونددهنده این کار را انجام میدهد، یک هشدار چاپ میکند؛ زیرا در حالت عادی پیوند باید با شکست مواجه میشد، اما گاهی اوقات کتابخانههای وارداتی (import libraries) تولید شده از DLLهای شخص ثالث ممکن است برای قابل استفاده بودن به این ویژگی نیاز داشته باشند. اگر --enable-stdcall-fixup را مشخص کنید، این ویژگی کاملاً فعال شده و هشدارها چاپ نمیشوند. اگر --disable-stdcall-fixup را مشخص کنید، این ویژگی غیرفعال شده و چنین عدمتطابقهایی به عنوان خطا در نظر گرفته میشوند. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --leading-underscore
- --no-leading-underscore
- برای اکثر هدفها پیشوند پیشفرض نمادها یک زیرخط (underscore) است و در توصیف هدف تعریف شده است. با این گزینه میتوان پیشوند پیشفرض زیرخط برای نمادها را غیرفعال/فعال کرد.
- --export-all-symbols
- در صورت تعیین، تمام نمادهای سراسری (global) در اشیایی که برای ساخت DLL استفاده شدهاند توسط DLL صادر خواهند شد. توجه داشته باشید که اگر در غیر این صورت هیچ نماد صادرشدهای وجود نداشته باشد، این حالت پیشفرض است. هنگامی که نمادها صراحتاً از طریق فایلهای DEF یا به صورت ضمنی از طریق ویژگیهای تابع صادر میشوند، پیشفرض این است که هیچ چیز دیگری صادر نشود مگر اینکه این گزینه تعیین شده باشد. توجه داشته باشید که نمادهای "DllMain@12"، "DllEntryPoint@0"، "DllMainCRTStartup@12" و "impure_ptr" به صورت خودکار صادر نخواهند شد. همچنین، نمادهای وارد شده از سایر DLLها بازصادر نخواهند شد، و نمادهایی که چیدمان داخلی DLL را مشخص میکنند، مانند نمادهایی که با "_head_" شروع میشوند یا به "_iname" ختم میشوند نیز صادر نمیشوند. علاوه بر این، هیچ نمادی از "libgcc"، "libstd++"، "libmingw32" یا "crtX.o" صادر نخواهد شد. برای کمک به DLLهای ++C، نمادهایی که نام آنها با "__rtti_" یا "__builtin_" شروع میشود صادر نخواهند شد. در نهایت، فهرست گستردهای از نمادهای خصوصی cygwin وجود دارد که صادر نمیشوند (بدیهی است که این امر هنگام ساخت DLLها برای هدفهای cygwin اعمال میشود). این استثناهای cygwin عبارتند از: "_cygwin_dll_entry@12"، "_cygwin_crt0_common@8"، "_cygwin_noncygwin_dll_entry@12"، "_fmode"، "_impure_ptr"، "cygwin_attach_dll"، "cygwin_premain0"، "cygwin_premain1"، "cygwin_premain2"، "cygwin_premain3" و "environ". [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --exclude-symbols symbol,symbol,...
- فهرستی از نمادها را مشخص میکند که نباید به طور خودکار صادر شوند. نام نمادها ممکن است با کاما یا دونقطه از هم جدا شوند. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --exclude-all-symbols
- مشخص میکند که هیچ نمادی نباید به طور خودکار صادر شود. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است]
- --file-alignment
- تراز فایل (file alignment) را مشخص میکند. بخشها در فایل همواره از آفستهایی در فایل آغاز میشوند که مضربی از این عدد هستند. مقدار پیشفرض ۵۱۲ است. [این گزینه مختص پورت هدف i386 PE در پیونددهنده است].IP "--heap reserve" 4
- --heap reserve,commit
- تعداد بایتهای حافظه را برای رزرو (و در صورت تمایل تخصیص قطعی / commit) جهت استفاده بهعنوان هیپ (heap) برای این برنامه مشخص میکند. مقدار پیشفرض ۱ مگابایت رزروشده و ۴ کیلوبایت تخصیصیافته است. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --kill-at
- در صورت مشخص شدن، پسوندهای stdcall (بهصورت @nn) پیش از برونسپاری نمادها از آنها حذف میشوند. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --large-address-aware
- در صورت مشخص شدن، بیت مربوطه در فیلد "Characteristics" از سرآیند COFF تنظیم میشود تا نشان دهد این فایل اجرایی از آدرسهای مجازی بزرگتر از ۲ گیگابایت پشتیبانی میکند. این گزینه باید همراه با سوییچ /3GB یا /USERVA=value مگابایتی در بخش "[operating systems]" فایل BOOT.INI استفاده شود؛ در غیر این صورت، این بیت هیچ اثری نخواهد داشت. [این گزینه مختص پورتهای هدف PE پیونددهنده است]
- --disable-large-address-aware
- اثر گزینه پیشین --large-address-aware را لغو میکند. این مورد زمانی مفید است که --large-address-aware همواره توسط گرداننده کامپایلر (مانند Cygwin gcc) تنظیم میشود و فایل اجرایی از آدرسهای مجازی بزرگتر از ۲ گیگابایت پشتیبانی نمیکند. [این گزینه مختص پورتهای هدف PE پیونددهنده است]
- --major-image-version value
- شماره اصلی (major) از "image version" را تعیین میکند. مقدار پیشفرض 1 است. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --major-os-version value
- شماره اصلی (major) از "os version" را تعیین میکند. مقدار پیشفرض 4 است. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --major-subsystem-version value
- شماره اصلی (major) از "subsystem version" را تعیین میکند. مقدار پیشفرض 4 است. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --minor-image-version value
- شماره فرعی (minor) از "image version" را تعیین میکند. مقدار پیشفرض 0 است. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --minor-os-version value
- شماره فرعی (minor) از "os version" را تعیین میکند. مقدار پیشفرض 0 است. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --minor-subsystem-version value
- شماره فرعی (minor) از "subsystem version" را تعیین میکند. مقدار پیشفرض 0 است. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --output-def file
- پیونددهنده فایل file را ایجاد خواهد کرد که حاوی یک فایل DEF متناظر با DLL تولیدی توسط پیونددهنده است. این فایل DEF (که باید با نام "*.def" ذخیره شود) میتواند برای ایجاد یک کتابخانه واردسازی با "dlltool" به کار رود یا بهعنوان مرجعی برای نمادهای برونسپاریشدهی خودکار یا ضمنی استفاده شود. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --enable-auto-image-base
- --enable-auto-image-base=value
- بهطور خودکار پایهی تصویر (image base) را برای DLLها انتخاب میکند، که بهصورت اختیاری با مقدار پایهی value شروع میشود، مگر اینکه با آرگومان "--image-base" پایهای مشخص شده باشد. با استفاده از هش تولیدشده از dllname برای ساخت پایههای تصویر یکتا برای هر DLL، از تداخلها و بازنشانیهای حافظه (relocationها) که میتوانند اجرای برنامه را به تأخیر بیندازند، جلوگیری میشود. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --disable-auto-image-base
- پایهی تصویر یکتا را بهطور خودکار تولید نمیکند. اگر پایهی تصویر توسط کاربر مشخص نشده باشد ("--image-base")، از پیشفرض سکو استفاده میشود. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --dll-search-prefix string
- هنگام پیوند پویای یک dll بدون کتابخانه واردسازی، ترجیحاً بهجای "lib<basename>.dll" به دنبال "<string><basename>.dll" میگردد. این رفتار امکان تمایز آسان میان DLLهای ساختهشده برای «زیرسکوها»ی مختلف (مانند native، cygwin، uwin، pw و غیره) را فراهم میآورد. به عنوان نمونه، DLLهای cygwin معمولاً از "--dll-search-prefix=cyg" استفاده میکنند. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --enable-auto-import
- پیوند
پیشرفتهای
را بین
"_symbol" و
"__imp__symbol"
برای
واردسازی
دادهها (DATA)
از DLLها
انجام
میدهد، در
نتیجه دور
زدن
سازوکار dllimport
از طرف
کاربر و
ارجاع به
نام
نمادهای
دستنخورده
(unmangled) را ممکن
میسازد.
[این گزینه
مختص پورت
هدف i386 PE
پیونددهنده
است]
توضیحات زیر به پیادهسازی اولیه این قابلیت مربوط میشود و امروزه برای مقصدهای Cygwin و MinGW منسوخ شده است.
نکته: استفاده از افزونهی 'auto-import' باعث میشود که بخش text از فایل تصویر قابلنوشتن شود. این امر با مشخصات قالب PE-COFF ارائهشده توسط Microsoft مطابقت ندارد.
نکته - استفاده از افزونهی 'auto-import' همچنین موجب میشود دادههای فقطخواندنی که معمولاً در بخش .rdata قرار میگرفتند، در بخش .data قرار داده شوند. این امر برای دور زدن مشکلی با ثوابت (const) است که در اینجا شرح داده شده است: http://www.cygwin.com/ml/cygwin/2004-09/msg01101.html
استفاده از 'auto-import' معمولاً «بدون مشکل کار خواهد کرد» -- اما گاهی اوقات ممکن است این پیام را ببینید:
"variable '<var>' can't be auto-imported. Please read the documentation for ld's "--enable-auto-import" for details."
این پیام زمانی رخ میدهد که یک (زیر)عبارت به آدرسی دسترسی پیدا کند که در نهایت حاصل جمع دو مقدار ثابت باشد (جدولهای واردسازی Win32 تنها یکی را مجاز میدانند). مواردی که این وضعیت ممکن است در آنها رخ دهد شامل دسترسی به فیلدهای عضو متغیرهای struct واردشده از یک DLL، و همچنین استفاده از یک اندیس ثابت در متغیر آرایهای واردشده از یک DLL است. هر متغیر چندکلمهای (آرایهها، structها، long long و غیره) ممکن است باعث بروز این وضعیت خطا شود. با این وجود، صرفنظر از نوع دادهی دقیق متغیر صادرشدهی ناسازگار، ld همواره آن را تشخیص میدهد، هشدار را صادر کرده و خارج میشود.
صرفنظر از نوع دادهی متغیر صادرشده، روشهای متعددی برای حل این مشکل وجود دارد:
یک روش، استفاده از سوییچ --enable-runtime-pseudo-reloc است. این کار وظیفهی تنظیم ارجاعها در کد سمت کلاینت شما را به محیط زمان اجرا واگذار میکند؛ بنابراین این روش تنها زمانی کار میکند که محیط زمان اجرا از این ویژگی پشتیبانی کند.
راهکار دوم وادار کردن یکی از «ثوابت» به متغیر بودن است -- بدین معنا که در زمان کامپایل ناشناخته و غیرقابل بهینهسازی باشد. برای آرایهها، دو احتمال وجود دارد: الف) متغیر ساختن آدرس آرایه (مورد اندیسگذاری شده)، یا ب) متغیر ساختن اندیس «ثابت». بدین ترتیب:
extern type extern_array[]; extern_array[1] --> { volatile type *t=extern_array; t[1] }یا
extern type extern_array[]; extern_array[1] --> { volatile int t=1; extern_array[t] }برای structها (و بیشتر انواع دادهی چندکلمهای دیگر) تنها گزینه این است که خود struct (یا long long، یا ...) را متغیر کنید:
extern struct s extern_struct; extern_struct.field --> { volatile struct s *t=&extern_struct; t->field }یا
extern long long extern_ll; extern_ll --> { volatile long long * local_ll=&extern_ll; *local_ll }روش سوم برای رفع این دشواری، رها کردن 'auto-import' برای نماد مشکلساز و نشانهگذاری آن با "__declspec(dllimport)" است. با این حال، در عمل این کار مستلزم استفاده از #defineهای زمان کامپایل است تا مشخص شود آیا در حال ساخت یک DLL هستید، یا ساخت کد کلاینتی که به DLL پیوند میخورد، یا صرفاً ساخت/پیوند با یک کتابخانه ایستا. هنگام انتخاب میان روشهای مختلف برای حل مشکل «آدرس مستقیم با آفست ثابت»، باید کاربردهای معمول در دنیای واقعی را در نظر بگیرید:
حالت اولیه:
--foo.h extern int arr[]; --foo.c #include "foo.h" void main(int argc, char **argv){ printf("%d\n",arr[1]); }راهکار ۱: --foo.h extern int arr[]; --foo.c #include "foo.h" void main(int argc, char **argv){ /* This workaround is for win32 and cygwin; do not "optimize" */ volatile int *parr = arr; printf("%d\n",parr[1]); }
راهکار ۲:
--foo.h /* Note: auto-export is assumed (no __declspec(dllexport)) */ #if (defined(_WIN32) || defined(__CYGWIN__)) && \ !(defined(FOO_BUILD_DLL) || defined(FOO_STATIC)) #define FOO_IMPORT __declspec(dllimport) #else #define FOO_IMPORT #endif extern FOO_IMPORT int arr[]; --foo.c #include "foo.h" void main(int argc, char **argv){ printf("%d\n",arr[1]); }چهارمین راه برای اجتناب از این مشکل، بازنویسی کتابخانه است تا به جای یک رابط دادهای، از یک رابط تابعی برای متغیرهای مربوطه استفاده کند (مانند توابع دستیابی set_foo() و get_foo()).
- --disable-auto-import
- تلاشی برای انجام پیوند پیچیدهٔ "_symbol" به "__imp__symbol" برای واردسازی DATA از DLLها انجام نده. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --enable-runtime-pseudo-reloc
- اگر کد شما شامل عبارات توصیفشده در بخش --enable-auto-import باشد، یعنی واردسازی DATA از DLL با آفست غیرصفر، این سوئیچ برداری از «شبهبازمکانیهای زمان اجرا» ('runtime pseudo relocations') ایجاد میکند که میتواند توسط محیط زمان اجرا برای تنظیم ارجاعات به چنین دادههایی در کد کلاینت استفاده شود. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --disable-runtime-pseudo-reloc
- برای واردسازیهای DATA با آفست غیرصفر از DLLها، شبهبازمکانی ایجاد نکن. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --enable-extra-pe-debug
- اطلاعات اشکالزدایی اضافی مربوط به thunking نمادهای auto-import را نمایش بده. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --section-alignment
- چینش بخش (section alignment) را تنظیم میکند. بخشها در حافظه همیشه از آدرسهایی آغاز میشوند که مضربی از این عدد باشند. مقدار پیشفرض 0x1000 است. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --stack reserve
- --stack reserve,commit
- تعداد بایتهای حافظه را برای رزرو (و به طور اختیاری تخصیص قطعی یا commit) جهت استفاده به عنوان پشته (stack) برای این برنامه مشخص میکند. مقدار پیشفرض 2MB رزروشده و 4K تخصیصیافته است. [این گزینه مختص پورت هدف i386 PE پیونددهنده است]
- --subsystem which
- --subsystem which:major
- --subsystem which:major.minor
- زیرسیستمی
را تعیین
میکند که
برنامهٔ
شما تحت آن
اجرا خواهد
شد. مقادیر
مجاز برای
which عبارتند
از "native"،
"windows"،
"console"،
"posix" و
"xbox".
همچنین
میتوانید
به صورت
اختیاری
نسخهٔ
زیرسیستم
را نیز
تنظیم کنید.
مقادیر
عددی نیز
برای which
پذیرفته
میشوند.
[این گزینه
مختص پورت
هدف i386 PE
پیونددهنده
است]
گزینههای زیر پرچمهایی را در فیلد "DllCharacteristics" سرایند فایل PE تنظیم میکنند: [این گزینهها مختص پورتهای هدف PE پیونددهنده هستند]
- --high-entropy-va
- --disable-high-entropy-va
- ایمیج با
تصادفیسازی
چیدمان
فضای آدرس
۶۴ بیتی (ASLR)
سازگار است.
این گزینه
بهطور
پیشفرض
برای
ایمیجهای
PE ۶۴ بیتی در
مقاصد MinGW
فعال است.
این گزینه همچنین متضمن --dynamicbase و --enable-reloc-section است.
- --dynamicbase
- --disable-dynamicbase
- آدرس پایهٔ ایمیج ممکن است با استفاده از تصادفیسازی چیدمان فضای آدرس (ASLR) جابهجا شود. این ویژگی با MS Windows Vista برای مقاصد i386 PE معرفی شد. این گزینه بهطور پیشفرض برای مقاصد MinGW فعال است اما میتوان آن را از طریق گزینهٔ --disable-dynamicbase غیرفعال کرد. این گزینه همچنین متضمن --enable-reloc-section است.
- --forceinteg
- --disable-forceinteg
- بررسیهای یکپارچگی کد اجباری میشوند. این گزینه بهطور پیشفرض غیرفعال است.
- --nxcompat
- --disable-nxcompat
- ایمیج با قابلیت جلوگیری از اجرای دادهها (Data Execution Prevention یا DEP) سازگار است. این ویژگی با MS Windows XP SP2 برای مقاصد i386 PE معرفی شد. این گزینه بهطور پیشفرض برای مقاصد MinGW فعال است.
- --no-isolation
- --disable-no-isolation
- اگرچه ایمیج مفهوم جداسازی (isolation) را درک میکند، اما ایمیج را جداسازی نکن. این گزینه بهطور پیشفرض غیرفعال است.
- --no-seh
- --disable-no-seh
- ایمیج از SEH استفاده نمیکند. هیچ گردانندهٔ SE نباید از این ایمیج فراخوانی شود. این گزینه بهطور پیشفرض غیرفعال است.
- --no-bind
- --disable-no-bind
- این ایمیج را مقید (bind) نکن. این گزینه بهطور پیشفرض غیرفعال است.
- --wdmdriver
- --disable-wdmdriver
- گرداننده (driver) از 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) خواهد بود..IP --enable-reloc-section 4
- --disable-reloc-section
- جدول بازآرایی پایه (base relocation table) را ایجاد میکند، که اگر ایمیج در پایهای متفاوت از آنچه در سرایند PE مشخص شده بارگذاری شود، ضروری است. این گزینه بهطور پیشفرض فعال است.
مقصد C6X uClinux از یک قالب باینری به نام DSBT برای پشتیبانی از کتابخانههای اشتراکی استفاده میکند. هر کتابخانه اشتراکی در سیستم باید یک شاخص یکتا داشته باشد؛ تمام فایلهای اجرایی از شاخص 0 استفاده میکنند.
- --dsbt-size size
- این گزینه تعداد مدخلهای موجود در DSBT فایل اجرایی یا کتابخانه اشتراکی فعلی را به size تنظیم میکند. حالت پیشفرض، ایجاد جدولی با 64 مدخل است.
- --dsbt-index index
- این گزینه
شاخص DSBT فایل
اجرایی یا
کتابخانه
اشتراکی
فعلی را به
index تنظیم
میکند.
پیشفرض 0
است که برای
تولید
فایلهای
اجرایی
مناسب است.
اگر یک
کتابخانه
اشتراکی با
شاخص DSBT
برابر با 0
تولید شود،
بازآراییهای
"R_C6000_DSBT_INDEX" در
فایل خروجی
کپی
میشوند.
سوییچ --no-merge-exidx-entries ادغام مدخلهای مجاور exidx را در اطلاعات بازپیچی فریم (frame unwind info) غیرفعال میکند.
- --branch-stub
- این گزینه با درج بخشهای تهیچک انشعاب (branch stub) در زمان نیاز برای گسترش دامنه انشعابها، تعدیل انشعاب (branch relaxation) پیونددهنده را فعال میکند. این گزینه معمولاً مورد نیاز نیست چرا که C-SKY از دستورالعملهای پرش و فراخوانی پشتیبانی میکند که میتوانند به کل محدوده حافظه دسترسی داشته باشند و تعدیل انشعاب معمولاً توسط کامپایلر یا اسمبلر انجام میشود.
- --stub-group-size=N
- این گزینه امکان کنترل دقیقتر ایجاد تهیچکهای انشعاب توسط پیونددهنده را فراهم میکند. این گزینه حداکثر اندازه گروهی از بخشهای ورودی را که میتواند توسط یک بخش تهیچک مدیریت شود، تعیین میکند. مقدار منفی برای N بخشهای تهیچک را بعد از انشعابهای آنها قرار میدهد، در حالی که یک مقدار مثبت اجازه میدهد بخشهای تهیچک پیش یا پس از انشعابها ظاهر شوند. مقادیر 1 یا -1 نشان میدهند که پیونددهنده باید پیشفرضهای مناسب را انتخاب کند.
پیونددهندههای 68HC11 و 68HC12 از گزینههای ویژهای برای کنترل نگاشت تعویض بانک حافظه و تولید کد ترامپولین (trampoline) پشتیبانی میکنند.
- --no-trampoline
- این گزینه تولید ترامپولین را غیرفعال میکند. بهطور پیشفرض برای هر تابع دور (far function) که با استفاده از یک دستورالعمل "jsr" فراخوانی شود، یک ترامپولین ایجاد میشود (این حالت زمانی رخ میدهد که اشارهگری به یک تابع دور گرفته شود).
- --bank-window name
- این گزینه نام ناحیه حافظه در مشخصات MEMORY را که پنجره بانک حافظه را توصیف میکند به پیونددهنده اعلام میکند. تعریف این ناحیه سپس توسط پیونددهنده برای محاسبه صفحهبندی و آدرسها درون پنجره حافظه استفاده میشود.
گزینههای زیر برای کنترل مدیریت تولید GOT هنگام پیوند زدن برای مقصدهای 68K پشتیبانی میشوند.
- --got=type
- این گزینه به پیونددهنده میگوید که از کدام طرح تولید GOT استفاده کند. type باید یکی از مقادیر single، negative، multigot یا target باشد. برای اطلاعات بیشتر به مدخل Info برای ld مراجعه کنید.
گزینههای زیر برای کنترل تولید دستورالعملهای microMIPS و بررسیهای بازآرایی انشعاب جهت انتقالهای حالت ISA هنگام پیوند زدن برای مقصدهای MIPS پشتیبانی میشوند.
- --insn32
- --no-insn32
- این گزینهها انتخاب دستورالعملهای microMIPS بهکاررفته در کدهای تولیدشده توسط پیونددهنده، مانند موارد موجود در PLT یا تهیچکهای پیوند تنبل (lazy binding stubs) یا در تعدیل را کنترل میکنند. اگر --insn32 استفاده شود، پیونددهنده فقط از کدگذاریهای دستورالعمل 32-بیتی استفاده میکند. بهطور پیشفرض یا در صورت استفاده از --no-insn32، تمام کدگذاریهای دستورالعمل، از جمله موارد 16-بیتی در صورت امکان، استفاده میشوند.
- --ignore-branch-isa
- --no-ignore-branch-isa
- این گزینهها بررسیهای بازآرایی انشعاب را برای انتقالهای نامعتبر حالت ISA کنترل میکنند. اگر --ignore-branch-isa استفاده شود، پیونددهنده هرگونه بازآرایی انشعاب را میپذیرد و هر انتقال حالت ISA مورد نیاز در محاسبات بازآرایی نادیده گرفته میشود، به جز در برخی موارد دستورالعملهای "BAL" که شرایط تعدیل را برآورده میکنند و هنگام محاسبه بازآرایی مرتبط، به دستورالعملهای معادل "JALX" تبدیل میشوند. بهطور پیشفرض یا اگر --no-ignore-branch-isa استفاده شود، بررسی انجام میگیرد که سبب میشود از دست رفتن یک انتقال حالت ISA منجر به تولید خطا شود.
- --compact-branches
- --no-compact-branches
- این گزینهها تولید دستورالعملهای فشرده (compact instructions) توسط پیونددهنده را در مدخلهای PLT برای MIPS R6 کنترل میکنند.
برای مقصد pdp11-aout، سه گونه از قالب خروجی را میتوان با گزینههای زیر تولید و انتخاب کرد. گونه پیشفرض برای pdp11-aout گزینه --omagic است، در حالی که برای سایر مقصدها --nmagic پیشفرض است. گزینه --imagic تنها برای مقصد pdp11-aout تعریف شده است، در حالی که گزینههای دیگر در اینجا همانطور که برای مقصد pdp11-aout اعمال میشوند شرح داده شدهاند.
- -N
- --omagic
- خروجی را به عنوان "OMAGIC" (0407) در سرایند a.out علامتگذاری میکند تا نشان دهد بخش متن (text segment) نباید دارای حافظت نوشتن و بهصورت اشتراکی باشد. از آنجا که هر دو بخش متن و داده خواندنی و نوشتنی هستند، بخش داده بلافاصله و بهصورت پیوسته پس از بخش متن تخصیص مییابد. این قدیمیترین قالب برای برنامههای اجرایی PDP11 است و از ابتدا تا 2.11BSD قالب پیشفرض برای ld روی سیستمهای یونیکس PDP11 بوده است.
- -n
- --nmagic
- خروجی را به عنوان "NMAGIC" (0410) در سرایند a.out علامتگذاری میکند تا نشان دهد هنگامی که فایل خروجی اجرا میشود، بخش متن فقطخواندنی و بین تمام فرایندهایی که همان فایل را اجرا میکنند قابل اشتراک خواهد بود. این کار مستلزم انتقال نواحی داده تا اولین مرز ممکن صفحه 8K بایتی پس از انتهای متن است. این گزینه یک قالب pure executable (اجرایی خالص) ایجاد میکند.
- -z
- --imagic
- خروجی را به عنوان "IMAGIC" (0411) در سرایند a.out علامتگذاری میکند تا نشان دهد هنگامی که فایل خروجی اجرا میشود، نواحی متن و داده برنامه با استفاده از قابلیت تفکیک فضای دستورالعمل و داده در واحد مدیریت حافظه (MMU) در مدلهای بزرگتر PDP11، در فضاهای آدرس جداگانه بارگذاری خواهند شد. این کار فضای آدرس در دسترس برنامه را دو برابر میکند. بخش متن مجدداً خالص، دارای حفاظت نوشتن و قابل اشتراک است. تنها تفاوت در قالب خروجی بین این گزینه و سایرین، علاوه بر عدد جادویی، این است که هر دو بخش متن و داده از مکان 0 شروع میشوند. گزینه -z این قالب را در 2.11BSD انتخاب میکرد. این گزینه یک قالب separate executable (اجرایی تفکیکشده) ایجاد میکند.
- --no-omagic
- معادل --nmagic برای pdp11-aout..SH "محیط (ENVIRONMENT)" شما میتوانید رفتار ld را با متغیرهای محیطی "GNUTARGET"، "LDEMULATION" و "COLLECT_NO_DEMANGLE" تغییر دهید.
متغیر "GNUTARGET" در صورتی که از -b (یا معادل آن --format) استفاده نکنید، قالب شیء فایل ورودی را تعیین میکند. مقدار آن باید یکی از نامهای BFD برای قالبهای ورودی باشد. اگر "GNUTARGET" در محیط تعریف نشده باشد، ld از قالب طبیعی هدف استفاده میکند. اگر "GNUTARGET" روی "default" تنظیم شده باشد، BFD تلاش میکند تا با بررسی فایلهای باینری ورودی، قالب ورودی را شناسایی کند؛ این روش معمولاً موفقیتآمیز است، اما ابهاماتی نیز در بر دارد؛ زیرا هیچ روشی برای اطمینان از یکتا بودن عدد جادویی استفادهشده برای مشخص کردن قالبهای فایل شیء وجود ندارد. با این وجود، فرایند پیکربندی BFD در هر سیستم، قالب مرسوم آن سیستم را در ابتدای فهرست جستوجو قرار میدهد، بنابراین ابهامات به نفع روش مرسوم برطرف میشوند.
متغیر "LDEMULATION" در صورت عدم استفاده از گزینهٔ -m، شبیهسازی پیشفرض را تعیین میکند. این شبیهسازی میتواند بر جنبههای گوناگون رفتار پیونددهنده، بهویژه اسکریپت پیشفرض پیونددهنده تأثیر بگذارد. میتوانید شبیهسازیهای در دسترس را با گزینههای --verbose یا -V فهرست کنید. اگر گزینهٔ -m استفاده نشود و متغیر محیطی "LDEMULATION" نیز تعریف نشده باشد، شبیهسازی پیشفرض به نحوهٔ پیکربندی پیونددهنده بستگی خواهد داشت.
بهطور معمول، رفتار پیشفرض پیونددهنده بازگردانی نام نمادها (demangle) است. با این حال، اگر "COLLECT_NO_DEMANGLE" در محیط تنظیم شده باشد، رفتار پیشفرض عدم بازگردانی نامها خواهد بود. این متغیر محیطی بهروش مشابهی توسط برنامهٔ لفاف پیونددهندهٔ "gcc" نیز استفاده میشود. این پیشفرض میتواند توسط گزینههای --demangle و --no-demangle لغو شود.
اگر گزینهٔ خاص PE/COFF یعنی --insert-timestamp فعال باشد و متغیر محیطی SOURCE_DATE_EPOCH تعریف شده باشد، مقدار برچسب زمانی موجود در این متغیر بهجای زمان کنونی در سرآیند COFF درج خواهد شد.
اگر متغیر محیطی "LD_STATS" تعریف شده باشد، اطلاعات استفاده از منابع پیونددهنده درست مانند زمانی که گزینهٔ --stats استفاده شده باشد، ضبط میشود. اگر متغیر "LD_STATS" دارای یک مقدار رشتهای باشد، از آن بهعنوان نام فایلی که اطلاعات باید در آن ذخیره شود استفاده خواهد شد. در غیر این صورت، اطلاعات به جریان خروجی استاندارد فرستاده میشود.
همچنین ببینید (SEE ALSO)
ar(1)، nm(1)، objcopy(1)، objdump(1)، readelf(1) و مدخلهای Info برای binutils و ld.
کپیرایت و تکثیر (COPYRIGHT)
حق نشر (c) 1991-2025 متعلق است به Free Software Foundation, Inc.
اجازهٔ کپی، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نسخهٔ 1.3 یا هر نسخهٔ متأخر دیگری که توسط بنیاد نرمافزارهای آزاد (Free Software Foundation) منتشر شده باشد داده میشود؛ بدون بخشهای تغییرناپذیر، بدون متنهای روی جلد و بدون متنهای پشت جلد. نسخهای از این مجوز در بخشی با عنوان «GNU Free Documentation License» گنجانده شده است.
| 2025-11-10 | binutils-2.45.1 |