| LD(1) | GNU Development Tools | LD(1) |
نام (NAME)
ld - پیونددهنده گنو
خلاصه دستور (SYNOPSIS)
ld [options] objfile ...
توضیحات (DESCRIPTION)
دستور ld تعدادی از فایلهای شیء (object) و آرشیو را با یکدیگر ترکیب کرده، دادههای آنها را بازنشانی (relocate) میکند و ارجاعات نمادها (symbols) را به هم پیوند میدهد. معمولاً آخرین مرحله در کامپایل یک برنامه، اجرای ld است.
دستور ld فایلهای زبان دستور پیونددهنده (Linker Command Language) را که در ابرمجموعهای از نحو «زبان دستور ویرایشگر پیوند AT&T» نوشته شدهاند میپذیرد تا کنترلی صریح و کامل بر فرآیند پیوند زدن فراهم آورد.
این صفحهٔ راهنما زبان دستور را شرح نمیدهد؛ برای جزئیات کامل پیرامون زبان دستور و سایر جنبههای پیونددهنده گنو، مدخل ld را در "info" ببینید.
این نسخه از ld از کتابخانههای چندمنظورهٔ BFD برای کار روی فایلهای شیء استفاده میکند. این امر به ld اجازه میدهد تا فایلهای شیء را در قالبهای بسیار متفاوتی بخواند، ترکیب کند و بنویسد---برای نمونه، COFF یا "a.out". قالبهای گوناگون را میتوان با یکدیگر پیوند داد تا هر نوع فایل شیء موجودی تولید شود.
گذشته از انعطافپذیری، پیونددهنده گنو در ارائهٔ اطلاعات عیبیابی نسبت به سایر پیونددهندهها بسیار کارآمدتر است. بسیاری از پیونددهندهها به محض مواجهه با یک خطا فوراً اجرا را متوقف میکنند؛ اما در صورت امکان، ld به اجرا ادامه میدهد تا بتوانید خطاهای دیگر را نیز شناسایی کنید (یا در مواردی، علیرغم خطا یک فایل خروجی دریافت نمایید).
پیونددهنده گنو ld به نحوی طراحی شده تا طیف گستردهای از شرایط را پوشش دهد و تا جای ممکن با سایر پیونددهندهها سازگار باشد. در نتیجه، گزینههای متعددی برای کنترل رفتار آن در اختیارتان قرار دارد.
گزینهها (OPTIONS)
این پیونددهنده از انبوهی از گزینههای خط فرمان پشتیبانی میکند، اما در عمل تنها تعداد اندکی از آنها در زمینههای خاص به کار گرفته میشوند. به عنوان مثال، یک کاربرد متداول ld پیوند زدن فایلهای شیء استاندارد Unix روی یک سیستم استاندارد و پشتیبانیشدهٔ Unix است. در چنین سیستمی، برای پیوند زدن یک فایل "hello.o":
ld -o <output> /lib/crt0.o hello.o -lc
این فرمان به ld اعلام میکند تا در نتیجهٔ پیوند زدن فایل "/lib/crt0.o" با "hello.o" و کتابخانهٔ "libc.a" (که از دایرکتوریهای جستجوی استاندارد تأمین میشود)، فایلی به نام output تولید کند. (توضیحات مربوط به گزینهٔ -l را در زیر ببینید.)
برخی از گزینههای خط فرمان ld را میتوان در هر کجای خط فرمان قرار داد. با این حال، گزینههایی که به فایلها ارجاع دارند، مانند -l یا -T، باعث میشوند فایل مورد نظر دقیقاً در همان موقعیتی که گزینه در خط فرمان ظاهر شده (نسبت به فایلهای شیء و سایر گزینههای فایلی) خوانده شود. تکرار گزینههای غیرفایلی با یک آرگومان دیگر، یا اثری نخواهد داشت یا موارد قبلی آن گزینه (مواردی که در سمت چپ خط فرمان آمدهاند) را بازنویسی و لغو میکند. گزینههایی که تعیین چندبارهٔ آنها معنادار است، در توضیحات زیر مشخص شدهاند.
آرگومانهای غیرگزینهای عبارتاند از فایلهای شیء یا آرشیوهایی که باید با یکدیگر پیوند یابند. آنها میتوانند قبل، بعد یا در میان گزینههای خط فرمان قرار گیرند؛ بهجز اینکه یک آرگومان فایل شیء نباید میان یک گزینه و آرگومان اختصاصی آن واقع شود.
معمولاً پیونددهنده دستکم با یک فایل شیء فراخوانی میشود، اما میتوانید اشکال دیگری از فایلهای ورودی دودویی را با استفاده از -l، -R و زبان دستور اسکریپت تعیین نمایید. اگر هیچ فایل ورودی دودویی مشخص نشده باشد، پیونددهنده هیچ خروجیای تولید نکرده و پیام No input files را نمایش میدهد.
اگر پیونددهنده نتواند قالب یک فایل شیء را شناسایی کند، آن را به عنوان یک اسکریپت پیونددهنده تلقی خواهد کرد. اسکریپتی که به این صورت مشخص شود، اسکریپت اصلی پیونددهنده را (خواه اسکریپت پیشفرض باشد یا اسکریپتی که با -T معین شده) تکمیل میکند. این قابلیت به پیونددهنده اجازه میدهد فایلی را پیوند بزند که ظاهراً یک فایل شیء یا آرشیو است، اما در واقع تنها مقادیری از چند نماد را تعریف میکند یا از "INPUT" یا "GROUP" برای بارگیری اشیاء دیگر بهره میبرد. تعیین یک اسکریپت با این روش صرفاً اسکریپت اصلی را با قرار دادن دستورات اضافی بعد از آن تکمیل میکند؛ برای جایگزینی کامل اسکریپت پیشفرض پیونددهنده از گزینهٔ -T استفاده نمایید، اما اثر دستور "INSERT" را نیز در نظر داشته باشید.
برای گزینههایی که نامشان یک تکحرف است، آرگومانهای گزینه یا باید بلافاصله و بدون هیچ فاصله بعد از حرف گزینه بیایند، یا به صورت آرگومانی مجزا درست پس از گزینهای که به آن نیاز دارد درج شوند.
برای گزینههایی با نام چندحرفی، میتوان یک خط تیره یا دو خط تیره پیش از نام گزینه استفاده کرد؛ برای نمونه، -trace-symbol و --trace-symbol معادل یکدیگر هستند. توجه داشته باشید---تنها یک استثنا برای این قاعده وجود دارد: گزینههای چندحرفی که با حرف کوچک 'o' شروع میشوند تنها میتوانند با دو خط تیره آغاز شوند. هدف از این کار، کاهش اشتباه با گزینهٔ -o است. بنابراین، برای مثال -omagic نام فایل خروجی را به magic تغییر میدهد، در حالی که --omagic پرچم NMAGIC را روی خروجی تنظیم مینماید.
آرگومانهای گزینههای چندحرفی یا باید با یک علامت مساوی از نام گزینه جدا شوند، یا به عنوان آرگومانی مجزا بلافاصله پس از گزینهای که به آنها نیاز دارد قرار گیرند. برای نمونه، --trace-symbol foo و --trace-symbol=foo معادل هستند. همچنین مخففهای یکتا از نام گزینههای چندحرفی نیز پذیرفته میشوند.
توجه---اگر پیونددهنده به صورت غیرمستقیم و از طریق یک راهانداز کامپایلر (مانند gcc) فراخوانی میشود، تمام گزینههای خط فرمان پیونددهنده باید پیشوند -Wl, (یا معادل مناسب آن برای آن راهانداز خاص کامپایلر) داشته باشند؛ به این شکل:
gcc -Wl,--start-group foo.o bar.o -Wl,--end-group
این نکته حائز اهمیت است؛ زیرا در غیر این صورت برنامهٔ راهانداز کامپایلر ممکن است بدون هیچ هشداری گزینههای پیونددهنده را نادیده بگیرد که به پیوندی نادرست منجر میشود. هنگام ارسال گزینههای نیازمند آرگومان از طریق راهانداز نیز ممکن است ابهام پیش بیاید، چرا که فاصلهٔ میان گزینه و آرگومان به عنوان جداکننده عمل کرده و سبب میشود راهانداز تنها گزینه را به پیونددهنده و آرگومان را به کامپایلر ارسال کند. در این شرایط، سادهترین راهکار استفاده از حالت پیوستهٔ گزینههای تکحرفی و چندحرفی است؛ مانند:
gcc foo.o bar.o -Wl,-eENTRY -Wl,-Map=a.map
در ادامه جدولی از سوییچهای عمومی خط فرمان که توسط پیونددهنده گنو پذیرفته میشوند آمده است:
- @file
- گزینههای
خط فرمان را
از file
میخواند.
گزینههای
خواندهشده
دقیقاً در
جای گزینهٔ
اصلی @file
جایگزین
میشوند.
اگر file وجود
نداشته
باشد یا
قابل
خواندن
نباشد، با
گزینه به
همان شکل
لغوی
برخورد شده
و حذف
نخواهد شد.
گزینهها در file با نویسهٔ فاصله از یکدیگر جدا میشوند. میتوان با محصور کردن کل یک گزینه میان گیومهٔ تکی یا دوگانه، نویسهٔ فاصله را درون آن گنجاند. هر نویسهای (از جمله بکاسلش) را میتوان با درج یک بکاسلش در پیش از آن درج کرد. خود file نیز میتواند شامل گزینههای @file بیشتری باشد؛ هرگونه گزینهای از این دست به صورت بازگشتی پردازش خواهد شد..IP "-a keyword" 4 این گزینه برای سازگاری با HP/UX پشتیبانی میشود. آرگومان keyword باید یکی از رشتههای archive، shared یا default باشد. -aarchive از نظر عملکرد معادل -Bstatic است و دو کلیدواژهٔ دیگر از نظر عملکرد معادل -Bdynamic هستند. این گزینه را میتوان به هر تعداد بار استفاده کرد.
- --audit AUDITLIB
- مقدار AUDITLIB را به مدخل "DT_AUDIT" از بخش پویا اضافه میکند. وجود AUDITLIB بررسی نمیشود و همچنین از DT_SONAME مشخصشده در کتابخانه استفاده نخواهد کرد. در صورت تعیین چندباره، "DT_AUDIT" شامل فهرستی جداشده با دونقطه از رابطهای حسابرسی مورد استفاده خواهد بود. اگر پیونددهنده هنگام جستجو برای کتابخانههای مشترک، شیئی با مدخل حسابرسی بیابد، مدخل متناظر "DT_DEPAUDIT" را در فایل خروجی اضافه خواهد کرد. این گزینه تنها بر روی بسترهای ELF که از رابط rtld-audit پشتیبانی میکنند معنی دارد.
- -b input-format
- --format=input-format
- ممکن است ld
طوری
پیکربندی
شده باشد که
از بیش از
یک نوع فایل
شیء
پشتیبانی
کند. اگر ld
شما بدین
صورت
پیکربندی
شده باشد،
میتوانید
از گزینهٔ
-b برای
تعیین قالب
باینریِ
فایلهای
شیء ورودی
که پس از
این گزینه
در خط فرمان
میآیند،
استفاده
کنید. حتی
هنگامی که
ld برای
پشتیبانی
از
قالبهای
شیء
جایگزین
پیکربندی
شده باشد،
معمولاً
نیازی
ندارید این
گزینه را
مشخص کنید،
زیرا ld
باید طوری
پیکربندی
شده باشد که
متداولترین
قالب در هر
ماشین را به
عنوان قالب
ورودی
پیشفرض در
نظر بگیرد.
input-format یک
رشتهٔ متنی
و نام قالبی
خاص است که
توسط
کتابخانههای
BFD پشتیبانی
میشود.
(میتوانید
قالبهای
باینری
موجود را با
objdump -i فهرست
کنید.)
اگر فایلهایی با قالب باینری نامعمول را پیوند میدهید، ممکن است بخواهید از این گزینه استفاده کنید. همچنین میتوانید با قرار دادن -b input-format قبل از هر گروه از فایلهای شیء با یک قالب خاص، از -b برای تغییر صریح قالبها (هنگام پیوند فایلهای شیء با قالبهای مختلف) استفاده کنید.
قالب پیشفرض از متغیر محیطی "GNUTARGET" گرفته میشود.
همچنین میتوانید قالب ورودی را از طریق یک اسکریپت و با استفاده از دستور "TARGET" تعریف کنید؛
- -c MRI-commandfile
- --mri-script=MRI-commandfile
- برای سازگاری با پیونددهندههای تولیدشده توسط MRI، برنامهٔ ld فایلهای اسکریپت نوشتهشده به یک زبان دستور جایگزین و محدود را میپذیرد که در بخش «فایلهای اسکریپت سازگار با MRI» در مستندات GNU ld شرح داده شده است. فایلهای اسکریپت MRI را با گزینهٔ -c معرفی کنید؛ برای اجرای اسکریپتهای پیونددهندهای که به زبان اسکریپتنویسی همهمنظورهٔ ld نوشته شدهاند از گزینهٔ -T استفاده کنید. اگر MRI-cmdfile وجود نداشته باشد، ld آن را در پوشههای مشخصشده توسط هر یک از گزینههای -L جستجو میکند.
- -d
- -dc
- -dp
- این سه گزینه معادل یکدیگرند؛ اشکال مختلف برای سازگاری با سایر پیونددهندهها پشتیبانی میشوند. آنها حتی در صورت مشخص شدن فایل خروجی بازجابجاییپذیر (با -r)، فضایی به نمادهای مشترک اختصاص میدهند. دستور اسکریپت "FORCE_COMMON_ALLOCATION" تأثیر یکسانی دارد.
- --depaudit AUDITLIB
- -P AUDITLIB
- مقدار AUDITLIB را به مدخل "DT_DEPAUDIT" از بخش پویا اضافه میکند. وجود AUDITLIB بررسی نمیشود و همچنین از DT_SONAME مشخصشده در کتابخانه استفاده نخواهد کرد. در صورت تعیین چندباره، "DT_DEPAUDIT" شامل فهرستی جداشده با دونقطه از رابطهای حسابرسی مورد استفاده خواهد بود. این گزینه تنها در بسترهای ELF که از رابط rtld-audit پشتیبانی میکنند معنی دارد. گزینهٔ -P برای سازگاری با Solaris ارائه شده است.
- --enable-linker-version
- دستورالعمل
اسکریپت
پیونددهندهٔ
"LINKER_VERSION" را
که در Output Section Data
شرح داده
شده، فعال
میکند. اگر
این
دستورالعمل
در یک
اسکریپت
پیونددهنده
استفاده
شود و این
گزینه فعال
شده باشد،
رشتهای
حاوی نسخهٔ
پیونددهنده
در نقطهٔ
فعلی درج
خواهد شد.
توجه - مکان قرارگیری این گزینه در خط فرمان پیونددهنده حائز اهمیت است. این گزینه فقط بر اسکریپتهای پیونددهندهای تأثیر میگذارد که پس از آن در خط فرمان میآیند، یا در داخل پیونددهنده تعبیه شدهاند.
- --disable-linker-version
- دستورالعمل اسکریپت پیونددهندهٔ "LINKER_VERSION" را غیرفعال میکند تا رشتهٔ نسخه درج نشود. این رفتار پیشفرض است.
- --enable-non-contiguous-regions
- این گزینه
در صورتی که
یک بخش
ورودی در یک
بخش خروجی
متناظر
نگنجد، از
ایجاد خطا
جلوگیری
میکند.
پیونددهنده
تلاش
میکند تا
بخش ورودی
را به
بخشهای
خروجی
متناظر
بعدی تخصیص
دهد، و تنها
در صورتی
خطا ایجاد
میکند که
هیچ بخش
خروجی به
اندازهٔ
کافی بزرگ
نباشد. این
ویژگی
زمانی مفید
است که
چندین
ناحیهٔ
حافظهٔ
غیرپیوسته
در دسترس
باشند و بخش
ورودی
نیازی به یک
ناحیهٔ خاص
نداشته
باشد.
ترتیبی که
بخشهای
ورودی بر
اساس آن
ارزیابی
میشوند
تغییر
نمیکند،
برای نمونه:
MEMORY { MEM1 (rwx) : ORIGIN = 0x1000, LENGTH = 0x14 MEM2 (rwx) : ORIGIN = 0x1000, LENGTH = 0x40 MEM3 (rwx) : ORIGIN = 0x2000, LENGTH = 0x40 } SECTIONS { mem1 : { *(.data.*); } > MEM1 mem2 : { *(.data.*); } > MEM2 mem3 : { *(.data.*); } > MEM3 } with input sections: .data.1: size 8 .data.2: size 0x10 .data.3: size 4 results in .data.1 affected to mem1, and .data.2 and .data.3 affected to mem2, even though .data.3 would fit in mem3.این گزینه با گزارههای INSERT ناسازگار است زیرا نحوهٔ نگاشت بخشهای ورودی به بخشهای خروجی را تغییر میدهد.
- --enable-non-contiguous-regions-warnings
- این گزینه هشدارهایی را فعال میکند هنگامی که "--enable-non-contiguous-regions" اجازهٔ تطابقهای احتمالاً غیرمنتظره در نگاشت بخشها را میدهد؛ مواردی که بالقوه به جای مردود شدن به دلیل عدم گنجایش در هیچ ناحیهٔ خروجی، به دور انداختن بیسروصدای یک بخش میانجامد.
- -e entry
- --entry=entry
- از entry به عنوان نماد صریح برای شروع اجرای برنامه، به جای نقطهٔ ورود پیشفرض استفاده میکند. اگر هیچ نمادی به نام entry وجود نداشته باشد، پیونددهنده تلاش میکند تا entry را به عنوان یک عدد تجزیه کند و از آن به عنوان نشانی ورودی استفاده نماید (این عدد در مبنای ۱۰ تفسیر خواهد شد؛ میتوانید از پیشوند 0x برای مبنای ۱۶، یا پیشوند 0 برای مبنای ۸ استفاده کنید). برای i386 PE، مقدار entry میتواند نام تابع اصلی نیز باشد (بدون خط زیرین آغازین و/یا @number پایانی مربوط به stdcall در صورت وجود).
- --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) برای کنترل اینکه چه نمادهایی باید به جدول نمادهای پویا اضافه شوند استفاده کنید. توضیحات مربوط به --dynamic-list را ببینید.
توجه داشته باشید که این گزینه مختص پورتهای متمرکز بر ELF است. مقصدهای PE از عملکردی مشابه برای صادر کردن تمام نمادها از یک DLL یا EXE پشتیبانی میکنند؛ توضیحات مربوط به --export-all-symbols را در زیر ببینید..IP --export-dynamic-symbol=glob 4 هنگام ساخت یک فایل اجرایی پیوندیافته بهصورت پویا، نمادهای منطبق با glob به جدول نمادهای پویا اضافه خواهند شد. هنگام ساخت یک کتابخانهٔ اشتراکی، ارجاعات به نمادهای منطبق با glob به تعاریف درون کتابخانهٔ اشتراکی مقید نخواهند شد. این گزینه هنگام ساخت یک کتابخانهٔ اشتراکی در صورتی که -Bsymbolic یا --dynamic-list مشخص نشده باشند، بیاثر است. این گزینه تنها در بسترهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنا دارد.
- --export-dynamic-symbol-list=file
- برای هر الگو در فایل، یک --export-dynamic-symbol مشخص میکند. قالب فایل همانند گره نسخه (version node) بدون حوزه و نام گره است. برای اطلاعات بیشتر VERSION را ببینید.
- -EB
- پیوند شیءفایلهای بزرگاندیان (big-endian). این گزینه بر قالب خروجی پیشفرض تأثیر میگذارد.
- -EL
- پیوند شیءفایلهای کوچکاندیان (little-endian). این گزینه بر قالب خروجی پیشفرض تأثیر میگذارد.
- -f name
- --auxiliary=name
- هنگام ساخت
یک شیء
اشتراکی ELF،
فیلد داخلی
DT_AUXILIARY را به نام
مشخصشده
تنظیم
میکند. این
کار به
پیونددهندهٔ
پویا اعلام
میکند که
جدول
نمادهای
شیء
اشتراکی
باید به
عنوان یک
پالایهٔ
کمکی (auxiliary filter)
روی جدول
نمادهای
شیء
اشتراکی name
استفاده
شود.
اگر بعداً برنامهای را در برابر این شیء پالایه پیوند دهید، هنگام اجرای برنامه، پیونددهندهٔ پویا فیلد DT_AUXILIARY را مشاهده خواهد کرد. اگر پیونددهندهٔ پویا هر نمادی را از شیء پالایه تفکیک کند، ابتدا بررسی میکند که آیا تعریفی در شیء اشتراکی name وجود دارد یا خیر. اگر وجود داشته باشد، بهجای تعریف موجود در شیء پالایه، از آن استفاده خواهد شد. نیازی نیست که شیء اشتراکی name حتماً وجود داشته باشد. بنابراین شیء اشتراکی name میتواند برای ارائهٔ پیادهسازی جایگزینِ توابعی خاص، احتمالاً به منظور اشکالزدایی یا کارایی ویژه برای یک ماشین، به کار رود.
این گزینه ممکن است بیش از یک بار مشخص شود. مدخلهای DT_AUXILIARY به همان ترتیبی که در خط فرمان ظاهر میشوند، ایجاد خواهند شد.
- -F name
- --filter=name
- هنگام ساخت
یک شیء
اشتراکی ELF،
فیلد داخلی
DT_FILTER را به نام
مشخصشده
تنظیم
میکند. این
کار به
پیونددهندهٔ
پویا اعلام
میکند که
جدول
نمادهای
شیء
اشتراکی در
حال ساخت
باید به
عنوان یک
پالایه روی
جدول
نمادهای
شیء
اشتراکی name
استفاده
شود.
اگر بعداً برنامهای را در برابر این شیء پالایه پیوند دهید، هنگام اجرای برنامه، پیونددهندهٔ پویا فیلد DT_FILTER را خواهد دید. پیونددهندهٔ پویا نمادها را طبق معمول با توجه به جدول نمادهای شیء پالایه تفکیک میکند، اما در عمل به تعاریف یافتشده در شیء اشتراکی name پیوند خواهد خورد. بنابراین شیء پالایه میتواند برای انتخاب زیرمجموعهای از نمادهای ارائهشده توسط شیء name به کار رود.
برخی از پیونددهندههای قدیمیتر از گزینهٔ -F در زنجیره ابزار کامپایل برای مشخص کردن قالب شیءفایل هم برای فایلهای شیء ورودی و هم خروجی استفاده میکردند. پیونددهندهٔ GNU از سازوکارهای دیگری برای این منظور استفاده میکند: گزینههای -b، --format، --oformat، دستور "TARGET" در اسکریپتهای پیونددهنده و متغیر محیطی "GNUTARGET". پیونددهندهٔ GNU هنگامی که در حال ساخت یک شیء اشتراکی ELF نیست، گزینهٔ -F را نادیده خواهد گرفت.
- -fini=name
- هنگام ساخت یک فایل اجرایی یا شیء اشتراکی ELF، با تنظیم DT_FINI به نشانی تابع، هنگام تخلیه شدن فایل اجرایی یا شیء اشتراکی، NAME را فراخوانی میکند. بهطور پیشفرض، پیونددهنده از "_fini" به عنوان تابع فراخوانی استفاده میکند.
- -g
- نادیده گرفته میشود. جهت سازگاری با سایر ابزارها فراهم شده است.
- -G value
- --gpsize=value
- بیشینه اندازهٔ اشیایی که باید با استفاده از ثبات GP بهینهسازی شوند را به size تنظیم میکند. این مورد تنها برای قالبهای شیءفایلی مانند MIPS ELF معنا دارد که از قرار دادن اشیاء بزرگ و کوچک در بخشهای مختلف پشتیبانی میکنند. برای سایر قالبهای شیءفایل نادیده گرفته میشود.
- -h name
- -soname=name
- هنگام ساخت یک شیء اشتراکی ELF، فیلد داخلی DT_SONAME را به نام مشخصشده تنظیم میکند. هنگامی که یک فایل اجرایی با شیء اشتراکیای پیوند داده میشود که دارای فیلد DT_SONAME است، در زمان اجرای فایل اجرایی، پیونددهندهٔ پویا تلاش خواهد کرد به جای استفاده از نام فایل دادهشده به پیونددهنده، شیء اشتراکی مشخصشده توسط فیلد DT_SONAME را بارگذاری کند.
- -i
- یک پیوند افزایشی انجام میدهد (مشابه گزینهٔ -r).
- -init=name
- هنگام ساخت یک فایل اجرایی یا شیء اشتراکی ELF، با تنظیم DT_INIT به نشانی تابع، هنگام بارگذاری فایل اجرایی یا شیء اشتراکی، NAME را فراخوانی میکند. بهطور پیشفرض، پیونددهنده از "_init" به عنوان تابع فراخوانی استفاده میکند.
- -l namespec
- --library=namespec
- آرشیو یا
شیءفایل
مشخصشده
توسط namespec را
به فهرست
فایلها
برای پیوند
اضافه
میکند. این
گزینه
میتواند
به هر تعداد
بار
استفاده
شود. اگر namespec
به شکل :filename
باشد، ld
مسیر
کتابخانه
را برای
فایلی به
نام filename
جستجو
میکند، در
غیر این
صورت مسیر
کتابخانه
را برای
فایلی به
نام libnamespec.a
جستجو
خواهد کرد.
در سیستمهایی که از کتابخانههای اشتراکی پشتیبانی میکنند، ld همچنین ممکن است فایلهایی غیر از libnamespec.a را جستجو کند. بهویژه در سیستمهای ELF و SunOS، دستور ld پیش از جستجو برای کتابخانهای با نام libnamespec.a، یک دایرکتوری را برای کتابخانهای به نام libnamespec.so جستجو خواهد کرد. (طبق عرف، پسوند ".so" نشاندهندهٔ یک کتابخانهٔ اشتراکی است.) توجه داشته باشید که این رفتار برای :filename صدق نمیکند؛ چرا که این مورد همواره فایلی با نام filename را مشخص میسازد.
پیونددهنده یک آرشیو را تنها یک بار، در همان مکانی که در خط فرمان مشخص شده است، جستجو میکند. اگر آرشیو نمادی را تعریف کند که در شیئی پیش از آن آرشیو در خط فرمان نامشخص بوده است، پیونددهنده فایل(های) مربوطه را از آرشیو وارد میکند. با این حال، یک نماد نامشخص در شیئی که بعداً در خط فرمان ظاهر میشود، سبب نخواهد شد پیونددهنده دوباره آرشیو را جستجو کند.
برای یافتن روشی جهت اجبار پیونددهنده به جستجوی چندباره در آرشیوها، گزینهٔ -( را ببینید.
میتوانید همان آرشیو را چند بار در خط فرمان فهرست کنید.
این نوع جستجوی آرشیو برای پیونددهندههای Unix استاندارد است. با این حال، اگر از ld روی AIX استفاده میکنید، توجه داشته باشید که این شیوه با رفتار پیونددهندهٔ AIX تفاوت دارد.
- -L searchdir
- --library-path=searchdir
- مسیر searchdir را
به فهرست
مسیرهایی
که ld برای
کتابخانههای
آرشیو و
اسکریپتهای
کنترلی ld
جستجو
میکند
اضافه
میکند. شما
میتوانید
این گزینه
را به هر
تعداد بار
استفاده
کنید.
دایرکتوریها
به همان
ترتیبی که
در خط فرمان
مشخص
شدهاند
جستجو
میشوند.
دایرکتوریهای
مشخصشده
در خط فرمان
پیش از
دایرکتوریهای
پیشفرض
جستجو
میشوند.
تمام
گزینههای
-L بدون
توجه به
ترتیبی که
گزینهها
ظاهر
میشوند،
روی تمام
گزینههای
-l اعمال
میشوند.
گزینههای
-L روی
نحوهٔ
جستجوی ld
برای
اسکریپت
پیونددهنده
تأثیری
ندارند،
مگر اینکه
گزینهٔ -T
مشخص شده
باشد.
اگر searchdir با "=" یا $SYSROOT آغاز شود، این پیشوند با پیشوند sysroot که توسط گزینهٔ --sysroot کنترل میشود، یا هنگام پیکربندی پیونددهنده مشخص شده است جایگزین میشود.
مجموعه مسیرهای پیشفرضی که جستجو میشوند (بدون اینکه با -L مشخص شده باشند) بستگی به این دارد که ld از چه حالت شبیهسازی استفاده میکند، و در برخی موارد نیز به نحوهٔ پیکربندی آن بستگی دارد.
مسیرها همچنین میتوانند در یک اسکریپت پیوند با دستور "SEARCH_DIR" مشخص شوند. دایرکتوریهایی که از این طریق مشخص میشوند، در همان نقطهای از خط فرمان که اسکریپت پیونددهنده ظاهر میشود جستجو میشوند.
- -m emulation
- پیونددهندهٔ
emulation را
شبیهسازی
میکند.
میتوانید
شبیهسازیهای
موجود را با
گزینههای
--verbose یا -V
فهرست کنید.
اگر از گزینهٔ -m استفاده نشود، شبیهسازی در صورت تعریف بودن از متغیر محیطی "LDEMULATION" گرفته میشود.
در غیر این صورت، شبیهسازی پیشفرض بستگی به نحوهٔ پیکربندی پیونددهنده دارد.
- --remap-inputs=pattern=filename
- --remap-inputs-file=file
- این
گزینهها
امکان
تغییر نام
فایلهای
ورودی را
پیش از تلاش
پیونددهنده
برای باز
کردن آنها
فراهم
میکنند.
گزینهٔ
--remap-inputs=foo.o=bar.o سبب
خواهد شد هر
تلاشی برای
بارگذاری
فایلی با
نام foo.o، در
عوض برای
بارگذاری
فایلی به
نام bar.o تلاش
کند.
الگوهای
جانشین (wildcard)
در نام فایل
نخست مجاز
هستند،
بنابراین
--remap-inputs=foo*.o=bar.o هر
فایل ورودی
را که با foo*.o
مطابقت
داشته باشد
به bar.o تغییر
نام میدهد.
شکل جایگزین این گزینه، یعنی --remap-inputs-file=filename اجازه میدهد تا بازنگاشتها از یک فایل خوانده شوند. هر خط در فایل میتواند شامل یک بازنگاشت منفرد باشد. خطوط خالی نادیده گرفته میشوند. هر چیزی از نویسهٔ هش (#) تا انتهای خط به عنوان توضیح در نظر گرفته شده و نادیده گرفته میشود. الگوی نگاشت میتواند با فاصله یا نویسهٔ مساوی (=) از نام فایل جدا شود.
این گزینهها میتوانند چندین بار مشخص شوند. محتوای آنها با یکدیگر انباشته میشود. بازنگاشتها به همان ترتیبی که در خط فرمان آمدهاند پردازش خواهند شد، و اگر از یک فایل باشند، به همان ترتیبی که در فایل آمدهاند پردازش میشوند. اگر تطابقی حاصل شود، هیچ بررسی دیگری برای آن نام فایل انجام نخواهد شد.
اگر نام فایل جایگزین /dev/null یا صرفاً NUL باشد، در این صورت بازنگاشت عملاً سبب نادیده گرفته شدن فایل ورودی خواهد شد. این میتواند راهی مناسب برای آزمایش حذف فایلهای ورودی از یک محیط ساخت پیچیده باشد.
توجه داشته باشید که این گزینه وابسته به موقعیت است و تنها بر نام فایلهایی تأثیر میگذارد که پس از آن در خط فرمان میآیند. بنابراین:
ld foo.o --remap-inputs=foo.o=bar.o
هیچ اثری نخواهد داشت، در حالی که:
ld --remap-inputs=foo.o=bar.o foo.o
نام فایل ورودی foo.o را به bar.o تغییر میدهد.
توجه - این گزینهها بر فایلهای مورد ارجاع توسط عبارات INPUT در اسکریپتهای پیونددهنده نیز تأثیر میگذارند. اما از آنجا که اسکریپتهای پیونددهنده پس از خوانده شدن کل خط فرمان پردازش میشوند، موقعیت گزینههای بازنگاشت در خط فرمان اهمیتی ندارد.
اگر گزینهٔ verbose فعال باشد، هر نگاشتی که مطابقت داشته باشد گزارش خواهد شد، گرچه مجدداً لازم است گزینهٔ verbose روی خط فرمان پیش از ظاهر شدن نام فایلهای بازنگاشتشده فعال شده باشد.
اگر گزینههای -Map یا --print-map فعال باشند، فهرست بازنگاشت در خروجی نگاشت (map output) گنجانده خواهد شد..IP -M 4
- --print-map
- یک نگاشت پیوند (link map) را در خروجی استاندارد چاپ میکند. نگاشت پیوند اطلاعاتی دربارهٔ پیوند ارائه میدهد، از جمله موارد زیر:
- مکان نگاشت فایلهای شیء در حافظه.
- نحوهٔ تخصیص نمادهای مشترک (common symbols).
- تمام اعضای آرشیو که در پیوند گنجانده شدهاند، همراه با ذکر نمادی که باعث وارد شدن آن عضو آرشیو شده است.
- مقادیر
اختصاصیافته
به نمادها.
نکته - نمادهایی که مقدار آنها با عبارتی محاسبه میشود که شامل ارجاع به مقدار قبلی همان نماد است، ممکن است نتیجهٔ صحیحی در نگاشت پیوند نمایش ندهند. علت این است که پیونددهنده نتایج میانی را دور میاندازد و تنها مقدار نهایی یک عبارت را نگه میدارد. در چنین شرایطی، پیونددهنده مقدار نهایی را درون قلابها نمایش میدهد. بنابراین برای مثال یک اسکریپت پیونددهنده شامل:
foo = 1 foo = foo * 4 foo = foo + 8
در صورت استفاده از گزینهٔ -M، خروجی زیر را در نگاشت پیوند تولید خواهد کرد:
0x00000001 foo = 0x1 [0x0000000c] foo = (foo * 0x4) [0x0000000c] foo = (foo + 0x8)
برای اطلاعات بیشتر دربارهٔ عبارتها در اسکریپتهای پیونددهنده، Expressions را ببینید.
- نحوهٔ
ادغام
ویژگیهای
GNU (GNU properties).
هنگامی که پیونددهنده بخشهای ورودی .note.gnu.property را در یک بخش خروجی .note.gnu.property ادغام میکند، برخی ویژگیها حذف یا بهروزرسانی میشوند. این اقدامات در نگاشت پیوند گزارش میشوند. برای مثال:
Removed property 0xc0000002 to merge foo.o (0x1) and bar.o (not found)
این نشان میدهد که ویژگی 0xc0000002 هنگام ادغام ویژگیها در foo.o (که مقدار ویژگی 0xc0000002 آن 0x1 است) و bar.o (که ویژگی 0xc0000002 را ندارد) از خروجی حذف شده است.
Updated property 0xc0010001 (0x1) to merge foo.o (0x1) and bar.o (0x1)
این نشان میدهد که مقدار ویژگی 0xc0010001 هنگام ادغام ویژگیها در foo.o (که مقدار ویژگی 0xc0010001 آن 0x1 است) و bar.o (که مقدار ویژگی 0xc0010001 آن 0x1 است) در خروجی به 0x1 بهروزرسانی شده است.
- در برخی
مقصدهای ELF،
فهرستی از
تصحیحهای
(fixups) درجشده
توسط --relax
foo.o: Adjusting branch at 0x00000008 towards "far" in section .text
این نشان میدهد که انشعاب (branch) در 0x00000008 در foo.o به سمت نماد "far" در بخش .text، با یک ترامپولین (trampoline) جایگزین شده است.
- --print-map-discarded
- --no-print-map-discarded
- فهرست بخشهای دور انداختهشده و جمعآوریشده بهوسیلهٔ بازیافت حافظه (garbage collection) را در نگاشت پیوند چاپ میکند (یا چاپ نمیکند). بهطور پیشفرض فعال است.
- --print-map-locals
- --no-print-map-locals
- نمادهای محلی را در نگاشت پیوند چاپ میکند (یا چاپ نمیکند). نمادهای محلی متن (local) را پیش از نام خود خواهند داشت و پس از تمام نمادهای سراسری در یک بخش مشخص فهرست میشوند. نمادهای محلی موقت (معمولاً آنهایی که با .L شروع میشوند) در خروجی گنجانده نخواهند شد. بهطور پیشفرض غیرفعال است.
- -n
- --nmagic
- همترازی صفحهای بخشها را غیرفعال کرده و پیوند با کتابخانههای مشترک را غیرفعال میسازد. اگر قالب خروجی از شمارههای جادویی (magic numbers) به سبک یونیکس پشتیبانی کند، خروجی را با عنوان "NMAGIC" علامتگذاری میکند.
- -N
- --omagic
- بخشهای text و data را بهصورت قابل خواندن و نوشتن تنظیم میکند. همچنین بخش داده را همتراز با صفحه نمیکند و پیوند با کتابخانههای مشترک را غیرفعال میسازد. اگر قالب خروجی از شمارههای جادویی به سبک یونیکس پشتیبانی کند، خروجی را با عنوان "OMAGIC" علامتگذاری میکند. نکته: اگرچه بخش text با قابلیت نوشتن برای مقصدهای PE-COFF مجاز است، اما با مشخصات قالبی که توسط مایکروسافت منتشر شده مطابقت ندارد.
- --no-omagic
- این گزینه بیشتر اثرات گزینهٔ -N را خنثی میکند. این گزینه بخش text را فقطخواندنی تنظیم کرده و بخش داده را وادار به همترازی صفحهای میکند. نکته - این گزینه پیوند با کتابخانههای مشترک را فعال نمیکند؛ برای این منظور از -Bdynamic استفاده کنید.
- -o output
- --output=output
- از output به
عنوان نام
برنامهٔ
تولیدشده
توسط ld
استفاده
میکند؛
اگر این
گزینه مشخص
نشود، نام
a.out بهطور
پیشفرض
استفاده
میشود.
دستور
اسکریپتی
"OUTPUT" نیز
میتواند
نام فایل
خروجی را
مشخص کند.
نکته - پیونددهنده پیش از شروع نوشتن روی فایل خروجی، آن را حذف خواهد کرد. این کار را حتی اگر مشخص شود که پیوند به دلیل خطاها کامل نمیشود نیز انجام میدهد.
نکته - پیونددهنده بررسی میکند تا مطمئن شود نام فایل خروجی با نام هیچیک از فایلهای ورودی یکسان نباشد، اما این تمام کاری است که انجام میدهد. بهویژه، اگر فایل خروجی روی یک فایل منبع یا فایل مهم دیگری رونویسی شود، هشداری صادر نخواهد کرد. بنابراین در سیستمهای ساخت توصیه میشود که از گزینهٔ -o به عنوان آخرین گزینه در خط فرمان پیونددهنده استفاده شود. برای مثال در نظر بگیرید:
ld -o $(EXE) $(OBJS) ld $(OBJS) -o $(EXE)
اگر متغیر EXE به هر دلیلی تعریف نشده باشد، نگارش اول دستور پیونددهنده میتواند در نهایت منجر به حذف یکی از فایلهای شیء شود (اولین مورد در فهرست OBJS)، در حالی که نگارش دوم دستور پیونددهنده یک پیام خطا صادر کرده و چیزی را حذف نخواهد کرد.
- --dependency-file=depfile
- یک فایل وابستگی در depfile مینویسد. این فایل حاوی قاعدهای مناسب برای "make" است که فایل خروجی و تمامی فایلهای ورودی خواندهشده برای تولید آن را توصیف میکند. خروجی مشابه خروجی کامپایلر با -M -MP است. توجه داشته باشید که هیچ گزینهای مانند گزینهٔ -MM در کامپایلر برای استثنا کردن «فایلهای سیستمی» وجود ندارد (چرا که برخلاف «هدرهای سیستمی» در کامپایلر، این مفهوم در پیونددهنده بهخوبی تعریف نشده است). بنابراین خروجی حاصل از --dependency-file همیشه مختص وضعیت دقیق نصبی است که در آن تولید شده، و نباید بدون ویرایش دقیق در makefileهای توزیعشده کپی شود.
- -O level
- اگر level یک مقدار عددی بزرگتر از صفر باشد، ld خروجی را بهینهسازی میکند. این فرآیند ممکن است زمان بسیار بیشتری ببرد و بنابراین احتمالاً تنها باید برای باینری نهایی فعال شود. در حال حاضر این گزینه فقط بر تولید کتابخانههای مشترک ELF اثر میگذارد. نگارشهای آیندهٔ پیونددهنده ممکن است استفادهٔ بیشتری از این گزینه بکنند. همچنین در حال حاضر تفاوتی در رفتار پیونددهنده برای مقادیر ناصفر مختلف این گزینه وجود ندارد. این مورد نیز ممکن است در نگارشهای آینده تغییر کند.
- -plugin name
- یک پلاگین
را در
فرآیند
پیوند دخیل
میکند.
پارامتر name
نام فایل با
مسیر مطلق
پلاگین است.
معمولاً
این
پارامتر
هنگام
استفاده از
بهینهسازی
زمان پیوند
(LTO)، بهطور
خودکار
توسط
کامپایلر
اضافه
میشود،
اما
کاربران
نیز در صورت
تمایل
میتوانند
پلاگینهای
خود را
اضافه کنند.
توجه داشته باشید که محل قرارگیری پلاگینهای مشتقشده از کامپایلر با محلی که برنامههای ar، nm و ranlib برای پلاگینهای خود جستجو میکنند متفاوت است. برای اینکه این دستورات بتوانند از یک پلاگین مبتنی بر کامپایلر استفاده کنند، ابتدا باید در دایرکتوری ${libdir}/bfd-plugins کپی شود. تمام پلاگینهای پیونددهندهٔ مبتنی بر gcc با نگارشهای قبلی سازگار هستند، بنابراین تنها کپی کردن جدیدترین نگارش کافی است.
- --push-state
- گزینهٔ --push-state
امکان حفظ
وضعیت فعلی
پرچمهای
حاکم بر
مدیریت
فایلهای
ورودی را
فراهم
میسازد تا
بتوان همهٔ
آنها را با
یک گزینهٔ
متناظر --pop-state
بازیابی
کرد.
گزینههایی که تحت پوشش قرار میگیرند عبارتند از: -Bdynamic، -Bstatic، -dn، -dy، -call_shared، -non_shared، -static، -N، -n، --whole-archive، --no-whole-archive، -r، -Ur، --copy-dt-needed-entries، --no-copy-dt-needed-entries، --as-needed، --no-as-needed، و -a.
یکی از کاربردهای هدف این گزینه، مشخصات مربوط به pkg-config است. هنگامی که با گزینهٔ --libs استفاده میشود، تمامی کتابخانههایی که احتمالاً مورد نیاز هستند فهرست شده و سپس احتمالاً همواره پیوند داده میشوند. بهتر است مقداری مانند زیر بازگردانده شود:
-Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state اثر --push-state را باطل کرده و مقادیر قبلی پرچمهای حاکم بر نحوهٔ مدیریت فایل ورودی را بازمیگرداند.
- -q
- --emit-relocs
-
بخشها و محتویات بازآرایی (relocation) را در فایلهای اجرایی کاملاً پیوندخورده باقی میگذارد. ابزارهای بهینهسازی و تحلیل پس از پیوند ممکن است برای انجام تغییرات صحیح در فایلهای اجرایی به این اطلاعات نیاز داشته باشند. این امر منجر به ایجاد فایلهای اجرایی بزرگتر میشود. این گزینه در حال حاضر تنها روی بسترهای ELF پشتیبانی میشود.
- --force-dynamic
-
فایل خروجی را وادار میکند تا دارای بخشهای پویا (dynamic sections) باشد. این گزینه مختص اهداف VxWorks است.
- -r
- --relocatable
-
تولید خروجی قابل بازآرایی---یعنی تولید یک فایل خروجی که میتواند به نوبهٔ خود به عنوان ورودی برای ld عمل کند. این عمل معمولاً پیوند جزئی (partial linking) نامیده میشود. به عنوان یک اثر جانبی، در محیطهایی که از اعداد جادویی (magic numbers) استاندارد Unix پشتیبانی میکنند، این گزینه عدد جادویی فایل خروجی را نیز روی "OMAGIC" تنظیم میکند. اگر این گزینه مشخص نشود، یک فایل مطلق (absolute) تولید میشود. هنگام پیوند برنامههای ++C، این گزینه ارجاعات به سازندهها (constructors) را حلوفصل نخواهد کرد؛ برای انجام این کار، از -Ur استفاده کنید. هنگامی که قالب یک فایل ورودی با فایل خروجی یکسان نباشد، پیوند جزئی تنها در صورتی پشتیبانی میشود که فایل ورودی حاوی هیچ بازآراییای نباشد. قالبهای خروجی مختلف میتوانند محدودیتهای بیشتری داشته باشند؛ به عنوان مثال برخی از قالبهای مبتنی بر "a.out" اصلاً از پیوند جزئی با فایلهای ورودی در قالبهای دیگر پشتیبانی نمیکنند. هنگامی که خروجی قابل بازآرایی هم حاوی محتوایی باشد که به بهینهسازی زمان پیوند (LTO) نیاز دارد و هم محتوایی که به LTO نیازی ندارد، یک بخش .gnu_object_only برای در بر گرفتن یک فایل شیء قابل بازآرایی ایجاد خواهد شد، گویی -r روی تمام ورودیهای قابل بازآرایی که به LTO نیاز ندارند اعمال شده است. پیونددهنده هنگام پردازش یک ورودی قابل بازآرایی حاوی بخش .gnu_object_only، بخش .gnu_object_only را به عنوان یک ورودی مجزا استخراج خواهد کرد. توجه داشته باشید از آنجا که -r برخی از بخشهای مربوط به فایلهای ورودی مختلف را با یکدیگر گروهبندی میکند، ممکن است بر اندازهٔ کد و محلی بودن (locality) در فایل اجرایی یا کتابخانهٔ اشتراکی نهایی اثرات منفی بگذارد. این گزینه همان عملکرد -i را دارد.
- -R filename
- --just-symbols=filename
-
نام نمادها و نشانیهای آنها را از filename میخواند، اما آن را بازآرایی نکرده و در خروجی نمیگنجاند. این امر به فایل خروجی شما اجازه میدهد تا به صورت نمادین به مکانهای مطلق حافظه که در سایر برنامهها تعریف شدهاند ارجاع دهد. میتوانید بیش از یک بار از این گزینه استفاده کنید. جهت سازگاری با سایر پیونددهندههای ELF، اگر پس از گزینهٔ -R به جای نام فایل یک نام دایرکتوری بیاید، همانند گزینهٔ -rpath با آن رفتار میشود.
- --rosegment
- --no-rosegment
-
تلاش میکند اطمینان حاصل کند که تنها یک سگمنت فقطخواندنی و غیرکد ایجاد شود. تنها در صورت استفادهٔ همزمان با گزینهٔ -z separate-code کاربرد دارد. باینریهای حاصل باید از حالتی که -z separate-code به تنهایی استفاده میشود کوچکتر باشند. بدون این گزینه، یا در صورت مشخص شدن --no-rosegment، گزینهٔ -z separate-code دو سگمنت فقطخواندنی ایجاد خواهد کرد، یکی قبل از سگمنت کد و دیگری بعد از آن. نام این گزینهها گمراهکننده است، اما به منظور سازگاری پیونددهنده با پیونددهندههای LLD و GOLD برگزیده شدهاند. این گزینهها تنها توسط اهداف ELF پشتیبانی میشوند.
- -s
- --strip-all
-
حذف تمام اطلاعات نمادها از فایل خروجی.
- -S
- --strip-debug
-
حذف اطلاعات نمادهای اشکالزدا (اما نه همهٔ نمادها) از فایل خروجی.
- --strip-discarded
- --no-strip-discarded
-
حذف (یا عدم حذف) نمادهای سراسریِ تعریفشده در بخشهای دور انداختهشده (discarded). به طور پیشفرض فعال است.
- -plugin-save-temps
-
ذخیرهٔ همیشگی فایلهای واسط «موقت» افزونه.
- -t
- --trace
-
چاپ نام فایلهای ورودی همانطور که ld آنها را پردازش میکند. اگر -t دو بار مشخص شود، اعضای درون آرشیوها نیز چاپ میشوند. خروجی -t برای ایجاد فهرستی از تمامی فایلهای شیء و اسکریپتهای درگیر در پیوند، برای مثال هنگام بستهبندی فایلها جهت گزارش باگ پیونددهنده، مفید است.
- -T scriptfile
- --script=scriptfile
-
استفاده از scriptfile به عنوان اسکریپت پیونددهنده. این اسکریپت جایگزین اسکریپت پیونددهندهٔ پیشفرض ld میشود (به جای الحاق به آن)، مگر اینکه اسکریپت حاوی "INSERT" باشد؛ بنابراین commandfile باید هر آنچه را که برای توصیف فایل خروجی لازم است مشخص کند. اگر scriptfile در دایرکتوری جاری موجود نباشد، "ld" آن را در دایرکتوریهایی که با گزینههای پیشین -L مشخص شدهاند جستجو میکند. گزینههای خط فرمانی که پیش از گزینهٔ -T میآیند میتوانند بر اسکریپت تأثیر بگذارند، اما گزینههای خط فرمانی که پس از آن میآیند بیتأثیر هستند. چنانچه گزینههای چندگانهٔ -T در حال توسعه دادن اسکریپت فعلی باشند، با یکدیگر تجمیع میشوند، در غیر این صورت آخرین گزینهٔ غیرتوسعهدهندهٔ -T به کار خواهد رفت. راههای دیگری برای تعیین اسکریپتهای پیونددهنده وجود دارد. ببینید
- -dT scriptfile
- --default-script=scriptfile
-
استفاده از scriptfile به عنوان اسکریپت پیشفرض پیونددهنده. این گزینه مشابه گزینهٔ --script است با این تفاوت که پردازش اسکریپت تا زمان پردازش بقیهٔ خط فرمان به تعویق میافتد. این امر به گزینههایی که پس از گزینهٔ --default-script در خط فرمان قرار میگیرند اجازه میدهد تا بر رفتار اسکریپت پیونددهنده تأثیر بگذارند؛ موضوعی که در مواردی که خط فرمان پیونددهنده مستقیماً توسط کاربر قابل کنترل نیست میتواند مهم باشد (به عنوان مثال هنگامی که خط فرمان توسط ابزار دیگری همچون gcc ساخته میشود).
- -u symbol
- --undefined=symbol
-
وادار کردن symbol به درج شدن در فایل خروجی به عنوان یک نماد تعریفنشده (undefined). انجام این کار ممکن است، برای نمونه، پیوند دادن ماژولهای اضافی از کتابخانههای استاندارد را تحریک کند. -u میتواند با آرگومانهای مختلف تکرار شود تا نمادهای تعریفنشدهٔ بیشتری وارد شوند. این گزینه معادل دستور "EXTERN" در اسکریپت پیونددهنده است. اگر از این گزینه برای وادار کردن ماژولهای اضافی جهت اضافه شدن به پیوند استفاده میشود، و تعریفنشده باقی ماندن نماد یک خطا محسوب میشود، باید به جای آن از گزینهٔ --require-defined استفاده کرد. - --require-defined=symbol
-
الزام میکند که symbol در فایل خروجی تعریف شده باشد. این گزینه مانند گزینهٔ --undefined است، با این تفاوت که اگر symbol در فایل خروجی تعریف نشده باشد، پیونددهنده خطایی صادر کرده و خارج میشود. همین اثر را میتوان در یک اسکریپت پیونددهنده با استفادهٔ توأم از "EXTERN"، "ASSERT" و "DEFINED" به دست آورد. این گزینه را میتوان چندین بار برای الزامی کردن نمادهای بیشتر استفاده کرد.
- -Ur
-
برای برنامههایی که از سازندهها (constructors) یا ویرانکنندهها (destructors) استفاده نمیکنند، یا برای سیستمهای مبتنی بر ELF، این گزینه معادل -r است: یک خروجی قابل بازآرایی تولید میکند---یعنی فایل خروجیای که میتواند به نوبهٔ خود به عنوان ورودی برای ld به کار رود. با این حال برای سایر فایلهای باینری، گزینهٔ -Ur شبیه به -r است اما ارجاعات به سازندهها و ویرانکنندهها را نیز حلوفصل میکند. برای سیستمهایی که -r و -Ur در آنها رفتار متفاوتی دارند، استفاده از -Ur روی فایلهایی که خود با -Ur پیوند یافتهاند کارساز نیست؛ هنگامی که جدول سازندهها ساخته شد، نمیتوان چیزی به آن افزود. از -Ur فقط برای آخرین پیوند جزئی، و از -r برای سایر پیوندها استفاده کنید..IP --orphan-handling=MODE 4 نحوه مدیریت بخشهای یتیم (orphan sections) را کنترل میکند. بخش یتیم بخشی است که صراحتاً در اسکریپت پیونددهنده ذکر نشده باشد. MODE میتواند هر یک از مقادیر زیر را داشته باشد:
- "place"
-
بخشهای یتیم طبق راهبرد شرحدادهشده در Orphan Sections در یک بخش خروجی مناسب قرار میگیرند. گزینهٔ --unique نیز بر نحوه قرارگیری بخشها تأثیر میگذارد.
- "discard"
-
تمام بخشهای یتیم با قرار گرفتن در بخش /DISCARD/ دور ریخته میشوند.
- "warn"
-
پیونددهنده بخش یتیم را مانند "place" جایگذاری کرده و یک هشدار نیز صادر میکند. - "error"
-
در صورت یافت شدن هرگونه بخش یتیم، پیونددهنده با یک خطا خارج میشود.
در صورتی که --orphan-handling مشخص نشود، پیشفرض "place" است.
- --unique[=SECTION]
-
برای هر بخش ورودی منطبق با SECTION، یا در صورت مشخص نشدن آرگومان اختیاری نویسهٔ عام SECTION، برای هر بخش ورودی یتیم یک بخش خروجی جداگانه ایجاد میکند. بخش یتیم بخشی است که صراحتاً در اسکریپت پیونددهنده ذکر نشده باشد. میتوانید از این گزینه چندین بار در خط فرمان استفاده کنید؛ این گزینه از ادغام معمول بخشهای ورودیِ همنام جلوگیری کرده و بر تخصیصهای بخش خروجی در یک اسکریپت پیونددهنده تقدم مییابد.
- -v
- --version
- -V
-
شماره نسخهٔ ld را نمایش میدهد. گزینهٔ -V همچنین شبیهسازهای پشتیبانیشده را فهرست میکند. همچنین شرح گزینهٔ --enable-linker-version را در Options,,Command-line Options ببینید که میتواند برای درج رشته نسخه پیونددهنده در یک فایل دودویی استفاده شود.
- -x
- --discard-all
-
تمام نمادهای محلی را حذف میکند.
- -X
- --discard-locals
-
تمام نمادهای محلی موقت را حذف میکند. (این نمادها با پیشوندهای برچسب محلی مختص به سیستم آغاز میشوند، معمولاً .L برای سیستمهای ELF یا L برای سیستمهای سنتی a.out.)
- -y symbol
- --trace-symbol=symbol
-
نام هر فایل پیوندشدهای را که symbol در آن ظاهر میشود چاپ میکند. این گزینه را میتوان به هر تعداد بار مشخص کرد. در بسیاری از سیستمها لازم است یک خط زیرین (_) به ابتدای آن اضافه شود. این گزینه زمانی مفید است که یک نماد تعریفنشده در پیوند خود دارید اما نمیدانید ارجاع به آن از کجا نشأت میگیرد.
- -Y path
-
مسیر path را به مسیر پیشفرض جستجوی کتابخانه اضافه میکند. این گزینه برای سازگاری با Solaris وجود دارد.
- -z keyword
-
کلیدواژههای شناختهشده عبارتند از:
- call-nop=prefix-addr
- call-nop=suffix-nop
- call-nop=prefix-byte
- call-nop=suffix-byte
-
هنگام تبدیل فراخوانی غیرمستقیم به یک تابع محلی تعریفشده، مانند foo، از طریق خانهٔ GOT آن، لایهگذاری ۱-بایتی "NOP" را مشخص میکند. call-nop=prefix-addr عبارت "0x67 call foo" را تولید میکند. call-nop=suffix-nop عبارت "call foo 0x90" را تولید میکند. call-nop=prefix-byte عبارت "byte call foo" را تولید میکند. call-nop=suffix-byte عبارت "call foo byte" را تولید میکند. برای i386 و x86_64 پشتیبانی میشود.
- cet-report=none
- cet-report=warning
- cet-report=error
-
نحوه گزارش ویژگیهای مفقود GNU_PROPERTY_X86_FEATURE_1_IBT و GNU_PROPERTY_X86_FEATURE_1_SHSTK در بخش ورودی .note.gnu.property را مشخص میکند. cet-report=none که حالت پیشفرض است، باعث میشود پیونددهنده ویژگیهای مفقود در فایلهای ورودی را گزارش نکند. cet-report=warning باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی یک هشدار صادر کند. cet-report=error باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی یک خطا صادر کند. توجه داشته باشید که ibt گزارش ویژگی مفقود GNU_PROPERTY_X86_FEATURE_1_IBT را خاموش میکند و shstk گزارش ویژگی مفقود GNU_PROPERTY_X86_FEATURE_1_SHSTK را غیرفعال میسازد. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- combreloc
- nocombreloc
-
چندین بخش بازآرایی پویا را ترکیب کرده و مرتب میکند تا حافظه نهانِ جستجوی نمادهای پویا بهبود یابد. با گزینهٔ nocombreloc این کار انجام نمیشود.
- common
- nocommon
-
در طول یک پیوند بازآراییپذیر، نمادهای مشترک را با نوع STT_COMMON تولید میکند. در صورت استفاده از nocommon، از نوع STT_OBJECT استفاده میشود.
- common-page-size=value
-
اندازه صفحهای را که بیشترین کاربرد را دارد روی value تنظیم میکند. در صورتی که سیستم از صفحاتی با این اندازه استفاده کند، چیدمان تصویر حافظه برای به حداقل رساندن صفحات حافظه بهینهسازی خواهد شد.
- defs
-
ارجاعات نمادهای حلنشده از فایلهای شیء عادی را گزارش میدهد. این کار حتی اگر پیونددهنده در حال ایجاد یک کتابخانه مشترک غیرنمادین باشد نیز انجام میشود. این گزینه معکوس -z undefs است.
- dynamic-undefined-weak
- nodynamic-undefined-weak
-
هنگام ساخت یک شیء پویا، نمادهای ضعیف تعریفنشده را در صورتی که از یک فایل شیء عادی به آنها ارجاع داده شده باشد و بهواسطه نمایانی نماد یا نسخهبندی به حالت محلی اجبار نشده باشند، پویا میسازد. با nodynamic-undefined-weak آنها را پویا نمیکند. اگر هیچیک از گزینهها داده نشود، ممکن است مقصد بهطور پیشفرض یکی از گزینهها را اعمال کند، یا مجموعه دیگری از نمادهای ضعیف تعریفنشده را پویا سازد. همه مقاصد از این گزینهها پشتیبانی نمیکنند.
- execstack
-
شیء را به عنوان نیازمند پشته قابلاجرا علامتگذاری میکند.
- global
-
این گزینه تنها هنگام ساخت یک شیء مشترک معنادار است. این گزینه نمادهای تعریفشده توسط این شیء مشترک را برای تفکیک نمادهای کتابخانههایی که پس از آن بارگذاری میشوند، دردسترس قرار میدهد.
- globalaudit
-
این گزینه تنها هنگام ساخت یک فایل اجرایی پویا معنادار است. این گزینه فایل اجرایی را با تنظیم بیت "DF_1_GLOBAUDIT" در برچسب پویای "DT_FLAGS_1" به عنوان نیازمند حسابرسی سراسری علامتگذاری میکند. حسابرسی سراسری مستلزم آن است که هر کتابخانه حسابرسی که از طریق گزینههای خط فرمان --depaudit یا -P تعریف شده است، برای تمامی اشیاء پویای بارگذاریشده توسط برنامه اجرا شود.
- ibtplt
-
درایههای PLT فعالشده با قابلیت ردیابی انشعاب غیرمستقیم اینتل (IBT) را تولید میکند. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- ibt
-
ویژگی GNU_PROPERTY_X86_FEATURE_1_IBT را در بخش .note.gnu.property برای نشان دادن سازگاری با IBT تولید میکند. این گزینه همچنین متضمن ibtplt است. برای Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- indirect-extern-access
- noindirect-extern-access
-
ویژگی GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS را در بخش .note.gnu.property تولید میکند تا نشان دهد فایل شیء به اشارهگرهای تابع متعارف (canonical) نیاز دارد و نمیتواند با بازآرایی رونوشت (copy relocation) استفاده شود. این گزینه همچنین متضمن noextern-protected-data و nocopyreloc است. برای i386 و x86-64 پشتیبانی میشود. گزینهٔ noindirect-extern-access ویژگی GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS را از بخش .note.gnu.property حذف میکند..IP initfirst 4 این گزینه تنها هنگام ساخت یک شیء اشتراکی معنا دارد. این گزینه شیء را طوری علامتگذاری میکند که مقداردهی اولیه زمان اجرای آن پیش از مقداردهی اولیه زمان اجرای سایر اشیای وارد شده به فرآیند در همان زمان رخ دهد. به طور مشابه، نهاییسازی زمان اجرای این شیء پس از نهاییسازی زمان اجرای سایر اشیا رخ خواهد داد.
- interpose
-
مشخص میکند که بارگذار پویا باید ترتیب جستجوی نمادهای خود را به گونهای تغییر دهد که نمادهای درون این کتابخانه اشتراکی بر تمام کتابخانههای اشتراکی دیگری که بدین صورت علامتگذاری نشدهاند مقدم شوند (interpose کنند).
- unique
- nounique
-
هنگام تولید یک کتابخانه اشتراکی یا سایر اشیای ELF با قابلیت بارگذاری پویا، آن را طوری نشانهگذاری میکند که (بهطور پیشفرض) تنها یکبار و فقط در فضاینام اصلی (هنگام استفاده از "dlmopen") بارگذاری شود. این گزینه اصولاً برای علامتگذاری کتابخانههای بنیادین مانند libc، libpthread و غیره استفاده میشود که معمولاً تا زمانی که تنها نمونه از خودشان نباشند به درستی کار نمیکنند. این رفتار توسط فراخواننده "dlmopen" قابل بازنویسی است و روی سازوکارهای بارگذاری خاص (مانند کتابخانههای audit) اعمال نمیشود.
- lam-u48
-
ایجاد GNU_PROPERTY_X86_FEATURE_1_LAM_U48 در بخش .note.gnu.property جهت نشان دادن سازگاری با Intel LAM_U48. در Linux/x86_64 پشتیبانی میشود.
- lam-u57
-
ایجاد GNU_PROPERTY_X86_FEATURE_1_LAM_U57 در بخش .note.gnu.property جهت نشان دادن سازگاری با Intel LAM_U57. در Linux/x86_64 پشتیبانی میشود.
- lam-u48-report=none
- lam-u48-report=warning
- lam-u48-report=error
-
نحوه گزارش عدم وجود ویژگی GNU_PROPERTY_X86_FEATURE_1_LAM_U48 را در بخش ورودی .note.gnu.property مشخص میکند. lam-u48-report=none که حالت پیشفرض است، باعث میشود پیونددهنده ویژگیهای مفقود در فایلهای ورودی را گزارش نکند. lam-u48-report=warning باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی هشدار صادر کند. lam-u48-report=error باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی خطا صادر کند. در Linux/x86_64 پشتیبانی میشود.
- lam-u57-report=none
- lam-u57-report=warning
- lam-u57-report=error
-
نحوه گزارش عدم وجود ویژگی GNU_PROPERTY_X86_FEATURE_1_LAM_U57 را در بخش ورودی .note.gnu.property مشخص میکند. lam-u57-report=none که حالت پیشفرض است، باعث میشود پیونددهنده ویژگیهای مفقود در فایلهای ورودی را گزارش نکند. lam-u57-report=warning باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی هشدار صادر کند. lam-u57-report=error باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی خطا صادر کند. در Linux/x86_64 پشتیبانی میشود.
- lam-report=none
- lam-report=warning
- lam-report=error
-
نحوه گزارش عدم وجود ویژگیهای GNU_PROPERTY_X86_FEATURE_1_LAM_U48 و GNU_PROPERTY_X86_FEATURE_1_LAM_U57 را در بخش ورودی .note.gnu.property مشخص میکند. lam-report=none که حالت پیشفرض است، باعث میشود پیونددهنده ویژگیهای مفقود در فایلهای ورودی را گزارش نکند. lam-report=warning باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی هشدار صادر کند. lam-report=error باعث میشود پیونددهنده برای ویژگیهای مفقود در فایلهای ورودی خطا صادر کند. در Linux/x86_64 پشتیبانی میشود.
- lazy
-
هنگام تولید یک فایل اجرایی یا کتابخانه اشتراکی، آن را نشانهگذاری میکند تا به پیونددهنده پویا بگوید تفکیک فراخوانی توابع را به جای زمان بارگذاری، به لحظه فراخوانی تابع موکول کند (پیوند تنبلانه یا lazy binding). پیوند تنبلانه پیشفرض است.
- loadfltr
-
مشخص میکند که فیلترهای شیء بیدرنگ در زمان اجرا پردازش شوند.
- max-page-size=value
-
حداکثر اندازه صفحه حافظه مورد پشتیبانی را به value تنظیم میکند.
- mark-plt
- nomark-plt
-
مدخلهای PLT را با برچسبهای پویای DT_X86_64_PLT، DT_X86_64_PLTSZ و DT_X86_64_PLTENT نشانهگذاری میکند. از آنجا که این گزینه یک مقدار غیرصفر را در فیلد r_addend بازنشانیهای R_X86_64_JUMP_SLOT ذخیره میکند، برنامههای اجرایی و کتابخانههای اشتراکی حاصل با پیونددهندههای پویایی که فیلد r_addend بازنشانیهای R_X86_64_JUMP_SLOT را نادیده نمیگیرند (مانند پیونددهندهها در نگارشهای قدیمیتر glibc بدون تغییر مربوط به نادیدهگرفتن r_addend در بازنشانیهای R_X86_64_GLOB_DAT و R_X86_64_JUMP_SLOT) ناسازگار خواهند بود. در x86_64 پشتیبانی میشود.
- muldefs
-
تعریفهای چندگانه را مجاز میداند.
- nocopyreloc
-
متغیرهای .dynbss ایجادشده توسط پیونددهنده را که به جای متغیرهای تعریفشده در کتابخانههای اشتراکی استفاده میشوند، غیرفعال میکند. ممکن است منجر به بازنشانیهای متنی پویا (dynamic text relocations) شود.
- nodefaultlib
-
مشخص میکند که جستجوی بارگذار پویا برای وابستگیهای این شیء باید هرگونه مسیرهای جستجوی پیشفرض کتابخانه را نادیده بگیرد.
- nodelete
-
مشخص میکند که شیء نباید در زمان اجرا تخلیه (unload) شود.
- nodlopen
-
مشخص میکند که شیء برای "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 پیشفرض است..IP separate-code 4
- noseparate-code
-
یک سرآیند قطعهٔ کد "PT_LOAD" مجزا در شیء ایجاد میکند. این قطعهای از حافظه را مشخص میکند که فقط باید شامل دستورالعملها باشد و باید در صفحاتی کاملاً مجزا از هر دادهٔ دیگری قرار گیرد. اگر از noseparate-code استفاده شود، قطعهٔ "PT_LOAD" مجزا برای کد ایجاد نمیشود.
- shstk
-
تولید GNU_PROPERTY_X86_FEATURE_1_SHSTK در بخش .note.gnu.property برای نشان دادن سازگاری با Intel Shadow Stack. در Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- stack-size=value
-
تعیین اندازهٔ پشته برای یک قطعهٔ "PT_GNU_STACK" در ELF. مشخص کردن مقدار صفر، هرگونه ایجاد پیشفرض قطعهٔ "PT_GNU_STACK" با اندازهٔ غیرصفر را لغو میکند.
- start-stop-gc
- nostart-stop-gc
-
هنگامی که --gc-sections فعال باشد، ارجاع از یک بخش نگهداشتهشده به "__start_SECNAME" یا "__stop_SECNAME" باعث میشود تمام بخشهای ورودی با نام "SECNAME" نیز حفظ شوند، در صورتی که "SECNAME" بهعنوان یک شناسهٔ C قابل نمایش باشد و هر یک از "__start_SECNAME" یا "__stop_SECNAME" توسط پیونددهنده ساخته (سنتز) شده باشند. گزینهٔ -z start-stop-gc این رفتار را غیرفعال میکند و اجازه میدهد بخشها طوری توسط بازیافت حافظه پاکسازی شوند که گویی نمادهای ساختهشدهٔ ویژه اصلاً تعریف نشدهاند. گزینهٔ -z start-stop-gc هیچ تأثیری بر تعریف "__start_SECNAME" یا "__stop_SECNAME" در یک فایل شیء یا اسکریپت پیونددهنده ندارد. چنین تعریفی بهترتیب از ارائهٔ یک "__start_SECNAME" یا "__stop_SECNAME" ساختهشده توسط پیونددهنده و در نتیجه از رفتار ویژهٔ بازیافت حافظه برای آن ارجاعات جلوگیری خواهد کرد.
- start-stop-visibility=value
-
میزان دیدهشدن نماد ELF را برای نمادهای ساختهشدهٔ "__start_SECNAME" و "__stop_SECNAME" مشخص میکند. مقدار value باید دقیقاً یکی از مقادیر default، internal، hidden، یا protected باشد. اگر هیچ گزینهٔ -z start-stop-visibility داده نشود، جهت سازگاری با رویههای قدیمی از protected استفاده میشود. با این حال، شدیداً توصیه میشود در برنامهها و کتابخانههای اشتراکی جدید از -z start-stop-visibility=hidden استفاده شود تا این نمادها بین اشیاء اشتراکی صادر نشوند، چرا که این موضوع معمولاً مد نظر نیست.
- text
- notext
- textoff
-
گزارش خطا در صورتی که DT_TEXTREL تنظیم شده باشد، یعنی اگر شیء مستقل از موقعیت یا شیء اشتراکی دارای بازآراییهای پویا در بخشهای فقطخواندنی باشد. در صورت استفاده از notext یا textoff خطایی گزارش نمیشود.
- undefs
-
عدم گزارش ارجاعات نماد حلنشده از فایلهای شیء معمولی، چه هنگام ایجاد یک فایل اجرایی و چه هنگام ایجاد یک کتابخانهٔ اشتراکی. این گزینه معکوس -z defs است.
- unique-symbol
- nounique-symbol
-
جلوگیری از نامهای تکراری نمادهای محلی در جدول رشتهای نمادها. در صورت استفاده از unique-symbol، مقدار "."number"" به نامهای نماد محلی تکراری پیوست میشود. پیشفرض nounique-symbol است. - x86-64-baseline
- x86-64-v2
- x86-64-v3
- x86-64-v4
-
سطح ISA معماری x86-64 مورد نیاز در بخش .note.gnu.property را مشخص میکند. x86-64-baseline شناسهٔ "GNU_PROPERTY_X86_ISA_1_BASELINE" را تولید میکند. x86-64-v2 شناسهٔ "GNU_PROPERTY_X86_ISA_1_V2" را تولید میکند. x86-64-v3 شناسهٔ "GNU_PROPERTY_X86_ISA_1_V3" را تولید میکند. x86-64-v4 شناسهٔ "GNU_PROPERTY_X86_ISA_1_V4" را تولید میکند. در Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- isa-level-report=none
- isa-level-report=all
- isa-level-report=needed
- isa-level-report=used
-
مشخص میکند چگونه سطوح ISA معماری x86-64 در فایلهای بازآراستنی ورودی گزارش شوند. گزینهٔ isa-level-report=none، که پیشفرض است، باعث میشود پیونددهنده سطوح ISA معماری x86-64 را در فایلهای ورودی گزارش نکند. گزینهٔ isa-level-report=all باعث میشود پیونددهنده سطوح ISA مورد نیاز و استفادهشدهٔ x86-64 را در فایلهای ورودی گزارش دهد. گزینهٔ isa-level-report=needed باعث میشود پیونددهنده سطوح ISA مورد نیاز x86-64 را در فایلهای ورودی گزارش دهد. گزینهٔ isa-level-report=used باعث میشود پیونددهنده سطوح ISA استفادهشدهٔ x86-64 را در فایلهای ورودی گزارش دهد. در Linux/i386 و Linux/x86_64 پشتیبانی میشود.
سایر کلیدواژهها جهت سازگاری با Solaris نادیده گرفته میشوند.
- --gnu-tls-tag
- --no-gnu-tls-tag
-
افزودن وابستگی برچسب نسخهٔ "GLIBC_ABI_GNU_TLS" در برنامهها و کتابخانههای اشتراکی خروجی هنگام پیوند در برابر glibc، در صورتی که فایلهای شیء بازآراستنی ورودی "___tls_get_addr" را فراخوانی کنند. خروجی در هنگام اجرا در برابر glibcهایی که برچسب نسخهٔ "GLIBC_ABI_GNU_TLS" را تعریف نکرده باشند، در بارگیری و اجرا با شکست مواجه میشود. مگر اینکه در زمان ساخت پیونددهنده توسط گزینهٔ پیکربندی --disable-gnu-tls-tag غیرفعال شده باشد، هنگامی که هیچ گزینهای مشخص نشده باشد، اگر ورودیها دارای فراخوانی "___tls_get_addr" باشند و libc.so برچسب نسخهٔ "GLIBC_ABI_GNU_TLS" را تعریف کند، پیونددهنده وابستگی برچسب نسخهٔ "GLIBC_ABI_GNU_TLS" را اضافه خواهد کرد. در Linux/i386 پشتیبانی میشود.
- --gnu2-tls-tag
- --no-gnu2-tls-tag
-
افزودن وابستگی برچسب نسخهٔ "GLIBC_ABI_GNU2_TLS" در برنامهها و کتابخانههای اشتراکی خروجی هنگام پیوند در برابر glibc، در صورتی که فایلهای شیء بازآراستنی ورودی دارای بازآرایی "R_386_TLS_DESC_CALL" یا "R_X86_64_TLSDESC_CALL" باشند. خروجی در هنگام اجرا در برابر glibcهایی که برچسب نسخهٔ "GLIBC_ABI_GNU2_TLS" را تعریف نکرده باشند، در بارگیری و اجرا با شکست مواجه میشود. مگر اینکه در زمان ساخت پیونددهنده توسط گزینهٔ پیکربندی --disable-gnu2-tls-tag غیرفعال شده باشد، هنگامی که هیچ گزینهای مشخص نشده باشد، اگر ورودیها دارای بازآرایی "R_386_TLS_DESC_CALL" یا "R_X86_64_TLSDESC_CALL" باشند و libc.so برچسب نسخهٔ "GLIBC_ABI_GNU2_TLS" را تعریف کند، پیونددهنده وابستگی برچسب نسخهٔ "GLIBC_ABI_GNU2_TLS" را اضافه خواهد کرد. در Linux/i386 و Linux/x86_64 پشتیبانی میشود.
- -( archives -)
- --start-group archives --end-group
-
آرگومان archives باید فهرستی از فایلهای آرشیو باشد. اینها میتوانند نامهای صریح فایلها، یا گزینههای -l باشند. آرشیوهای مشخصشده بهطور مکرر جستجو میشوند تا زمانی که هیچ ارجاع تعریفنشدهٔ جدیدی ایجاد نشود. بهطور معمول، یک آرشیو تنها یک بار و به ترتیبی که در خط فرمان مشخص شده است جستجو میشود. اگر نمادی در آن آرشیو برای حل یک نماد تعریفنشده که توسط یک شیء در آرشیوی بعد از آن در خط فرمان ارجاع داده شده لازم باشد، پیونددهنده قادر به حل آن ارجاع نخواهد بود. با گروهبندی آرشیوها، همگی آنها بهطور مکرر جستجو خواهند شد تا تمام ارجاعات ممکن برطرف شوند. استفاده از این گزینه هزینهٔ کارایی چشمگیری دارد. بهتر است تنها زمانی استفاده شود که ارجاعات مدور (circular references) اجتنابناپذیری میان دو یا چند آرشیو وجود داشته باشد.
- --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 مراجعه کنید..IP --add-needed 4
- --no-add-needed
-
این دو گزینه به دلیل شباهت نامهایشان به گزینههای --as-needed و --no-as-needed منسوخ شدهاند. آنها با --copy-dt-needed-entries و --no-copy-dt-needed-entries جایگزین شدهاند.
- -assert keyword
-
این گزینه برای سازگاری با SunOS نادیده گرفته میشود.
- -Bdynamic
- -dy
-
پیوند با کتابخانههای پویا (dynamic). این گزینه تنها در سکوهایی معنا دارد که از کتابخانههای اشتراکی (shared) پشتیبانی میکنند. این گزینه معمولاً در چنین سکوهایی پیشفرض است. گونههای مختلف این گزینه برای سازگاری با سامانههای گوناگون ارائه شدهاند. میتوانید از این گزینه چندین بار در خط فرمان استفاده کنید: این گزینه بر جستجوی کتابخانه برای گزینههای -l که پس از آن میآیند تأثیر میگذارد.
- -Bgroup
-
تنظیم پرچم "DF_1_GROUP" در مدخل "DT_FLAGS_1" در بخش پویا (dynamic section). این کار باعث میشود پیونددهنده زمان اجرا (runtime linker) جستجوها را در این شیء و وابستگیهای آن تنها در درون گروه انجام دهد. گزینهٔ --unresolved-symbols=report-all به صورت ضمنی اعمال میشود. این گزینه تنها بر روی سکوهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنا دارد.
- -Bstatic
- -dn
- -static
-
عدم پیوند با کتابخانههای اشتراکی. این گزینه تنها در سکوهایی معنا دارد که از کتابخانههای اشتراکی پشتیبانی میکنند. گونههای مختلف این گزینه برای سازگاری با سامانههای گوناگون است. میتوانید از این گزینه چندین بار در خط فرمان استفاده کنید: این گزینه بر جستجوی کتابخانه برای گزینههای -l که پس از آن میآیند تأثیر میگذارد. همچنین این گزینه به صورت ضمنی --unresolved-symbols=report-all را اعمال میکند. این گزینه را میتوان همراه با -shared به کار برد. انجام این کار به این معناست که یک کتابخانه اشتراکی ایجاد میشود، اما تمام ارجاعات خارجی کتابخانه باید با گنجاندن مدخلهایی از کتابخانههای ایستا حل و فصل شوند.
- -Bsymbolic
-
هنگام ایجاد یک کتابخانه اشتراکی، ارجاعات به نمادهای سراسری (global symbols) را به تعاریف موجود در همان کتابخانه اشتراکی (در صورت وجود) متصل (bind) میکند. به طور معمول، برای برنامهای که با یک کتابخانه اشتراکی پیوند خورده این امکان وجود دارد که تعریف درون کتابخانه اشتراکی را بازنویسی (override) کند. این گزینه تنها روی سکوهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنا دارد.
- -Bsymbolic-functions
-
هنگام ایجاد یک کتابخانه اشتراکی، ارجاعات به نمادهای توابع سراسری را به تعریف درون همان کتابخانه اشتراکی (در صورت وجود) متصل میکند. این گزینه تنها روی سکوهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنا دارد.
- -Bno-symbolic
-
این گزینه میتواند گزینههای -Bsymbolic و -Bsymbolic-functions که پیشتر تعیین شدهاند را لغو کند.
- --dynamic-list=dynamic-list-file
-
نام یک پروندهٔ فهرست پویا (dynamic list) را برای پیونددهنده مشخص میکند. این گزینه معمولاً هنگام ایجاد کتابخانههای اشتراکی برای مشخص کردن فهرستی از نمادهای سراسری به کار میرود که ارجاعات آنها نباید به تعریف درون کتابخانه اشتراکی متصل شود، یا هنگام ایجاد فایلهای اجرایی پیوندیافتهٔ پویا برای تعیین فهرستی از نمادها که باید به جدول نماد در پروندهٔ اجرایی اضافه شوند استفاده میشود. این گزینه تنها در سکوهای ELF که از کتابخانههای اشتراکی پشتیبانی میکنند معنا دارد. قالب فهرست پویا همانند گره نسخه (version node) بدون حوزه و نام گره است. برای اطلاعات بیشتر VERSION را ببینید.
- --dynamic-list-data
-
تمام نمادهای دادهای سراسری را به فهرست پویا اضافه میکند.
- --dynamic-list-cpp-new
-
فهرست پویای توکار را برای عملگرهای new و delete در ++C فراهم میکند. این گزینه عمدتاً برای ساخت libstdc++ به صورت اشتراکی مفید است.
- --dynamic-list-cpp-typeinfo
-
فهرست پویای توکار را برای شناسایی نوع زمان اجرا (RTTI) در ++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 table) تولید میکند. اگر پروندهٔ نگاشت پیونددهنده (map file) در حال تولید باشد، جدول ارجاع متقابل در پروندهٔ نگاشت چاپ میشود. در غیر این صورت، روی خروجی استاندارد چاپ خواهد شد. قالب جدول عمداً ساده در نظر گرفته شده است تا در صورت لزوم بتوان آن را به آسانی توسط یک اسکریپت پردازش کرد. نمادها مرتبشده بر اساس نام چاپ میشوند. برای هر نماد، فهرستی از نام پروندهها ارائه میشود. اگر نماد تعریف شده باشد، اولین پروندهٔ فهرستشده، مکان تعریف آن است. اگر نماد به عنوان یک مقدار عمومی (common) تعریف شده باشد، هر پروندهای که این وضعیت در آن رخ داده در ادامه میآید. در نهایت تمام پروندههایی که به آن نماد ارجاع میدهند فهرست میشوند.
- --ctf-variables
- --no-ctf-variables
-
قالب اطلاعات اشکالزدایی CTF از بخشی پشتیبانی میکند که نامها و انواع متغیرهای موجود در برنامه را که در هیچ جدول نمادی ظاهر نمیشوند کدگذاری مینماید. این متغیرها مسلماً نمیتوانند توسط اشکالزداهای سنتی از طریق نشانی مورد جستجو قرار گیرند، بنابراین فضای مصرفشده برای نوع و نام آنها معمولاً هدر میرود: انواع معمولاً کوچک هستند اما نامها اغلب اینگونه نیستند. گزینهٔ --ctf-variables باعث ایجاد چنین بخشی میشود. رفتار پیشفرض را میتوان با --no-ctf-variables بازگرداند.
- --ctf-share-types=method
-
تنظیم روش مورد استفاده برای به اشتراکگذاری انواع میان واحدهای ترجمه (translation units) در CTF.
-
تمام انواعی که تعاریف مبهم ندارند را در فرهنگ لغت اشتراکی قرار میدهد، جایی که اشکالزداها میتوانند به آسانی به آنها دسترسی داشته باشند، حتی اگر فقط در یک واحد ترجمه ظاهر شده باشند. این حالت پیشفرض است.
-
تنها انواعی را که در چندین واحد ترجمه ظاهر شدهاند در فرهنگ لغت اشتراکی قرار میدهد: انواع با تنها یک تعریف به فرهنگ لغتهای مخصوص هر واحد ترجمه میروند. انواع با تعاریف مبهم در چندین واحد ترجمه همواره به فرهنگ لغتهای مخصوص هر واحد ترجمه وارد میشوند. این امر تمایل به بزرگتر کردن CTF دارد، اما ممکن است حجم CTF در فرهنگ لغت اشتراکی را کاهش دهد. برای پروژههای بسیار بزرگ، این کار ممکن است سرعت باز کردن CTF را افزایش داده و در زمان اجرا حافظه را در مصرفکنندهٔ CTF ذخیره کند.
- --no-define-common
-
این گزینه از تخصیص نشانی به نمادهای عمومی (common symbols) جلوگیری میکند. دستور اسکریپت "INHIBIT_COMMON_ALLOCATION" نیز همین اثر را دارد. گزینهٔ --no-define-common امکان جدا کردن تصمیم تخصیص نشانی به نمادهای Common را از انتخاب نوع پروندهٔ خروجی فراهم میکند؛ در غیر این صورت، یک نوع خروجی غیرقابلبازجایابی، تخصیص نشانی به نمادهای Common را اجباری میسازد. استفاده از --no-define-common به نمادهای Common که از یک کتابخانه اشتراکی مورد ارجاع قرار گرفتهاند اجازه میدهد تنها در برنامهٔ اصلی نشانیدهی شوند. این کار فضای تکراری بلااستفاده در کتابخانه اشتراکی را حذف میکند و همچنین از هرگونه سردرگمی احتمالی ناشی از حل و فصل به نسخهٔ تکراری اشتباه، هنگامی که ماژولهای پویای متعددی با مسیرهای جستجوی اختصاصی برای رفع نماد در زمان اجرا وجود دارند، جلوگیری مینماید. - --force-group-allocation
-
این گزینه باعث میشود پیونددهنده اعضای گروه بخش (section group) را مانند بخشهای ورودی عادی جای دهد و گروههای بخش را حذف کند. این رفتار پیشفرض برای یک پیوند نهایی (final link) است، اما از این گزینه میتوان برای تغییر رفتار پیوند بازجایابیپذیر (-r) استفاده کرد. دستور اسکریپت "FORCE_GROUP_ALLOCATION" نیز همین اثر را دارد..IP --defsym=symbol=expression 4 یک نماد سراسری در فایل خروجی ایجاد میکند که حاوی آدرس مطلقی است که توسط expression تعیین شده است. میتوانید برای تعریف چندین نماد در خط فرمان، این گزینه را به تعداد دفعات لازم به کار ببرید. شکل محدودی از محاسبات برای expression در این زمینه پشتیبانی میشود: میتوانید یک مقدار ثابت هگزادسیمال یا نام یک نماد موجود را وارد کنید، یا از "+" و "-" برای جمع یا تفریق مقادیر ثابت هگزادسیمال یا نمادها بهره ببرید. اگر به عبارتهای پیچیدهتری نیاز دارید، استفاده از زبان دستور پیونددهنده از طریق یک اسکریپت را مد نظر قرار دهید. نکته: نباید هیچ فاصلهای بین symbol، علامت مساوی ("=")، و expression وجود داشته باشد. پیونددهنده آرگومانهای --defsym و -T را به ترتیب پردازش میکند؛ قرار دادن --defsym پیش از -T، نماد را پیش از پردازش اسکریپت پیونددهنده از سوی -T تعریف خواهد کرد، در حالی که قرار دادن --defsym پس از -T نماد را پس از پردازش اسکریپت پیونددهنده تعریف میکند. این تفاوت روی عبارتهایی در اسکریپت پیونددهنده که از نمادهای --defsym استفاده میکنند تأثیر میگذارد؛ اینکه کدام ترتیب درست است به هدف شما بستگی خواهد داشت.
- --demangle[=style]
- --no-demangle
-
این گزینهها تعیین میکنند که نام نمادها در پیامهای خطا و سایر خروجیها رمزگشایی (demangle) شوند یا خیر. هنگامی که به پیونددهنده دستور demangle داده میشود، تلاش میکند نام نمادها را به شیوهای خوانا نمایش دهد: زیرخطهای ابتدایی را در صورتی که توسط قالب فایل شیء استفاده شده باشند حذف میکند، و نامهای درهمپیچیدهٔ (mangled) نمادهای ++C را به نامهای خوانا برای کاربر تبدیل مینماید. کامپایلرهای مختلف سبکهای درهمپیچیدن گوناگونی دارند. از آرگومان اختیاری سبک رمزگشایی میتوان برای انتخاب سبک مناسب برای کامپایلر خود استفاده کرد. پیونددهنده بهطور پیشفرض نمادها را رمزگشایی میکند، مگر اینکه متغیر محیطی COLLECT_NO_DEMANGLE تنظیم شده باشد. این گزینهها را میتوان برای بازنویسی رفتار پیشفرض استفاده کرد.
- -Ifile
- --dynamic-linker=file
-
نام پیونددهندهٔ پویا (dynamic linker) را تنظیم میکند. این گزینه تنها هنگام تولید فایلهای اجرایی ELF با پیوند پویا معنادار است. پیونددهندهٔ پویای پیشفرض معمولاً صحیح است؛ از این گزینه استفاده نکنید مگر اینکه بدانید چه کار میکنید.
- --no-dynamic-linker
-
هنگام تولید یک فایل اجرایی، درخواست استفاده از پیونددهندهٔ پویا در زمان بارگذاری (load-time) را حذف میکند. این گزینه تنها برای فایلهای اجرایی ELF که حاوی بازنشانیهای پویا (dynamic relocations) هستند معنادار است، و معمولاً نیازمند کد نقطهٔ ورود است که قادر به پردازش این بازنشانیها باشد.
- --embedded-relocs
-
این گزینه مشابه گزینهٔ --emit-relocs است، با این تفاوت که بازنشانیها در بخشی مختص هدف ذخیره میشوند. این گزینه تنها توسط اهداف BFIN، CR16 و M68K پشتیبانی میشود.
- --disable-multiple-abs-defs
-
اجازهٔ تعاریف چندگانه با نمادهای موجود در نام فایلی که توسط -R یا --just-symbols فراخوانی شده است را نمیدهد.
- --fatal-warnings
- --no-fatal-warnings
-
با تمامی هشدارها به عنوان خطا برخورد میکند. رفتار پیشفرض را میتوان با گزینهٔ --no-fatal-warnings بازیابی کرد.
- -w
- --no-warnings
-
هیچ پیام هشدار یا خطایی را نمایش نمیدهد. این گزینه در صورت فعال بودن --fatal-warnings بر آن ارجحیت خواهد داشت. از این گزینه میتوان زمانی استفاده کرد که مشخص است باینری خروجی کار نخواهد کرد، اما همچنان نیاز به ساخت آن وجود دارد.
- --force-exe-suffix
-
اطمینان حاصل میکند که فایل خروجی دارای پسوند .exe باشد. اگر یک فایل خروجیِ با موفقیت ساختهشده و بهطور کامل پیوندخورده پسوند ".exe" یا ".dll" نداشته باشد، این گزینه پیونددهنده را وادار میکند تا فایل خروجی را با همان نام اما با پسوند ".exe" کپی کند. این گزینه هنگام استفاده از makefileهای تغییرنیافتهٔ یونیکس روی میزبان Microsoft Windows مفید است، زیرا برخی از نسخههای ویندوز فایلی را که به پسوند ".exe" ختم نمیشود اجرا نمیکنند.
- --gc-sections
- --no-gc-sections
-
جمعآوری زبالهٔ (garbage collection) بخشهای ورودی استفادهنشده را فعال میکند. این گزینه روی اهدافی که از آن پشتیبانی نمیکنند نادیده گرفته میشود. رفتار پیشفرض (عدم انجام این جمعآوری زباله) را میتوان با تعیین --no-gc-sections در خط فرمان بازیابی کرد. توجه داشته باشید که جمعآوری زباله برای اهداف با قالب COFF و PE پشتیبانی میشود، اما پیادهسازی آن در حال حاضر آزمایشی در نظر گرفته میشود. --gc-sections با بررسی نمادها و بازنشانیها تعیین میکند که کدام بخشهای ورودی استفاده شدهاند. بخشی که نماد نقطهٔ ورود را دارد و تمامی بخشهای حاوی نمادهای تعریفنشده در خط فرمان نگهداشته خواهند شد؛ همچنین بخشهایی که حاوی نمادهای مورد ارجاع اشیای پویا هستند حفظ میشوند. توجه داشته باشید که هنگام ساخت کتابخانههای اشتراکی، پیونددهنده باید فرض کند که به هر نماد قابل مشاهدهای ارجاع داده شده است. پس از تعیین این مجموعهٔ اولیه از بخشها، پیونددهنده به صورت بازگشتی هر بخشی را که توسط بازنشانیهای آنها ارجاع داده شده است به عنوان مورد استفاده علامتگذاری میکند. گزینههای --entry، --undefined و --gc-keep-exported را ببینید. این گزینه را میتوان هنگام انجام پیوند جزئی (که با گزینهٔ -r فعال میشود) تنظیم کرد. در این حالت ریشهٔ نمادهای نگهداشتهشده باید صراحتاً توسط یکی از گزینههای --entry، --undefined، یا --gc-keep-exported یا توسط یک دستور "ENTRY" در اسکریپت پیونددهنده مشخص شود. به عنوان یک افزونهٔ گنو، بخشهای ورودی 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 ./foo.exe.bar] -o ../dir2/foo.exe -Map=../dir/% [Creates ../dir/../dir2/foo.exe.map] -o ../dir2/foo.exe -Map=../dir/%.bar [Creates ../dir/../dir2/foo.exe.bar]
تعیین بیش از یک نویسهٔ "%" یک خطا محسوب میشود.
اگر فایل نگاشت از قبل وجود داشته باشد، با این عملیات بازنویسی خواهد شد..IP --no-keep-memory 4 ld معمولاً با ذخیره موقت (کش کردن) جدولهای نماد فایلهای ورودی در حافظه، سرعت را به مصرف حافظه ترجیح میدهد. این گزینه به ld اعلام میکند که در عوض با خواندن مجدد جدولهای نماد در صورت نیاز، مصرف حافظه را بهینهسازی کند. این عمل ممکن است زمانی که ld هنگام پیوند یک فایل اجرایی بزرگ با کمبود حافظه مواجه میشود، لازم باشد.
- --no-undefined
- -z defs
- گزارش دادن
ارجاعات
نمادهای
حلنشده از
فایلهای
شیءِ (object)
معمولی. این
کار حتی اگر
پیونددهنده
در حال ساخت
یک
کتابخانهٔ
اشتراکی
غیرنمادین
(non-symbolic) باشد نیز
انجام
میشود.
سوئیچ
--[no-]allow-shlib-undefined
رفتار
مربوط به
گزارش
ارجاعات
حلنشدهٔ
یافتشده
در
کتابخانههای
اشتراکی در
حال پیوند
را کنترل
میکند.
اثرات این گزینه با استفاده از "-z undefs" قابل بازگردانی است.
- --allow-multiple-definition
- -z muldefs
- بهطور معمول وقتی یک نماد چندین بار تعریف شود، پیونددهنده یک خطای مهلک گزارش میکند. این گزینهها تعاریف چندگانه را مجاز میشمارند و از اولین تعریف استفاده خواهد شد.
- --allow-shlib-undefined
- --no-allow-shlib-undefined
- نمادهای
تعریفنشده
در
کتابخانههای
اشتراکی را
مجاز یا
غیرمجاز
میکند. این
سوئیچ
مشابه --no-undefined
است، با این
تفاوت که
رفتار را
هنگامی که
نمادهای
تعریفنشده
در یک
کتابخانهٔ
اشتراکی
هستند (نه
در یک فایل
شیءِ
معمولی)
تعیین
میکند. این
گزینه بر
نحوهٔ
رسیدگی به
نمادهای
تعریفنشده
در
فایلهای
شیءِ
معمولی
تأثیری
ندارد.
رفتار پیشفرض بدینصورت است که اگر پیونددهنده برای ایجاد یک فایل اجرایی استفاده شود، برای هرگونه نماد تعریفنشدهٔ ارجاعشده در کتابخانههای اشتراکی خطا گزارش میکند، اما اگر پیونددهنده برای ایجاد یک کتابخانهٔ اشتراکی به کار رود، به آنها اجازه میدهد.
دلایل مجاز شمردن ارجاعات به نمادهای تعریفنشده در کتابخانههای اشتراکیِ مشخصشده در زمان پیوند عبارتند از:
- کتابخانهٔ اشتراکیِ مشخصشده در زمان پیوند ممکن است با کتابخانهای که در زمان بارگذاری (load time) در دسترس قرار میگیرد یکسان نباشد، بنابراین نماد ممکن است واقعاً در زمان بارگذاری قابل حل باشد.
- برخی
سیستمعاملها
مانند BeOS و HPPA
وجود دارند
که در آنها
نمادهای
تعریفنشده
در
کتابخانههای
اشتراکی
امری طبیعی
و عادی است.
به عنوان مثال، هستهٔ BeOS کتابخانههای اشتراکی را در زمان بارگذاری وصلهگذاری (patch) میکند تا مناسبترین تابع را برای معماری فعلی انتخاب نماید. از این قابلیت به عنوان نمونه برای انتخاب پویای یک تابع memset مناسب استفاده میشود.
- --error-handling-script=scriptname
- اگر این
گزینه مشخص
شود،
پیونددهنده
در صورت
بروز
هرگونه
خطا، scriptname را
اجرا
میکند. با
این حال، در
حال حاضر
تنها از دو
نوع خطا
پشتیبانی
میشود:
نمادهای
مفقود (missing symbols) و
کتابخانههای
مفقود (missing libraries).
دو آرگومان
به اسکریپت
ارسال
خواهد شد:
کلیدواژهٔ
"undefined-symbol" یا `missing-lib" و
name نماد
تعریفنشده
یا
کتابخانهٔ
مفقود. هدف
این است که
اسکریپت
پیشنهادهایی
را دربارهٔ
مکان
احتمالی
یافتن نماد
یا
کتابخانه
به کاربر
ارائه دهد.
پس از پایان
کار
اسکریپت،
پیام خطای
معمولی
پیونددهنده
نمایش داده
خواهد شد.
در دسترس بودن این گزینه توسط یک سوئیچ در زمان پیکربندی (configure time) کنترل میشود، بنابراین ممکن است در برخی پیادهسازیهای خاص وجود نداشته باشد.
- --no-undefined-version
- بهطور معمول وقتی یک نماد دارای نسخهٔ تعریفنشده باشد، پیونددهنده آن را نادیده میگیرد. این گزینه نمادهای دارای نسخهٔ تعریفنشده را غیرمجاز کرده و در عوض یک خطای مهلک صادر میکند.
- --default-symver
- ایجاد و استفاده از یک نسخهٔ نماد پیشفرض (همان soname) برای نمادهای صادرشدهٔ (exported) بدون نسخه.
- --default-imported-symver
- ایجاد و استفاده از یک نسخهٔ نماد پیشفرض (همان soname) برای نمادهای واردشدهٔ (imported) بدون نسخه.
- --no-warn-mismatch
- بهطور معمول ld در صورتی که بخواهید فایلهای ورودی ناهماهنگ با یکدیگر را پیوند دهید (شاید به دلیل کامپایل شدن برای پردازندههای مختلف یا اندیانهای متفاوت)، خطا صادر میکند. این گزینه به ld میگوید که باید این خطاهای احتمالی را بدون صدا بپذیرد. از این گزینه تنها باید با احتیاط استفاده شود؛ در مواردی که اقدام خاصی انجام دادهاید که اطمینان میدهد خطاهای پیونددهنده نامربوط و بیمورد هستند.
- --no-warn-search-mismatch
- بهطور معمول ld اگر در طول جستجوی کتابخانه یک کتابخانهٔ ناسازگار پیدا کند، هشدار میدهد. این گزینه هشدار مذکور را بیصدا میکند.
- --no-whole-archive
- اثر گزینهٔ --whole-archive را برای فایلهای آرشیو بعدی غیرفعال میکند.
- --noinhibit-exec
- حفظ فایل خروجی اجرایی تا زمانی که هنوز قابل استفاده باشد. بهطور معمول، اگر پیونددهنده در طول فرآیند پیوند با خطایی مواجه شود، فایل خروجی تولید نمیکند؛ در صورت بروز هر خطایی، بدون نوشتن فایل خروجی خارج میشود.
- -nostdlib
- تنها دایرکتوریهای کتابخانهای را جستجو میکند که بهطور صریح در خط فرمان مشخص شدهاند. دایرکتوریهای کتابخانهای که در اسکریپتهای پیونددهنده مشخص شدهاند (شامل اسکریپتهای پیونددهندهای که در خط فرمان مشخص شدهاند) نادیده گرفته میشوند.
- --oformat=output-format
- ممکن است ld برای پشتیبانی از بیش از یک نوع فایل شیء پیکربندی شده باشد. اگر ld شما به این شکل پیکربندی شده است، میتوانید از گزینهٔ --oformat برای تعیین قالب باینری فایل شیء خروجی استفاده کنید. حتی زمانی که ld برای پشتیبانی از قالبهای شیء جایگزین پیکربندی شده باشد، معمولاً نیازی به مشخص کردن این گزینه ندارید، زیرا ld باید طوری پیکربندی شده باشد که رایجترین قالب را روی هر ماشین به عنوان قالب خروجی پیشفرض تولید کند. output-format یک رشتهٔ متنی و نام قالبی خاص است که توسط کتابخانههای BFD پشتیبانی میشود. (میتوانید قالبهای باینری موجود را با objdump -i فهرست کنید.) دستور اسکریپت "OUTPUT_FORMAT" نیز میتواند قالب خروجی را مشخص کند، اما این گزینه آن را نادیده گرفته و جایگزین میکند.
- --out-implib file
- ایجاد یک کتابخانهٔ وارداتی در file متناظر با فایل اجرایی که پیونددهنده در حال تولید آن است (مانند یک DLL یا یک برنامهٔ ELF). این کتابخانهٔ وارداتی (که برای DLLها باید "*.dll.a" یا "*.a" نامیده شود) میتواند برای پیوند دادن کلاینتها با فایل اجرایی تولیدشده استفاده شود؛ این رفتار امکان صرفنظر کردن از یک مرحلهٔ جداگانه برای ساخت کتابخانهٔ وارداتی (مانند "dlltool" برای DLLها) را فراهم میسازد. این گزینه تنها برای پورتهای پیونددهنده با مقصد i386 PE و ELF در دسترس است.
- -pie
- --pic-executable
- ایجاد یک فایل اجرایی مستقل از موقعیت (PIE). این ویژگی در حال حاضر تنها روی بسترهای ELF پشتیبانی میشود. فایلهای اجرایی مستقل از موقعیت توسط پیونددهندهٔ پویا به نشانی مجازیای که سیستمعامل برای آنها انتخاب میکند، بازنشانی (relocate) میشوند که میتواند در هر بار اجرا متفاوت باشد. آنها در سرایند فایل ELF با عنوان ET_DYN مشخص میشوند، اما از جهات مختلفی با کتابخانههای اشتراکی تفاوت دارند. بهویژه، نمادهای تعریفشده در یک PIE بهطور پیشفرض برخلاف کتابخانههای اشتراکی، نمیتوانند توسط شیء دیگری رونویسی (override) شوند.
- -no-pie
- ایجاد یک فایل اجرایی وابسته به موقعیت. این حالت پیشفرض است.
- -qmagic
- این گزینه به منظور سازگاری با Linux نادیده گرفته میشود.
- -Qy
- این گزینه به منظور سازگاری با SVR4 نادیده گرفته میشود.
- --relax
- --no-relax
- گزینهای
با اثرات
وابسته به
ماشین. این
گزینه فقط
در چند مقصد
(target) پشتیبانی
میشود.
در برخی بسترها، گزینهٔ --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 اولویت داشته و آنها را باطل میکند..IP -rpath=dir 4 یک دایرکتوری را به مسیر جستجوی کتابخانههای زمان اجرا اضافه میکند. این گزینه هنگام پیوند دادن یک فایل اجرایی ELF با اشیاء مشترک (shared objects) استفاده میشود. تمام آرگومانهای -rpath به یکدیگر الحاق شده و به پیونددهنده زمان اجرا فرستاده میشوند، که از آنها برای یافتن اشیاء مشترک در زمان اجرا استفاده میکند.
گزینه -rpath همچنین هنگام یافتن اشیاء مشترکی که توسط اشیاء مشترک صراحتاً گنجاندهشده در پیوند مورد نیاز هستند، استفاده میشود؛ توضیحات گزینه -rpath-link را ببینید. جستجوی -rpath به این روش فقط توسط پیونددهندههای بومی (native) و پیونددهندههای متقاطع (cross linkers) که با گزینه --with-sysroot پیکربندی شدهاند پشتیبانی میشود.
اگر هنگام پیوند دادن یک فایل اجرایی ELF از -rpath استفاده نشود، در صورت تعریف بودن متغیر محیطی "LD_RUN_PATH"، محتویات آن مورد استفاده قرار خواهد گرفت.
گزینه -rpath ممکن است در SunOS نیز استفاده شود. بهطور پیشفرض در SunOS، پیونددهنده یک مسیر جستجوی زمان اجرا از تمام گزینههای -L دادهشده به آن تشکیل میدهد. اگر از یک گزینه -rpath استفاده شود، مسیر جستجوی زمان اجرا منحصراً با استفاده از گزینههای -rpath تشکیل خواهد شد و گزینههای -L نادیده گرفته میشوند. این میتواند هنگام استفاده از gcc مفید باشد، چرا که این کامپایلر گزینههای -L بسیاری اضافه میکند که ممکن است روی سیستمهای فایل سوارشده با NFS باشند.
برای سازگاری با سایر پیونددهندههای ELF، اگر پس از گزینه -R به جای نام فایل، نام یک دایرکتوری بیاید، مانند گزینه -rpath با آن رفتار میشود.
- -rpath-link=dir
- هنگام
استفاده از
ELF یا SunOS، یک
کتابخانه
اشتراکی
ممکن است به
کتابخانه
دیگری نیاز
داشته باشد.
این اتفاق
زمانی رخ
میدهد که
یک پیوند
"ld -shared"، یک
کتابخانه
اشتراکی را
به عنوان
یکی از
فایلهای
ورودی شامل
شود.
وقتی پیونددهنده هنگام انجام یک پیوند غیرمشترک و غیرقابلجابجایی با چنین وابستگیای مواجه میشود، در صورتی که کتابخانه مورد نیاز صراحتاً گنجانده نشده باشد، بهطور خودکار تلاش میکند آن را پیدا کرده و در پیوند بگنجاند. در چنین حالتی، چندین دایرکتوری به ترتیبی که در زیر شرح داده شده جستجو میشوند. گزینه -rpath-link نخستین مجموعه از دایرکتوریها را برای جستجو مشخص میکند. این گزینه میتواند با ارائه فهرستی از نامها که با دونقطه از هم جدا شدهاند، یا با تکرار چندینباره در خط فرمان، دنبالهای از نامهای دایرکتوری را مشخص کند.
نشانههای $ORIGIN و $LIB میتوانند در این دایرکتوریهای جستجو ظاهر شوند. آنها در مورد $ORIGIN با مسیر کامل دایرکتوری حاوی برنامه یا شیء مشترک، و در مورد $LIB بسته به نوع باینری با lib - برای باینریهای ۳۲ بیتی - یا lib64 - برای باینریهای ۶۴ بیتی - جایگزین خواهند شد.
فرم جایگزین این نشانهها - یعنی ${ORIGIN} و ${LIB} نیز قابل استفاده است. نشانه $PLATFORM پشتیبانی نمیشود.
گزینه --rpath-link باید با احتیاط استفاده شود زیرا مسیر جستجویی را که ممکن است به صورت ثابت در یک کتابخانه اشتراکی کامپایل شده باشد بازنویسی میکند. در چنین حالتی ممکن است بهطور ناخواسته از مسیر جستجوی متفاوتی نسبت به آنچه پیونددهنده زمان اجرا استفاده میکرد استفاده شود.
هنگامی که کتابخانههای اشتراکی اضافی مورد نیاز باشند، پیونددهنده برای یافتن آنها دایرکتوریها را به ترتیبی که در زیر آمده است جستجو خواهد کرد. البته توجه داشته باشید که این تنها برای کتابخانههای اضافی مورد نیاز برای برآوردن وابستگیهای کتابخانههای اشتراکی از پیش گنجاندهشده اعمال میشود. این مورد شامل کتابخانههایی که از طریق گزینه خط فرمان -l گنجانده شدهاند نمیشود. جستجو برای کتابخانههای -l فقط در دایرکتوریهای مشخصشده توسط گزینه -L انجام میشود.
- 1.
- هر دایرکتوری مشخصشده توسط گزینههای -rpath-link.
- 2.
- هر دایرکتوری مشخصشده توسط گزینههای -rpath. تفاوت بین -rpath و -rpath-link این است که دایرکتوریهای مشخصشده توسط گزینههای -rpath در فایل اجرایی گنجانده شده و در زمان اجرا استفاده میشوند، در حالی که گزینه -rpath-link فقط در زمان پیوند مؤثر است. جستجوی -rpath به این روش فقط توسط پیونددهندههای بومی و پیونددهندههای متقاطع که با گزینه --with-sysroot پیکربندی شدهاند پشتیبانی میشود.
- 3.
- در یک سیستم ELF، برای پیونددهندههای بومی، اگر از گزینههای -rpath و -rpath-link استفاده نشده باشد، محتویات متغیر محیطی "LD_RUN_PATH" جستجو میشود.
- 4.
- در SunOS، اگر از گزینه -rpath استفاده نشده باشد، هر دایرکتوری مشخصشده با استفاده از گزینههای -L جستجو میشود.
- 5.
- برای یک پیونددهنده بومی، محتویات متغیر محیطی "LD_LIBRARY_PATH" جستجو میشود.
- 6.
- برای یک پیونددهنده ELF بومی، دایرکتوریهای موجود در "DT_RUNPATH" یا "DT_RPATH" یک کتابخانه اشتراکی برای کتابخانههای اشتراکی مورد نیاز آن جستجو میشوند. در صورت وجود ورودیهای "DT_RUNPATH"، ورودیهای "DT_RPATH" نادیده گرفته میشوند.
- 7.
- برای پیونددهنده در یک سیستم لینوکس، در صورت وجود فایل /etc/ld.so.conf، فهرست دایرکتوریهای موجود در آن فایل. نکته: مسیر این فایل با مقدار "sysroot" (در صورت تعریف شدن) و سپس در صورتی که پیونددهنده با گزینه --prefix=<path> پیکربندی شده باشد، با هر رشته "prefix" پیشوندگذاری میشود.
- 8.
- برای یک پیونددهنده بومی در سیستم FreeBSD، هر دایرکتوری مشخصشده توسط ماکروی "_PATH_ELF_HINTS" که در فایل هدر elf-hints.h تعریف شده است.
- 9.
- هر دایرکتوری مشخصشده توسط دستور "SEARCH_DIR" در یک اسکریپت پیونددهنده ارائهشده در خط فرمان، از جمله اسکریپتهای مشخصشده توسط -T (اما نه -dT).
- 10.
- دایرکتوریهای پیشفرض، معمولاً /lib و /usr/lib.
- 11.
- هر دایرکتوری مشخصشده توسط یک افزونه LDPT_SET_EXTRA_LIBRARY_PATH.
- 12.
- هر دایرکتوری مشخصشده توسط یک دستور "SEARCH_DIR" در یک اسکریپت پیونددهنده پیشفرض.
البته توجه داشته باشید که در سیستمهای مبتنی بر لینوکس یک هشدار مضاعف وجود دارد: اگر گزینه --as-needed فعال باشد و یک کتابخانه اشتراکی پیدا شود که معمولاً پاسخگوی جستجو باشد و این کتابخانه برچسب DT_NEEDED را برای libc.so نداشته باشد، و در ادامه مجموعه دایرکتوریهای جستجو کتابخانه اشتراکی دیگری وجود داشته باشد که آن هم پاسخگوی جستجو باشد و این کتابخانه اشتراکی دوم برچسب DT_NEEDED را برای libc.so داشته باشد، آنگاه کتابخانه دوم به جای کتابخانه اول انتخاب خواهد شد.
اگر کتابخانه اشتراکی مورد نیاز یافت نشود، پیونددهنده یک هشدار صادر کرده و به عملیات پیوند ادامه میدهد.
- --section-ordering-file=script
- این گزینه
برای گسترش
اسکریپت
پیونددهنده
فعلی با
نگاشت
اضافی
بخشهای
ورودی به
بخشهای
خروجی
استفاده
میشود. این
فایل باید
برای
"SECTIONS" از
همان نحو
بهکاررفته
در
اسکریپتهای
معمولی
پیونددهنده
استفاده
کند، اما
نباید کاری
به جز قرار
دادن
بخشهای
ورودی در
بخشهای
خروجی
انجام دهد.
@pxref{SECTIONS}
محدودیت دوم در مورد اسکریپت مرتبسازی بخشها این است که فقط میتواند به بخشهای خروجیای ارجاع دهد که پیش از این توسط اسکریپت پیونددهنده در حال استفاده تعریف شده باشند (یعنی اسکریپت پیشفرض پیونددهنده یا اسکریپتی که در خط فرمان مشخص شده است). با این حال، مزیت اسکریپت مرتبسازی بخشها این است که بخشهای ورودی به ابتدای بخشهای خروجی نگاشت میشوند، بنابراین میتوانند ترتیب بخشها را در بخش خروجی تضمین کنند. به عنوان مثال، فرض کنید اسکریپت پیشفرض پیونددهنده به این صورت باشد:
SECTIONS { .text : { *(.text.hot) ; *(.text .text.*) } .data : { *(.data.big) ; *(.data .data.*) } }سپس اگر یک فایل مرتبسازی بخشها به این صورت استفاده شود:
.text : { *(.text.first) ; *(.text.z*) } .data : { foo.o(.data.first) ; *(.data.small) }این معادل یک اسکریپت پیونددهنده به شکل زیر خواهد بود:
SECTIONS { .text : { *(.text.first) ; *(.text.z*) ; *(.text.hot) ; *(.text .text.*) } .data : { foo.o(.data.first) ; *(.data.small) ; *(.data.big) ; *(.data .data.*) } }مزیت فایل مرتبسازی بخشها این است که میتوان از آن برای مرتب کردن بخشهایی که برای کاربر اهمیت دارند استفاده کرد، بدون اینکه نیازی به نگرانی درباره سایر بخشها، نواحی حافظه یا موارد دیگر باشد.
- یک کتابخانه اشتراکی ایجاد میکند. این مورد در حال حاضر فقط در پلتفرمهای ELF، XCOFF و SunOS پشتیبانی میشود. در SunOS، اگر از گزینه -e استفاده نشود و نمادهای تعریفنشده در پیوند وجود داشته باشند، پیونددهنده بهطور خودکار یک کتابخانه اشتراکی ایجاد خواهد کرد.
- --sort-common
- --sort-common=ascending
- --sort-common=descending
- این گزینه به ld میگوید که هنگام قرار دادن نمادهای عمومی (common symbols) در بخشهای خروجی مناسب، آنها را بر اساس تراز (alignment) به ترتیب صعودی یا نزولی مرتب کند. ترازهای نماد مورد بررسی شامل شانزده بایتی یا بزرگتر، هشت بایتی، چهار بایتی، دو بایتی و یک بایتی هستند. این کار برای جلوگیری از ایجاد فاصله میان نمادها به دلیل محدودیتهای تراز است. اگر ترتیبی برای مرتبسازی مشخص نشود، ترتیب نزولی فرض میشود.
- --sort-section=name
- این گزینه "SORT_BY_NAME" را روی تمام الگوهای نویسه عام (wildcard) بخشها در اسکریپت پیونددهنده اعمال میکند.
- --sort-section=alignment
- این گزینه "SORT_BY_ALIGNMENT" را روی تمام الگوهای نویسه عام (wildcard) بخشها در اسکریپت پیونددهنده اعمال میکند..IP --spare-dynamic-tags=count 4 این گزینه تعداد اسلاتهای خالی باقیمانده در بخش .dynamic از اشیاء اشتراکی ELF را مشخص میکند. ممکن است ابزارهای پسپردازش مانند prelinker به این اسلاتهای خالی نیاز داشته باشند. مقدار پیشفرض 5 است.
- --split-by-file[=size]
- مشابه --split-by-reloc است، اما هنگامی که size حاصل شود، برای هر فایل ورودی یک بخش خروجی جدید ایجاد میکند. در صورت مشخص نشدن، مقدار پیشفرض size برابر 1 است.
- --split-by-reloc[=count]
- تلاش میکند بخشهای اضافی در فایل خروجی ایجاد کند تا هیچ بخش خروجی مجزایی در فایل شامل بیش از count بازنشانی (relocation) نباشد. این گزینه هنگام تولید فایلهای بازنشانیپذیر بزرگ برای بارگذاری در برخی هستههای بیدرنگ (real time) با قالب فایل شیء COFF مفید است؛ چرا که COFF نمیتواند بیش از ۶۵۵۳۵ بازنشانی را در یک بخش نمایش دهد. توجه داشته باشید که این سازوکار با قالبهای فایل شیئی که از بخشهای دلخواه پشتیبانی نمیکنند کار نخواهد کرد. پیونددهنده بخشهای ورودی تکی را برای توزیع مجدد تفکیک نمیکند، بنابراین اگر یک بخش ورودی منفرد شامل بیش از count بازنشانی باشد، یک بخش خروجی شامل همان تعداد بازنشانی خواهد بود. مقدار پیشفرض count برابر ۳۲۷۶۸ است.
- --stats[=filename]
- محاسبه و
نمایش آمار
درباره
عملکرد
پیونددهنده،
مانند زمان
اجرا و
میزان مصرف
حافظه.
اگر آرگومان اختیاری filename ارائه نشود، تنها اطلاعات پایه گزارش شده و به جریان خروجی خطای استاندارد (standard error) ارسال میشود. اگر آرگومان filename ارائه شود، اطلاعات گسترده در فایل نامبرده نوشته میشود. اگر filename تنها برابر با نماد - تنظیم شده باشد، اطلاعات گسترده به جریان خروجی استاندارد (standard output) ارسال میگردد. اگر filename با + آغاز شود، فایل به جای حالت بازنویسی، در حالت الحاق (append) باز میشود.
اگر گزینه -Map فعال شده باشد، اطلاعات در فایل مپ (map file) نیز ثبت میشود. نکته: اگر به هر دو گزینه --stats و -Map آرگومانهای filename داده شده باشد و مطابقت داشته باشند، اطلاعات تنها یک بار نوشته خواهد شد نه دو بار.
اگر متغیر محیطی "LD_STATS" تعریف شده باشد، رفتاری مشابه گزینه --stats خواهد داشت. اگر مقدار متغیر یک رشته باشد، به عنوان نام فایلی که اطلاعات باید در آن ثبت شود استفاده خواهد شد. در غیر این صورت اطلاعات به جریان خروجی استاندارد ارسال خواهد شد. استفاده از این متغیر محیطی امکان ثبت آمار را بدون نیاز به تغییر خط فرمان پیونددهنده فراهم میکند. نکته: اگر هم متغیر محیطی و هم گزینه --stats استفاده شوند، گزینه --stats اولویت خواهد داشت.
اطلاعات گسترده گزارششده شامل زمان cpu مصرفی است و اگر فراخوانی کتابخانهای سیستمی getrusage() در دسترس باشد، مصرف حافظه نیز ثبت میشود. این اطلاعات برای بخشهای مجزای فرایند پیوند که با عنوان فازها (phases) نامیده میشوند، گزارش میشود. علاوه بر این، اطلاعات برای یک فاز ویژه به نام ALL که کل فرایند پیوند را در بر میگیرد نیز گزارش میگردد. توجه داشته باشید که فازهای مجزا میتوانند شامل یکدیگر بوده یا با هم همپوشانی داشته باشند، بنابراین نباید فرض شود که کل منابع مصرفشده توسط پیونددهنده مجموع منابع مصرفی فازهای مجزا است.
علاوه بر این، هنگامی که اطلاعات گسترده گزارش میشود، نسخه پیونددهنده، آرگومانهای خط فرمان و زمان شروع کار پیونددهنده نیز گنجانده میشوند. این امر مدیریت شرایطی را که در آن چندین پیوند توسط یک سیستم ساخت فراخوانی میشوند آسانتر کرده و شناسایی دقیق آرگومانهایی که مسئول ایجاد آمار گزارششده بودهاند را ممکن میسازد.
خروجی گسترده ساختاری شبیه به این خواهد داشت:
Stats: linker version: (GNU Binutils) 2.44.50.20250401 Stats: linker started: Wed Apr 2 09:36:41 2025 Stats: args: ld -z norelro -z nomemory-seal -z no-separate-code -o a.out [...] Stats: phase cpu time memory user time system time Stats: name (microsec) (KiB) (seconds) (seconds) Stats: ALL 390082 217740 0 0 Stats: ctf processing 12 0 0 0 Stats: string merge 1324 0 0 0 Stats: parsing 349 288 0 0 Stats: plugins 1 0 0 0 Stats: processing files 259616 214524 0 0 Stats: write 116493 0 0 0
- --no-stats
- گزارش آمار مصرف را، در صورتی که از طریق گزینه خط فرمان --stats یا متغیر محیطی LD_STATS فعال شده باشد، غیرفعال میکند.
- --sysroot=directory
- از directory به عنوان مکان sysroot استفاده میکند و مقدار پیشفرض زمان پیکربندی (configure-time) را لغو میکند. این گزینه تنها توسط پیونددهندههایی پشتیبانی میشود که با استفاده از --with-sysroot پیکربندی شدهاند.
- --task-link
- این گزینه توسط مقصدهای مبتنی بر COFF/PE برای ایجاد یک فایل شیء پیوندِ وظیفه (task-linked) استفاده میشود که در آن همه نمادهای سراسری (global) به ایستا (static) تبدیل شدهاند.
- --traditional-format
- برای برخی
مقصدها،
خروجی ld از
جهاتی با
خروجی برخی
پیونددهندههای
موجود
متفاوت است.
این سوییچ
از ld
میخواهد
که به جای
آن از قالب
سنتی (traditional format)
استفاده
کند.
برای نمونه در 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 برای فایلهای اجرایی و 0x10000000 برای dllها است.
- -Tbss=org
- -Tdata=org
- -Ttext=org
- مشابه --section-start است، با این تفاوت که ".bss"، ".data" یا ".text" به عنوان sectionname قرار میگیرند.
- -Ttext-segment=org
- هنگام ایجاد یک فایل اجرایی ELF، آدرس نخستین بایت از اولین قطعه (segment) را تنظیم میکند. توجه داشته باشید زمانی که -pie به همراه -Ttext-segment=org استفاده میشود، فایل اجرایی خروجی با عنوان ET_EXEC علامتگذاری میشود تا تضمین شود آدرس نخستین بایت قطعه text در زمان اجرا برابر با org خواهد بود.
- -Trodata-segment=org
- هنگام ایجاد یک فایل اجرایی ELF یا شیء اشتراکی برای مقصدی که در آن دادههای فقطخواندنی (read-only data) در قطعهای مجزا از کد اجرایی (executable text) قرار دارند، آدرس نخستین بایت قطعه دادههای فقطخواندنی را تنظیم میکند.
- -Tldata-segment=org
- هنگام ایجاد یک فایل اجرایی ELF یا شیء اشتراکی برای مدل حافظه متوسط x86-64، آدرس نخستین بایت از قطعه ldata را تنظیم میکند.
- --unresolved-symbols=method
- نحوه مدیریت نمادهای حلنشده (unresolved symbols) را تعیین میکند. چهار مقدار ممکن برای method وجود دارد:
- ignore-all
- هیچ نماد حلنشدهای را گزارش نمیکند.
- report-all
- تمام نمادهای حلنشده را گزارش میکند. این حالت پیشفرض است.
- ignore-in-object-files
- نمادهای حلنشده موجود در کتابخانههای اشتراکی را گزارش میکند، اما اگر از فایلهای شیء معمولی باشند آنها را نادیده میگیرد.
- ignore-in-shared-libs
- نمادهای حلنشده مربوط به فایلهای شیء معمولی را گزارش میکند، اما اگر از کتابخانههای اشتراکی باشند آنها را نادیده میگیرد. این گزینه زمانی که یک باینری پویا ایجاد میشود و اطمینان وجود دارد که تمام کتابخانههای اشتراکی که باید به آنها ارجاع داده شود در خط فرمان پیونددهنده گنجانده شدهاند، مفید است.
رفتار مربوط به کتابخانههای اشتراکی به تنهایی میتواند توسط گزینه --[no-]allow-shlib-undefined نیز کنترل شود.
به طور معمول پیونددهنده برای هر نماد حلنشده گزارششده یک پیام خطا تولید میکند، اما گزینه --warn-unresolved-symbols میتواند این خطا را به یک هشدار تغییر دهد.
- --dll-verbose
- --verbose[=NUMBER]
- شماره نسخه ld را نمایش داده و شبیهسازیهای پشتیبانیشده پیونددهنده (linker emulations) را فهرست میکند. همچنین نشان میدهد که کدام فایلهای ورودی امکان باز شدن دارند و کدامها باز نمیشوند. اسکریپت پیونددهنده (linker script) مورد استفاده را نمایش میدهد. اگر مقدار اختیاری آرگومان NUMBER بزرگتر از ۱ باشد، وضعیت نمادهای افزونه (plugin) نیز نمایش داده خواهد شد..IP --version-script=version-scriptfile 4 نام یک اسکریپت نسخه را برای پیونددهنده مشخص میکند. این گزینه معمولاً هنگام ایجاد کتابخانههای اشتراکی برای مشخص کردن اطلاعات تکمیلی درباره سلسلهمراتب نسخه برای کتابخانهٔ در حال ایجاد استفاده میشود. این گزینه تنها در پلتفرمهای 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
- برای هر نماد تعریفنشده تنها یکبار هشدار میدهد، به جای اینکه به ازای هر پودمان که به آن ارجاع دارد هشدار دهد.
- --warn-rwx-segments
- --no-warn-rwx-segments
- اگر
پیونددهنده
قطعهای
قابلبارگذاری
با اندازهٔ
غیرصفر
ایجاد کند
که هر سه
پرچم
دسترسی
خواندن،
نوشتن و
اجرا را
داشته
باشد،
هشدار
میدهد.
چنین
قطعهای
نشاندهنده
یک
آسیبپذیری
امنیتی
بالقوه است.
علاوه بر
این،
چنانچه یک
قطعهٔ
حافظه محلی
رشته با
تنظیم پرچم
دسترسی
اجرا ایجاد
شود،
صرفنظر از
اینکه
پرچمهای
خواندن و/یا
نوشتن در آن
تنظیم شده
باشند یا
خیر،
هشدارهایی
ایجاد
خواهد شد.
این هشدارها بهطور پیشفرض فعال هستند. آنها را میتوان از طریق گزینهٔ --no-warn-rwx-segments غیرفعال و با گزینهٔ --warn-rwx-segments مجدداً فعال کرد.
- --error-rwx-segments
- --no-error-rwx-segments
- اگر
پیونددهنده
قصد تولید
پیام
هشداری در
مورد یک
قطعهٔ
قابلاجرا
و
قابلنوشتن،
یا یک قطعهٔ
TLS
قابلاجرا
را داشته
باشد،
گزینهٔ
--error-rwx-segments در عوض
این هشدار
را به یک
خطا تبدیل
میکند.
گزینهٔ
--no-error-rwx-segments رفتار
پیشفرضِ
صرفاً
تولید پیام
هشدار را
بازیابی
خواهد کرد.
نکته - گزینهٔ --error-rwx-segments بهخودیخود هشدارهای مربوط به این قطعهها را فعال نمیکند. این هشدارها یا بهطور پیشفرض فعال هستند (چنانچه پیونددهنده بدین صورت پیکربندی شده باشد)، یا از طریق گزینهٔ خط فرمان --warn-rwx-segments فعال میشوند..IP --warn-section-align 4 هشدار میدهد اگر نشانی یک بخش خروجی به دلیل ترازسازی (alignment) تغییر کند. معمولاً ترازسازی توسط یک بخش ورودی تعیین میشود. نشانی تنها در صورتی تغییر خواهد کرد که بهطور صریح مشخص نشده باشد؛ یعنی اگر دستور "SECTIONS" نشانی آغازی برای آن بخش تعیین نکرده باشد.
- --warn-textrel
- هشدار میدهد اگر پیونددهنده DT_TEXTREL را به یک فایل اجرایی مستقل از موقعیت (position-independent executable) یا شیء مشترک (shared object) اضافه کند.
- --warn-alternate-em
- هشدار میدهد اگر یک شیء دارای کد ماشین جایگزین ELF باشد.
- --warn-unresolved-symbols
- اگر پیونددهنده بخواهد نماد حلنشدهای را گزارش کند (گزینهٔ --unresolved-symbols را ببینید)، معمولاً یک خطا تولید میکند. این گزینه باعث میشود به جای خطا، یک هشدار تولید کند.
- --error-unresolved-symbols
- رفتار پیشفرض پیونددهنده مبنی بر تولید خطا هنگام گزارش نمادهای حلنشده را بازیابی میکند.
- --whole-archive
- برای هر
آرشیوی که
پس از
گزینهٔ --whole-archive
در خط فرمان
ذکر شده
است، تمام
فایلهای
شیء درون
آرشیو را در
پیونددهی
بگنجاند،
به جای
اینکه
آرشیو را
برای یافتن
فایلهای
شیءِ مورد
نیاز جستجو
کند. این
معمولاً
برای تبدیل
یک فایل
آرشیو به یک
کتابخانهٔ
مشترک
استفاده
میشود و
اجبار
میکند که
هر شیء در
کتابخانهٔ
مشترکِ
حاصل
گنجانده
شود. این
گزینه ممکن
است بیش از
یک بار
استفاده
شود.
دو نکته هنگام استفاده از این گزینه از طریق gcc: نخست، gcc این گزینه را نمیشناسد، بنابراین باید از -Wl,-whole-archive استفاده کنید. دوم، فراموش نکنید که پس از فهرست آرشیوهای خود از -Wl,-no-whole-archive استفاده نمایید، چرا که gcc فهرست آرشیوهای خودش را به پیوند شما اضافه میکند و ممکن است نخواهید این پرچم روی آنها نیز اثر بگذارد.
- --wrap=symbol
- یک تابع
دربرگیرنده
(wrapper) برای symbol
استفاده
میکند. هر
ارجاع
تعریفنشده
به symbol به
"__wrap_symbol"
حل خواهد
شد. هر
ارجاع
تعریفنشده
به
"__real_symbol"
نیز به symbol حل
میشود.
این قابلیت میتواند برای فراهم کردن یک پوشش (wrapper) برای توابع سیستمی استفاده شود. تابع دربرگیرنده باید "__wrap_symbol" نامیده شود. اگر بخواهد تابع سیستمی را فراخوانی کند، باید "__real_symbol" را صدا بزند.
در اینجا یک مثال ساده آورده شده است:
void * __wrap_malloc (size_t c) { printf ("malloc called with %zu\n", c); return __real_malloc (c); }اگر کدهای دیگر را با استفاده از --wrap malloc به این فایل پیوند دهید، تمام فراخوانیهای "malloc" در عوض تابع "__wrap_malloc" را فراخوانی خواهند کرد. فراخوانی "__real_malloc" درون "__wrap_malloc" نیز تابع واقعی "malloc" را فراخوانی میکند.
همچنین ممکن است بخواهید یک تابع "__real_malloc" نیز تعریف کنید تا پیوندهای بدون گزینهٔ --wrap نیز با موفقیت انجام شوند. اگر چنین کنید، نباید تعریف "__real_malloc" را در همان فایلی قرار دهید که "__wrap_malloc" در آن است؛ زیرا اگر چنین کنید، ممکن است اسمبلر پیش از آنکه پیونددهنده فرصت پوششدادن (wrap) آن به "malloc" را داشته باشد، فراخوانی را حل کند.
تنها ارجاعات تعریفنشده توسط پیونددهنده جایگزین میشوند. بنابراین، ارجاعات درونی واحد ترجمه (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" و سرایند قطعهٔ ELF با نام "PT_GNU_EH_FRAME" را درخواست (--eh-frame-hdr) یا متوقف (--no-eh-frame-hdr) میکند.
- --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" برای بخش کلاسیک ELF یعنی ".hash"، یا "gnu" برای بخش سبک جدید گنو یعنی ".gnu.hash"، و یا "both" برای هر دو جدول درهمسازی کلاسیک ELF یعنی ".hash" و سبک جدید گنو یعنی ".gnu.hash" باشد. مقدار پیشفرض به نحوهٔ پیکربندی پیونددهنده بستگی دارد، اما برای اکثر سامانههای مبتنی بر لینوکس "both" خواهد بود.
- --compress-debug-sections=none
- --compress-debug-sections=zlib
- --compress-debug-sections=zlib-gnu
- --compress-debug-sections=zlib-gabi
- --compress-debug-sections=zstd
- در
پلتفرمهای
ELF، این
گزینهها
چگونگی
فشردهسازی
بخشهای
اشکالزدایی
DWARF را با
استفاده از
zlib کنترل
میکنند.
گزینهٔ --compress-debug-sections=none بخشهای اشکالزدایی DWARF را فشرده نمیکند. گزینهٔ --compress-debug-sections=zlib-gnu بخشهای اشکالزدایی DWARF را فشرده کرده و نام آنها را تغییر میدهد تا به جای .debug با .zdebug آغاز شوند. گزینهٔ --compress-debug-sections=zlib-gabi نیز بخشهای اشکالزدایی DWARF را فشرده میکند، اما به جای تغییر نام، پرچم SHF_COMPRESSED را در سرایند بخشها تنظیم میکند.
گزینهٔ --compress-debug-sections=zlib نام مستعاری برای --compress-debug-sections=zlib-gabi است.
گزینهٔ --compress-debug-sections=zstd بخشهای اشکالزدایی DWARF را با استفاده از zstd فشرده میکند.
توجه داشته باشید که این گزینه بر هرگونه فشردهسازی در بخشهای اشکالزدایی ورودی اولویت دارد؛ بنابراین برای مثال اگر یک باینری با --compress-debug-sections=none پیوند داده شود، هر بخش اشکالزدایی فشرده در فایلهای ورودی، پیش از کپی شدن در باینری خروجی از حالت فشرده خارج خواهد شد.
رفتار پیشفرض فشردهسازی بسته به معماری مقصد و گزینههای پیکربندیِ مورد استفاده برای ساخت زنجیره ابزار (toolchain) متفاوت است. رفتار پیشفرض را میتوان با بررسی خروجی گزینهٔ --help پیونددهنده تعیین کرد.
- --reduce-memory-overheads
- این گزینه
میزان
حافظهٔ
مورد نیاز
در زمان
اجرای ld را
به بهای
کاهش سرعت
پیونددهی،
کاهش
میدهد. این
گزینه به
منظور
انتخاب
الگوریتم
قدیمی O(n^2)
برای تولید
فایل نگاشت
پیوند (link map file) به
جای
الگوریتم
جدید O(n) که
حدود ۴۰٪
حافظهٔ
بیشتری
برای
ذخیرهسازی
نمادها
مصرف
میکند،
معرفی شد.
اثر دیگر این سوئیچ، تنظیم اندازهٔ پیشفرض جدول درهمسازی روی 1021 است که مجدداً با افزایش زمان اجرای پیونددهنده، در مصرف حافظه صرفهجویی میکند. با این حال، اگر از سوئیچ --hash-size استفاده شده باشد، این کار انجام نخواهد شد.
سوئیچ --reduce-memory-overheads همچنین ممکن است برای فعال کردن سازشهای دیگر (tradeoffs) در نسخههای آیندهٔ پیونددهنده به کار رود.
- --max-cache-size=size
- ld به طور معمول اطلاعات بازنشانی (relocation) و جدول نمادهای فایلهای ورودی را در حافظه با اندازهٔ نامحدود کش میکند. این گزینه حداکثر اندازهٔ حافظهٔ نهان (cache) را روی size تنظیم میکند.
- --build-id
- --build-id=style
- ایجاد یک
بخش
یادداشت ELF
با نام
".note.gnu.build-id" یا
یک بخش COFF با
نام ".buildid"
را درخواست
میکند.
محتویات
یادداشت،
بیتهای
یکتایی
هستند که
این فایلِ
پیوند
دادهشده
را مشخص
میکنند. style
میتواند
"uuid" برای
استفاده از
۱۲۸ بیت
تصادفی؛
"sha1" برای
استفاده از
درهمسازی
۱۶۰ بیتی SHA1،
"md5" برای
استفاده از
درهمسازی
۱۲۸ بیتی MD5،
یا "xx"
برای
استفاده از
درهمسازی
۱۲۸ بیتی XXHASH
روی
بخشهای
هنجاری (normative)
محتوای
خروجی؛ یا
"0xhexstring"
برای
استفاده از
یک
رشتهبیت
انتخابی که
به صورت
تعداد زوجی
از ارقام
شانزدهشانزدهی
(هگزادسیمال)
مشخص
میشود
(نویسههای
"-" و
":" بین
جفتارقام
نادیده
گرفته
میشوند)
باشد. اگر style
حذف شود، از
"sha1"
استفاده
میشود.
سبکهای "md5"، "sha1" و "xx" شناسهای تولید میکنند که در یک فایل خروجی همسان همواره یکسان است، اما تقریباً بهطور قطع در میان تمام فایلهای خروجی ناهمسان یکتا است. این شناسه قرار نیست به عنوان یک چکسام (checksum) برای محتویات فایل مقایسه شود. یک فایل پیوند دادهشده ممکن است بعداً توسط ابزارهای دیگر تغییر کند، اما رشتهبیت شناسهٔ ساخت (build ID) که فایل پیوندی اصلی را مشخص میکند تغییر نمیکند.
ارسال "none" برای style، تنظیمات ناشی از هر گزینهٔ "--build-id" پیشین در خط فرمان را غیرفعال میکند..IP --package-metadata=JSON 4 درخواست ایجاد یک بخش یادداشت (note section) در قالب ELF با نام ".note.package". محتویات این یادداشت طبق مشخصات فراداده بسته، در قالب JSON است. برای اطلاعات بیشتر ببینید: https://systemd.io/ELF_PACKAGE_METADATA آرگومان JSON از کدگذاری درصدی (percent-encoding) و کدگذاریهای %[string] زیر (که در آن string به نام موجود در مراجع نویسههای نامگذاریشده در HTML اشاره دارد) پشتیبانی میکند: %[comma] برای ,، %[lbrace] برای {، %[quot] برای "، %[rbrace] برای } و %[space] برای نویسه فاصله. اگر آرگومان JSON داده نشود یا خالی باشد، در صورتی که با استفاده قبلی از گزینه --package-metadata فعال شده باشد، ایجاد یادداشت فراداده غیرفعال خواهد شد. اگر پیونددهنده همراه با libjansson ساخته شده باشد، رشته JSON اعتبارسنجی میشود.
پیونددهنده i386 PE از گزینه -shared پشتیبانی میکند که باعث میشود خروجی بهجای یک فایل اجرایی معمولی، یک کتابخانه پیوندیافته پویا (DLL) باشد. هنگام استفاده از این گزینه، باید نام خروجی را "*.dll" بگذارید. علاوه بر این، پیونددهنده بهطور کامل از فایلهای استاندارد "*.def" پشتیبانی میکند که میتوانند مانند یک فایل شیء در خط فرمان پیونددهنده مشخص شوند (در واقع، باید پیش از آرشیوهایی که نمادها را از آنها صادر میکند قرار گیرد تا اطمینان حاصل شود که درست مانند یک فایل شیء معمولی پیوند داده میشوند).
علاوه بر گزینههای مشترک برای تمام هدفها، پیونددهنده i386 PE از گزینههای خط فرمان دیگری نیز پشتیبانی میکند که مختص هدف i386 PE هستند. گزینههایی که مقدار میگیرند میتوانند با یک فاصله یا یک علامت مساوی از مقدار خود جدا شوند.
- --add-stdcall-alias
- در صورت مشخص شدن، نمادهای دارای پسوند stdcall (@nn) هم بههمان صورت و هم با حذف پسوند صادر خواهند شد. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --base-file file
- استفاده از file بهعنوان نام فایلی که در آن آدرسهای پایه تمام بازنشانیهای مورد نیاز برای تولید DLLها با dlltool ذخیره میشود. [این یک گزینه مختص i386 PE است]
- --dll
- ایجاد یک DLL بهجای یک فایل اجرایی معمولی. همچنین میتوانید از -shared استفاده کرده یا یک "LIBRARY" را در یک فایل ".def" مشخص کنید. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --enable-long-section-names
- --disable-long-section-names
- گونههای PE از قالب شیء COFF افزونهای اضافه میکنند که استفاده از نامهای بخش طولانیتر از هشت نویسه (محدودیت معمول در COFF) را ممکن میسازد. بهطور پیشفرض، این نامها فقط در فایلهای شیء مجاز هستند، زیرا ایمیجهای اجرایی کاملاً پیوندیافته جدول رشته COFF مورد نیاز برای پشتیبانی از نامهای طولانیتر را همراه ندارند. بهعنوان یک افزونه گنو، میتوان با استفاده از این دو گزینه، استفاده از آنها را در ایمیجهای اجرایی نیز مجاز کرد یا (احتمالاً بدون فایده!) آن را در فایلهای شیء غیرمجاز ساخت. ایمیجهای اجرایی تولید شده با این نامهای طولانی بخش تا حدی غیراستاندارد هستند، زیرا یک جدول رشته را در بر دارند و ممکن است هنگام بررسی با ابزارهای ناآشنا با گنو و آگاه از PE (مانند نمایشگرها و تخلیهکنندههای فایل) خروجی گمراهکنندهای تولید کنند. با این حال، GDB برای یافتن بخشهای اطلاعات اشکالزدایی Dwarf-2 در یک ایمیج اجرایی در زمان اجرا، به استفاده از نامهای طولانی بخش در PE وابسته است؛ بنابراین اگر هیچیک از این دو گزینه در خط فرمان مشخص نشده باشد، هنگامی که ld در زمان پیوند دادن یک ایمیج اجرایی و بدون حذف نمادها وجود اطلاعات اشکالزدایی را تشخیص دهد، با نادیده گرفتن رفتار پیشفرض و از نظر فنی درست، نامهای بخش طولانی را فعال خواهد کرد. [این گزینه برای تمام درگاههای مقصد PE در پیونددهنده معتبر است]
- --enable-stdcall-fixup
- --disable-stdcall-fixup
- اگر فرآیند پیوند نمادی بیابد که نتواند آن را حل کند، با جستجو به دنبال یک نماد تعریفشده دیگر که تفاوت آن تنها در قالب نام نماد است (cdecl در برابر stdcall)، تلاش میکند یک «پیوند فازی» (fuzzy linking) انجام دهد و آن نماد را با پیوند به مورد منطبق حل نماید. برای مثال، نماد تعریفنشده "_foo" ممکن است به تابع "_foo@12" یا نماد تعریفنشده "_bar@16" به تابع "_bar" پیوند داده شود. هنگامی که پیونددهنده چنین کاری انجام میدهد، یک هشدار چاپ میکند، زیرا در حالت عادی فرآیند پیوند باید با شکست مواجه میشد؛ اما گاهی کتابخانههای وارداتیِ تولید شده از dllهای متفرقه برای قابل استفاده بودن به این ویژگی نیاز دارند. اگر --enable-stdcall-fixup را مشخص کنید، این ویژگی بهطور کامل فعال میشود و هشداری چاپ نخواهد شد. اگر --disable-stdcall-fixup را مشخص کنید، این قابلیت غیرفعال شده و چنین عدم تطابقهایی خطا در نظر گرفته میشوند. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --leading-underscore
- --no-leading-underscore
- برای اکثر هدفها، پیشوند پیشفرض نمادها یک خط زیرین (underscore) است و در توصیف هدف تعریف شده است. با این گزینه میتوان پیشوند پیشفرض خط زیرین نمادها را فعال/غیرفعال کرد.
- --export-all-symbols
- در صورت مشخص شدن، تمام نمادهای سراسری موجود در اشیاء به کار رفته برای ساخت یک DLL، توسط DLL صادر خواهند شد. توجه داشته باشید که اگر در حالت دیگر هیچ نماد صادرشدهای وجود نداشته باشد، این رفتار پیشفرض است. هنگامی که نمادها بهطور صریح از طریق فایلهای DEF یا بهطور ضمنی از طریق ویژگیهای تابع صادر میشوند، پیشفرض این است که هیچ چیز دیگری صادر نشود، مگر اینکه این گزینه مشخص شده باشد. توجه داشته باشید که نمادهای "DllMain@12"، "DllEntryPoint@0"، "DllMainCRTStartup@12" و "impure_ptr" بهطور خودکار صادر نخواهند شد. همچنین، نمادهای وارد شده از سایر DLLها بازصادر نمیشوند و نمادهایی که چیدمان داخلی DLL را تعیین میکنند (مانند نمادهایی که با "_head_" شروع شده یا با "_iname" پایان مییابند) نیز صادر نخواهند شد. علاوه بر این، هیچ نمادی از "libgcc"، "libstd++"، "libmingw32" یا "crtX.o" صادر نمیشود. نمادهایی که نامشان با "__rtti_" یا "__builtin_" آغاز میشود، جهت سهولت در DLLهای ++C صادر نخواهند شد. در نهایت، فهرست گستردهای از نمادهای خصوصی cygwin وجود دارد که صادر نمیشوند (بدیهی است که این مورد تنها هنگام ساخت DLL برای مقصدهای cygwin اعمال میشود). این نمادهای مستثنیشده در cygwin عبارتند از: "_cygwin_dll_entry@12"، "_cygwin_crt0_common@8"، "_cygwin_noncygwin_dll_entry@12"، "_fmode"، "_impure_ptr"، "cygwin_attach_dll"، "cygwin_premain0"، "cygwin_premain1"، "cygwin_premain2"، "cygwin_premain3" و "environ". [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --exclude-symbols symbol,symbol,...
- فهرستی از نمادها را مشخص میکند که نباید بهطور خودکار صادر شوند. نامهای نمادها میتوانند با کاما یا دونقطه از هم جدا شوند. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --exclude-all-symbols
- مشخص میکند که هیچ نمادی نباید بهطور خودکار صادر شود. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --file-alignment
- مشخص کردن تراز فایل (file alignment). بخشها در فایل همیشه از آفستهایی آغاز میشوند که مضربی از این عدد باشند. پیشفرض این مقدار 512 است. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --heap reserve
- --heap reserve,commit
- میزان بایتهای حافظه را برای رزرو کردن (و بهطور اختیاری تخصیص دادن یا commit) جهت استفاده بهعنوان هیپ (heap) در این برنامه مشخص میکند. مقدار پیشفرض 1 مگابایت رزرو شده و 4 کیلوبایت اختصاصیافته است. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --kill-at
- در صورت مشخص شدن، پسوندهای stdcall (@nn) پیش از صدور نمادها از آنها حذف خواهند شد. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --large-address-aware
- در صورت مشخص شدن، بیت مربوطه در فیلد "Characteristics" در سرایند COFF تنظیم میشود تا نشان دهد این فایل اجرایی از آدرسهای مجازی بزرگتر از ۲ گیگابایت پشتیبانی میکند. این گزینه باید همراه با سوییچ /3GB یا /USERVA=value مگابایت در بخش "[operating systems]" فایل BOOT.INI استفاده شود. در غیر این صورت، این بیت هیچ اثری نخواهد داشت. [این گزینه مختص درگاههای مقصد PE در پیونددهنده است]
- --disable-large-address-aware
- اثر گزینه پیشین --large-address-aware را خنثی میکند. این مورد زمانی کاربرد دارد که --large-address-aware همیشه توسط درایور کامپایلر (مانند Cygwin gcc) تنظیم میشود و فایل اجرایی از آدرسهای مجازی بزرگتر از ۲ گیگابایت پشتیبانی نمیکند. [این گزینه مختص درگاههای مقصد PE در پیونددهنده است]
- --major-image-version value
- شماره اصلی «نسخه ایمیج» (image version) را تنظیم میکند. پیشفرض 1 است. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --major-os-version value
- شماره اصلی «نسخه سیستمعامل» (os version) را تنظیم میکند. پیشفرض 4 است. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --major-subsystem-version value
- شماره اصلی «نسخه زیرسیستم» (subsystem version) را تنظیم میکند. پیشفرض 4 است. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --minor-image-version value
- شماره فرعی «نسخه ایمیج» (image version) را تنظیم میکند. پیشفرض 0 است. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --minor-os-version value
- شماره فرعی «نسخه سیستمعامل» (os version) را تنظیم میکند. پیشفرض 0 است. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --minor-subsystem-version value
- شماره فرعی «نسخه زیرسیستم» (subsystem version) را تنظیم میکند. پیشفرض 0 است. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است]
- --output-def file
- پیونددهنده فایل file را ایجاد خواهد کرد که حاوی یک فایل DEF متناظر با DLL در حال تولید توسط پیونددهنده خواهد بود. این فایل DEF (که باید نام آن "*.def" باشد) میتواند جهت ساخت یک کتابخانه وارداتی با "dlltool" استفاده شود یا بهعنوان مرجعی برای نمادهای صادرشده بهصورت خودکار یا ضمنی به کار رود. [این گزینه مختص درگاه مقصد i386 PE در پیونددهنده است].IP --enable-auto-image-base 4
- --enable-auto-image-base=value
- بهطور خودکار مبنای تصویر (image base) را برای DLLها انتخاب میکند، با این امکان اختیاری که از مبنای value آغاز شود، مگر اینکه مقداری با استفاده از آرگومان "--image-base" مشخص شده باشد. با استفاده از یک درهمسازی (hash) تولیدشده از dllname برای ساخت مبناهای تصویر یکتا برای هر DLL، از تداخلها و بازنشانیهای (relocation) درون حافظه که میتوانند اجرای برنامه را به تأخیر بیندازند جلوگیری میشود. [این گزینه مختص درگاه هدف i386 PE در پیونددهنده است]
- --disable-auto-image-base
- بهطور خودکار مبنای تصویر یکتا تولید نمیکند. اگر مبنای تصویری توسط کاربر مشخص نشده باشد ("--image-base")، از پیشفرض سکو استفاده میشود. [این گزینه مختص درگاه هدف i386 PE در پیونددهنده است]
- --dll-search-prefix string
- هنگام پیوند پویا به یک dll بدون کتابخانهٔ واردات (import library)، "<string><basename>.dll" را با اولویت نسبت به "lib<basename>.dll" جستجو میکند. این رفتار امکان تمایز آسان بین DLLهای ساختهشده برای «زیرسکوهای» مختلف را فراهم میآورد: native، cygwin، uwin، pw و غیره. برای نمونه، DLLهای cygwin معمولاً از "--dll-search-prefix=cyg" استفاده میکنند. [این گزینه مختص درگاه هدف i386 PE در پیونددهنده است]
- --enable-auto-import
- پیوند
پیچیدهای
میان
"_symbol" و
"__imp__symbol"
برای
واردات DATA از
DLLها برقرار
میکند، و
بدین ترتیب
دور زدن
سازوکار dllimport
را در سمت
کاربر و
ارجاع به
نامهای
نماد
تغییرنیافته
(unmangled) ممکن
میسازد.
[این گزینه
مختص درگاه
هدف i386 PE در
پیونددهنده
است]
نکات زیر مربوط به پیادهسازی اولیهٔ این ویژگی است و امروزه برای هدفهای Cygwin و MinGW منسوخ شده است.
نکته: استفاده از افزونهٔ 'auto-import' باعث میشود که بخش text از فایل تصویر قابلنوشتن شود. این با مشخصات قالب PE-COFF منتشرشده توسط 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 است. این کار وظیفهٔ تنظیم ارجاعها در کد کلاینت را به محیط زمان اجرا واگذار میکند؛ بنابراین این روش تنها زمانی کار میکند که محیط زمان اجرا از این ویژگی پشتیبانی کند.
راهکار دوم این است که یکی از «ثابتها» را مجبور به متغیر بودن کنید -- یعنی در زمان کامپایل ناشناخته و غیرقابل بهینهسازی باشد. برای آرایهها، دو احتمال وجود دارد: الف) متغیر کردن نشانی آرایه (indexee)، یا ب) متغیر کردن اندیس «ثابت». بنابراین:
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) برای این برنامه تعیین میکند. پیشفرض ۲ مگابایت رزرو و ۴ کیلوبایت commit است. [این گزینه مختص درگاه هدف i386 PE در پیونددهنده است]
- --subsystem which
- --subsystem which:major.minor
- زیرسیستمی
را مشخص
میکند که
برنامهٔ
شما تحت آن
اجرا خواهد
شد. مقادیر
مجاز برای
which عبارتند
از "native"،
"windows"،
"console"،
"posix" و
"xbox".
همچنین به
صورت
اختیاری
میتوانید
نسخهٔ
زیرسیستم
را نیز
تنظیم کنید.
مقادیر
عددی نیز
برای which
پذیرفته
میشوند.
[این گزینه
مختص پورت
هدف i386 PE در
پیونددهنده
است]
گزینههای زیر پرچمهایی را در فیلد "DllCharacteristics" در سرآیند فایل PE تنظیم میکنند: [این گزینهها مختص پورتهای هدف PE در پیونددهنده هستند]
- --high-entropy-va
- --disable-high-entropy-va
- تصویر با
تصادفیسازی
چیدمان
فضای آدرس (ASLR)
۶۴ بیتی
سازگار است.
این گزینه
بهطور
پیشفرض
برای
تصویرهای
۶۴ بیتی PE در
اهداف MinGW
فعال است.
این گزینه همچنین متضمن --dynamicbase و --enable-reloc-section است.
- --dynamicbase
- --disable-dynamicbase
- آدرس پایهٔ تصویر ممکن است با استفاده از تصادفیسازی چیدمان فضای آدرس (ASLR) بازنشانی شود. این قابلیت در MS Windows Vista برای اهداف i386 PE معرفی شد. این گزینه بهطور پیشفرض برای اهداف MinGW فعال است اما میتواند از طریق گزینهٔ --disable-dynamicbase غیرفعال شود. این گزینه همچنین متضمن --enable-reloc-section است.
- --forceinteg
- --disable-forceinteg
- بررسیهای یکپارچگی کد تحمیل میشوند. این گزینه بهطور پیشفرض غیرفعال است.
- --nxcompat
- --disable-nxcompat
- تصویر با پیشگیری از اجرای داده (DEP) سازگار است. این قابلیت در MS Windows XP SP2 برای اهداف i386 PE معرفی شد. این گزینه بهطور پیشفرض برای اهداف MinGW فعال است.
- --no-isolation
- --disable-no-isolation
- اگرچه تصویر جداسازی را درک میکند، اما تصویر را جداسازی نکن. این گزینه بهطور پیشفرض غیرفعال است.
- --no-seh
- --disable-no-seh
- تصویر از SEH استفاده نمیکند. هیچ گردانندهٔ SE نباید از این تصویر فراخوانی شود. این گزینه بهطور پیشفرض غیرفعال است.
- --no-bind
- --disable-no-bind
- این تصویر را مقید (bind) نکن. این گزینه بهطور پیشفرض غیرفعال است.
- --wdmdriver
- --disable-wdmdriver
- گرداننده از MS Windows Driver Model استفاده میکند. این گزینه بهطور پیشفرض غیرفعال است.
- --tsaware
- --disable-tsaware
- تصویر با Terminal Server سازگار و از آن آگاه است (Terminal Server aware). این گزینه بهطور پیشفرض غیرفعال است.
- --insert-timestamp
- --no-insert-timestamp
- یک برچسب
زمانی
واقعی را در
تصویر درج
میکند. این
رفتار
پیشفرض
است زیرا با
کدهای
موروثی
مطابقت
دارد و بدین
معناست که
تصویر با
سایر
ابزارهای
اختصاصی
کار خواهد
کرد. مشکل
این رفتار
پیشفرض
این است که
باعث
میشود هر
بار که همان
سورسها
پیوند داده
میشوند،
تصویرهای
کمی
متفاوتی
تولید شوند.
گزینهٔ
--no-insert-timestamp
میتواند
برای درج
مقدار صفر
در برچسب
زمانی
استفاده
شود و
اطمینان
حاصل کند که
باینریهای
تولیدشده
از
سورسهای
یکسان،
بایتبهبایت
برابر
خواهند بود.
اگر --insert-timestamp فعال باشد، زمان درجشده یا زمان انجام پیونددهی است، یا اگر متغیر محیطی "SOURCE_DATE_EPOCH" تعریف شده باشد، تعداد ثانیههای سپریشده از مبدأ زمانی یونیکس (Unix epoch) طبق آنچه توسط آن متغیر مشخص شده است خواهد بود.
- --enable-reloc-section
- --disable-reloc-section
- جدول بازنشانی پایه (base relocation table) را ایجاد میکند که در صورت بارگذاری تصویر در پایهای متفاوت از مقدار مشخصشده در سرآیند PE ضروری است. این گزینه بهطور پیشفرض فعال است.
هدف C6X uClinux از یک قالب باینری به نام DSBT برای پشتیبانی از کتابخانههای مشترک استفاده میکند. هر کتابخانهٔ مشترک در سیستم باید یک نمایهٔ یکتا داشته باشد؛ تمام فایلهای اجرایی از نمایهٔ 0 استفاده میکنند.
- --dsbt-size size
- این گزینه تعداد مدخلهای موجود در DSBT فایل اجرایی یا کتابخانهٔ مشترک جاری را روی size تنظیم میکند. پیشفرض، ساخت جدولی با 64 مدخل است.
- --dsbt-index index
- این گزینه
نمایهٔ DSBT
فایل
اجرایی یا
کتابخانهٔ
مشترک جاری
را روی index
تنظیم
میکند.
مقدار
پیشفرض 0
است که برای
تولید
فایلهای
اجرایی
مناسب است.
اگر یک
کتابخانهٔ
مشترک با
نمایهٔ DSBT
برابر 0
تولید شود،
بازنشانیهای
"R_C6000_DSBT_INDEX"
درون فایل
خروجی کپی
میشوند.
سوئیچ --no-merge-exidx-entries ادغام مدخلهای مجاور exidx را در اطلاعات بازپیچی فریم غیرفعال میکند.
- --branch-stub
- این گزینه با درج بخشهای branch stub در مواقع نیاز برای گسترش دامنهٔ انشعابها، branch relaxation را در پیونددهنده فعال میکند. این گزینه معمولاً لازم نیست زیرا C-SKY از دستورالعملهای انشعاب و فراخوانی پشتیبانی میکند که میتوانند به کل دامنهٔ حافظه دسترسی داشته باشند، و branch relaxation معمولاً توسط کامپایلر یا اسمبلر مدیریت میشود.
- --stub-group-size=N
- این گزینه امکان کنترل دقیقتر ایجاد branch stub توسط پیونددهنده را فراهم میآورد. این گزینه حداکثر اندازهٔ گروهی از بخشهای ورودی را که میتواند توسط یک بخش stub مدیریت شود تعیین میکند. مقدار منفی برای N بخشهای stub را پس از انشعابهای مربوطهشان قرار میدهد، در حالی که مقدار مثبت به بخشهای stub اجازه میدهد قبل یا بعد از انشعابها ظاهر شوند. مقادیر 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)، یا در relaxation. اگر از --insn32 استفاده شود، پیونددهنده فقط از کدگذاریهای دستورالعمل ۳۲ بیتی استفاده میکند. بهطور پیشفرض یا در صورت استفاده از --no-insn32، تمام کدگذاریهای دستورالعمل، از جمله ۱۶ بیتیها در صورت امکان، به کار گرفته میشوند.
- --ignore-branch-isa
- --no-ignore-branch-isa
- این گزینهها بررسیهای بازنشانی انشعاب را برای گذارهای نامعتبر حالت ISA کنترل میکنند. اگر --ignore-branch-isa استفاده شود، پیونددهنده هر بازنشانی انشعابی را میپذیرد و هرگونه گذار حالت ISA لازم، در محاسبات بازنشانی از دست میرود، به جز در مواردی از دستورالعملهای "BAL" که شرایط relaxation را برآورده میکنند و هنگام محاسبهٔ بازنشانی مربوطه، به معادلهای "JALX" تبدیل میشوند. بهطور پیشفرض یا در صورت استفاده از --no-ignore-branch-isa، بررسی انجام میشود که سبب میگردد از دست رفتن گذار حالت ISA منجر به تولید خطا شود..IP --compact-branches 4
- --no-compact-branches
- این گزینهها تولید دستورالعملهای فشرده (compact instructions) توسط پیونددهنده را در مدخلهای PLT برای MIPS R6 کنترل میکنند.
برای هدف pdp11-aout، سه گونه از قالب خروجی میتوانند با توجه به گزینههای زیر تولید شوند. گونهٔ پیشفرض برای pdp11-aout گزینهٔ --omagic است، در حالی که برای سایر اهداف --nmagic پیشفرض است. گزینهٔ --imagic تنها برای هدف pdp11-aout تعریف شده است، در حالی که سایر گزینهها در اینجا بر اساس کاربردشان برای هدف pdp11-aout شرح داده شدهاند.
- -N
- --omagic
- خروجی را در سرآیند a.out به عنوان "OMAGIC" (0407) علامتگذاری میکند تا نشان دهد که بخش متن (text segment) نباید حفاظتشده در برابر نوشتن و اشتراکی باشد. از آنجا که هر دو بخش متن و داده قابل خواندن و نوشتن هستند، بخش داده بلافاصله و بهصورت پیوسته پس از بخش متن تخصیص مییابد. این قدیمیترین قالب برای برنامههای اجرایی PDP11 است و از ابتدا تا 2.11BSD قالب پیشفرض برای ld در سیستمهای یونیکس PDP11 بوده است.
- -n
- --nmagic
- خروجی را در سرآیند a.out به عنوان "NMAGIC" (0410) علامتگذاری میکند تا مشخص شود زمانی که فایل خروجی اجرا میشود، بخش متن فقطخواندنی بوده و بین تمام فرایندهایی که همان فایل را اجرا میکنند قابل اشتراک باشد. این امر مستلزم انتقال نواحی داده به نخستین مرز صفحهٔ ۸ کیلوبایتی ممکن پس از پایان متن است. این گزینه یک قالب اجرایی خالص (pure executable) ایجاد میکند.
- -z
- --imagic
- خروجی را در سرآیند a.out به عنوان "IMAGIC" (0411) علامتگذاری میکند تا مشخص شود هنگامی که فایل خروجی اجرا میشود، با استفاده از قابلیت تفکیک فضای دستورالعمل و داده در واحد مدیریت حافظه (MMU) در مدلهای بزرگتر PDP11، نواحی متن و داده برنامه در فضاهای آدرس جداگانه بارگذاری خواهند شد. این کار فضای آدرس در دسترس برنامه را دو برابر میکند. بخش متن مجدداً خالص، حفاظتشده در برابر نوشتن و قابل اشتراک است. تنها تفاوت در قالب خروجی میان این گزینه و سایر گزینهها، بهجز عدد جادویی (magic number)، این است که هر دو بخش متن و داده از مکان ۰ شروع میشوند. گزینهٔ -z این قالب را در 2.11BSD انتخاب میکرد. این گزینه یک قالب اجرایی تفکیکشده (separate executable) ایجاد میکند.
- --no-omagic
- معادل --nmagic برای pdp11-aout.
محیط (ENVIRONMENT)
میتوانید رفتار ld را با متغیرهای محیطی "GNUTARGET"، "LDEMULATION" و "COLLECT_NO_DEMANGLE" تغییر دهید.
اگر از -b (یا مترادف آن --format) استفاده نکنید، "GNUTARGET" قالب شیء فایل ورودی را مشخص میکند. مقدار آن باید یکی از نامهای BFD برای یک قالب ورودی باشد. اگر "GNUTARGET" در محیط وجود نداشته باشد، ld از قالب طبیعی هدف استفاده میکند. اگر "GNUTARGET" روی "default" تنظیم شده باشد، BFD تلاش میکند با بررسی فایلهای ورودی باینری، قالب ورودی را شناسایی کند؛ این روش معمولاً موفقیتآمیز است، اما ابهامات بالقوهای وجود دارد، زیرا هیچ روشی برای اطمینان از یکتا بودن عدد جادویی استفادهشده برای تعیین قالب فایلهای شیء وجود ندارد. با این حال، روند پیکربندی BFD در هر سیستم، قالب متداول آن سیستم را در ابتدای فهرست جستوجو قرار میدهد، بنابراین ابهامات به نفع روش متداول برطرف میشوند.
اگر از گزینهٔ -m استفاده نکنید، "LDEMULATION" شبیهسازی (emulation) پیشفرض را تعیین میکند. شبیهسازی میتواند جنبههای مختلفی از رفتار پیونددهنده را تحت تأثیر قرار دهد، بهویژه اسکریپت پیونددهندهٔ پیشفرض. میتوانید شبیهسازیهای موجود را با گزینههای --verbose یا -V فهرست کنید. اگر گزینهٔ -m استفاده نشود و متغیر محیطی "LDEMULATION" نیز تعریف نشده باشد، شبیهسازی پیشفرض به نحوهٔ پیکربندی پیونددهنده بستگی خواهد داشت.
بهطور معمول، پیونددهنده بهطور پیشفرض نمادها را رمزگشایی (demangle) میکند. با این حال، اگر "COLLECT_NO_DEMANGLE" در محیط تنظیم شده باشد، پیشفرض آن عدم رمزگشایی نمادها خواهد بود. این متغیر محیطی به شیوهای مشابه توسط برنامهٔ پوششدهندهٔ پیونددهندهٔ "gcc" استفاده میشود. این پیشفرض میتواند توسط گزینههای --demangle و --no-demangle لغو شود.
اگر گزینهٔ مخصوص PE/COFF یعنی --insert-timestamp فعال باشد و متغیر محیطی SOURCE_DATE_EPOCH تعریف شده باشد، مقدار برچسب زمانی در این متغیر بهجای زمان جاری در سرآیند COFF درج خواهد شد.
اگر متغیر محیطی "LD_STATS" تعریف شده باشد، اطلاعات مربوط به مصرف منابع پیونددهنده ثبت خواهد شد، درست مانند اینکه از گزینهٔ --stats استفاده شده باشد. اگر متغیر "LD_STATS" دارای یک مقدار رشتهای باشد، از آن به عنوان نام فایلی که اطلاعات باید در آن ذخیره شوند استفاده خواهد شد. در غیر این صورت اطلاعات به جریان خروجی استاندارد ارسال میشوند.
همچنین ببینید (SEE ALSO)
ar(1)، nm(1)، objcopy(1)، objdump(1)، readelf(1) و مدخلهای Info برای binutils و ld.
کپیرایت و تکثیر (COPYRIGHT)
Copyright (c) 1991-2025 Free Software Foundation, Inc.
اجازهنامه برای رونوشتبرداری، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نسخهٔ ۱.۳ یا هر نسخهٔ متأخرتری که توسط بنیاد نرمافزارهای آزاد (Free Software Foundation) منتشر شده است، صادر میشود؛ بدون بخشهای ناوردا، بدون متون روی جلد، و بدون متون پشت جلد. یک نسخه از این مجوز در بخشی با عنوان «GNU Free Documentation License» گنجانده شده است.
| 2025-11-10 | binutils-2.45.1 |