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