ld - برنامج الربط الخاص بنظام جنو
ملخص
ld [خيارات] ملف_كائن ...
الوصف
يقوم ld بدمج عدد من ملفات الكائنات والأرشيفات، وإعادة ترتيب بياناتها، وربط مراجع الرموز. عادةً ما تكون الخطوة الأخيرة في تجميع برنامج هي تشغيل ld.
يقبل ld ملفات بلغة أوامر الربط، المكتوبة بلغة فائقة من لغة أوامر محرر الربط AT&T، لتوفير تحكم صريح وكامل في عملية الربط.
لا تصف صفحة الدليل هذه لغة الأوامر؛ انظر إدخال ld في "info" للحصول على تفاصيل كاملة حول لغة الأوامر والجوانب الأخرى لبرنامج الربط GNU.
يستخدم هذا الإصدار من ld مكتبات BFD للأغراض العامة للعمل على ملفات الكائنات. يتيح ذلك لـ ld قراءة ودمج وكتابة ملفات كائنات بتنسيقات مختلفة - على سبيل المثال، COFF أو "a.out". يمكن ربط تنسيقات مختلفة معًا لإنتاج أي نوع متاح من ملف الكائنات.
بالإضافة إلى مرونته، فإن برنامج الربط GNU أكثر فائدة من برامج الربط الأخرى في توفير معلومات تشخيصية. تتوقف العديد من برامج الربط عن التنفيذ فور مواجهة خطأ؛ كلما أمكن، يستمر ld في التنفيذ، مما يتيح لك تحديد أخطاء أخرى (أو، في بعض الحالات، الحصول على ملف إخراج على الرغم من الخطأ).
يهدف برنامج الربط GNU ld إلى تغطية مجموعة واسعة من الحالات، وأن يكون متوافقًا قدر الإمكان مع برامج الربط الأخرى. نتيجة لذلك، لديك العديد من الخيارات للتحكم في سلوكه.
الخيارات
يدعم برنامج الربط مجموعة كبيرة من خيارات سطر الأوامر، ولكن في الواقع يتم استخدام عدد قليل منها في أي سياق معين. على سبيل المثال، أحد الاستخدامات الشائعة لـ ld هو ربط ملفات كائنات Unix القياسية على نظام Unix مدعوم. في مثل هذا النظام، لربط ملف "hello.o":
ld -o <ملف_الإخراج> /lib/crt0.o hello.o -lc
يخبر هذا ld بإنتاج ملف يسمى <ملف_الإخراج> كنتيجة لربط الملف "/lib/crt0.o" مع "hello.o" والمكتبة "libc.a"، والتي ستأتي من أدلة البحث القياسية. (راجع مناقشة الخيار -l أدناه.)
يمكن تحديد بعض خيارات سطر الأوامر لـ ld في أي مكان في سطر الأوامر. ومع ذلك، فإن الخيارات التي تشير إلى ملفات، مثل -l أو -T، تجعل الملف يُقرأ في النقطة التي يظهر فيها الخيار في سطر الأوامر، بالنسبة لملفات الكائنات وخيارات الملفات الأخرى. سيؤدي تكرار الخيارات غير المتعلقة بالملفات بحجة مختلفة إما إلى عدم وجود تأثير إضافي، أو إلى تجاوز التكرارات السابقة (تلك الموجودة على يسار سطر الأوامر) لهذا الخيار. يتم تحديد الخيارات التي يمكن تحديدها بشكل ذي معنى أكثر من مرة في الأوصاف أدناه.
الحجج غير المتعلقة بالخيارات هي ملفات كائنات أو أرشيفات يجب ربطها معًا. يمكن أن تسبق أو تتبع أو تختلط بخيارات سطر الأوامر، باستثناء أنه لا يمكن وضع وسيطة ملف كائن بين خيار وحجته.
عادةً ما يتم استدعاء الرابط بملف كائن واحد على الأقل، ولكن يمكنك تحديد أشكال أخرى من
ملفات الإدخال الثنائية باستخدام -l و -R ولغة أوامر البرنامج النصي. إذا لم يتم تحديد أي ملفات إدخال ثنائية على الإطلاق، فلن يقوم الرابط بإنتاج أي مخرجات، وسيعرض الرسالة "لا توجد ملفات إدخال".
إذا لم يتمكن الرابط من التعرف على تنسيق ملف الكائن، فسيفترض أنه برنامج نصي للرابط. سيؤدي البرنامج النصي المحدد بهذه الطريقة إلى زيادة البرنامج النصي الرئيسي للرابط المستخدم للربط (إما البرنامج النصي للرابط الافتراضي أو البرنامج النصي المحدد باستخدام -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 إضافية؛ سيتم معالجة أي خيارات من هذا القبيل بشكل متكرر.
-a keyword
هذا الخيار مدعوم للتوافق مع HP/UX. يجب أن تكون وسيطة "keyword" واحدة من السلاسل "archive" أو "shared" أو "default". يكون "-aarchive" مكافئًا وظيفيًا لـ "-Bstatic"، والكلمتين الأخريين مكافئتان وظيفيًا لـ "-Bdynamic". يمكن استخدام هذا الخيار مرات عديدة.
--audit AUDITLIB
يضيف AUDITLIB إلى إدخال "DT_AUDIT" في القسم الديناميكي. لا يتم التحقق من وجود AUDITLIB، ولن يستخدم "DT_SONAME" المحدد في المكتبة. إذا تم تحديده عدة مرات، فستحتوي "DT_AUDIT" على قائمة مفصولة بنقطتين من واجهات التدقيق المراد استخدامها. إذا وجد الرابط كائنًا يحتوي على إدخال تدقيق أثناء البحث عن المكتبات المشتركة، فسيضيف إدخال "DT_DEPAUDIT" المقابل في ملف الإخراج. هذا الخيار له معنى فقط على منصات ELF التي تدعم واجهة rtld-audit.
-b input-format
--format=input-format
يمكن تكوين ld لدعم أكثر من نوع واحد من ملفات الكائنات. إذا تم تكوين ld بهذه الطريقة، فيمكنك استخدام الخيار -b لتحديد تنسيق الملف الثنائي لملفات الكائنات المدخلة التي تتبع هذا الخيار في سطر الأوامر. حتى عند تكوين ld لدعم تنسيقات كائنات بديلة، عادةً لا تحتاج إلى تحديد ذلك، حيث يجب أن يتم تكوين ld لتوقع تنسيق الإدخال الافتراضي على كل جهاز. "input-format" عبارة عن سلسلة نصية، وهي اسم تنسيق معين مدعوم بواسطة مكتبات BFD. (يمكنك سرد التنسيقات الثنائية المتاحة باستخدام objdump -i.)
قد ترغب في استخدام هذا الخيار إذا كنت تربط ملفات بتنسيق ثنائي غير عادي. يمكنك أيضًا استخدام -b للتبديل بين التنسيقات بشكل صريح (عند ربط ملفات كائنات بتنسيقات مختلفة)، عن طريق تضمين -b input-format قبل كل مجموعة من ملفات الكائنات بتنسيق معين.
يتم أخذ التنسيق الافتراضي من متغير البيئة "GNUTARGET".
يمكنك أيضًا تحديد تنسيق الإدخال من البرنامج النصي، باستخدام الأمر "TARGET".
-c MRI-commandfile
--mri-script=MRI-commandfile
للتوافق مع الرابطات التي تنتجها MRI، يقبل ld ملفات نصوص مكتوبة بلغة أوامر بديلة ومقيدة، موصوفة في قسم "ملفات نصوص متوافقة مع MRI" في وثائق 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" في أداة الربط، كما هو موضح في بيانات قسم الإخراج. إذا تم استخدام هذا التوجيه في نص أداة الربط وتم تمكين هذا الخيار، فسيتم إدراج سلسلة تحتوي على إصدار أداة الربط في النقطة الحالية.
لاحظ - موقع هذا الخيار في سطر أوامر أداة الربط له أهمية. سيؤثر فقط على نصوص أداة الربط التي تأتي بعده في سطر الأوامر، أو التي تم إنشاؤها في أداة الربط.
--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
}
مع أقسام الإدخال:
.data.1: الحجم 8
.data.2: الحجم 0x10
.data.3: الحجم 4
ينتج عن ذلك تأثير .data.1 في mem1، و .data.2 و .data.3
تم التأثير عليه في mem2، على الرغم من أن .data.3 يمكن أن يتناسب مع mem3.
هذا الخيار غير متوافق مع عبارات INSERT لأنه يغير طريقة تعيين أقسام الإدخال إلى أقسام الإخراج.
--enable-non-contiguous-regions-warnings
يمكّن هذا الخيار التحذيرات عندما يسمح "--enable-non-contiguous-regions" بمطابقات غير متوقعة محتملة في تعيين الأقسام، مما قد يؤدي إلى تجاهل قسم بصمت بدلاً من الفشل لأنه لا يتناسب مع أي منطقة إخراج.
-e entry
--entry=entry
استخدم entry كاسم رمزي محدد لبدء تنفيذ البرنامج، بدلاً من نقطة الدخول الافتراضية. إذا لم يكن هناك رمز باسم entry، فسيحاول الرابط تحليل entry كرقم واستخدامه كعنوان الدخول (سيتم تفسير الرقم في الأساس 10؛ يمكنك استخدام بادئة 0x للأساس 16، أو بادئة 0 للأساس 8). بالنسبة لـ i386 PE، يمكن أن يكون entry أيضًا اسم الدالة الأصلي (بدون الشرطة السفلية في البداية و/أو @number في النهاية عند الاقتضاء).
--exclude-libs lib,lib,...
يحدد قائمة بمكتبات الأرشيف التي لا يجب تصدير رموزها تلقائيًا. يمكن تحديد أسماء المكتبات باستخدام الفواصل أو النقطتين. تحديد --exclude-libs ALL يستبعد الرموز الموجودة في جميع مكتبات الأرشيف من التصدير التلقائي. هذا الخيار متاح فقط لمنفذ الرابط المستهدف i386 PE ولمنافذ ELF المستهدفة. بالنسبة لـ i386 PE، لا تزال الرموز المدرجة صراحةً في ملف .def يتم تصديرها، بغض النظر عن هذا الخيار. بالنسبة لمنافذ ELF المستهدفة، سيتم التعامل مع الرموز المتأثرة بهذا الخيار على أنها مخفية.
--exclude-modules-for-implib module,module,...
يحدد قائمة بملفات الكائنات أو أعضاء الأرشيف، التي لا يجب تصدير رموزها تلقائيًا، ولكن يجب نسخها بالكامل إلى مكتبة الاستيراد التي يتم إنشاؤها أثناء الربط. يمكن تحديد أسماء الوحدات باستخدام الفواصل أو النقطتين، ويجب أن تتطابق تمامًا مع أسماء الملفات المستخدمة بواسطة ld لفتح الملفات؛ بالنسبة لأعضاء الأرشيف، هذا ببساطة اسم العضو، ولكن بالنسبة لملفات الكائنات، يجب أن يتضمن الاسم المدرج ويطابق بدقة أي مسار مستخدم لتحديد ملف الإدخال في سطر أوامر الرابط. هذا الخيار متاح فقط لمنفذ الرابط المستهدف i386 PE. لا تزال الرموز المدرجة صراحةً في ملف .def يتم تصديرها، بغض النظر عن هذا الخيار.
-E
--export-dynamic
--no-export-dynamic
عند إنشاء ملف تنفيذي مرتبط ديناميكيًا، يؤدي استخدام الخيار -E أو الخيار --export-dynamic إلى قيام الرابط بإضافة جميع الرموز إلى جدول الرموز الديناميكي. جدول الرموز الديناميكي هو مجموعة الرموز المرئية من الكائنات الديناميكية في وقت التشغيل.
إذا لم تستخدم أيًا من هذين الخيارين (أو استخدمت الخيار --no-export-dynamic لاستعادة السلوك الافتراضي)، فسوف يحتوي جدول الرموز الديناميكي عادةً على الرموز التي يتم الرجوع إليها بواسطة بعض الكائنات الديناميكية المذكورة في الربط فقط.
إذا كنت تستخدم dlopen لتحميل كائن ديناميكي يحتاج إلى الرجوع إلى الرموز المعرفة بواسطة البرنامج، بدلاً من كائن ديناميكي آخر، فمن المحتمل أن تحتاج إلى استخدام هذا الخيار عند ربط البرنامج نفسه.
يمكنك أيضًا استخدام القائمة الديناميكية للتحكم في الرموز التي يجب إضافتها إلى جدول الرموز الديناميكي إذا كان تنسيق الإخراج يدعم ذلك. راجع وصف --dynamic-list.
لاحظ أن هذا الخيار خاص بمنفذ ELF المستهدف. تدعم الأهداف الخاصة بـ PE وظيفة مماثلة لتصدير جميع الرموز من DLL أو EXE؛ راجع وصف --export-all-symbols أدناه.
--export-dynamic-symbol=glob
عند إنشاء ملف تنفيذي مرتبط ديناميكيًا، سيتم إضافة الرموز التي تطابق النمط glob إلى جدول الرموز الديناميكي. عند إنشاء مكتبة مشتركة، لن يتم ربط المراجع للرموز التي تطابق النمط glob بالتعريفات الموجودة داخل المكتبة المشتركة. هذا الخيار ليس له تأثير عند إنشاء مكتبة مشتركة ولا يتم تحديد -Bsymbolic أو --dynamic-list. هذا الخيار له معنى فقط على منصات ELF التي تدعم المكتبات المشتركة.
--export-dynamic-symbol-list=file
حدد --export-dynamic-symbol لكل نمط في الملف. يكون تنسيق الملف هو نفسه تنسيق عقدة الإصدار بدون نطاق واسم العقدة. راجع قسم VERSION لمزيد من المعلومات.
-EB قم بربط الكائنات بترتيب big-endian. يؤثر هذا على تنسيق الإخراج الافتراضي.
-EL قم بربط الكائنات بترتيب little-endian. يؤثر هذا على تنسيق الإخراج الافتراضي.
-f name
--auxiliary=name
عند إنشاء كائن ELF مشترك، قم بتعيين حقل DT\_AUXILIARY الداخلي إلى الاسم المحدد. يخبر هذا الرابط الديناميكي أنه يجب استخدام جدول الرموز الخاص بالكائن المشترك كمرشح مساعد على جدول الرموز الخاص بالكائن المشترك المسمى.
إذا قمت لاحقًا بربط برنامج بهذا الكائن المرشح، فسيلاحظ الرابط الديناميكي حقل DT\_AUXILIARY عند تشغيل البرنامج. إذا قام الرابط الديناميكي بحل أي رموز من الكائن المرشح، فسيقوم أولاً بالتحقق مما إذا كان هناك تعريف في الكائن المشترك المسمى. إذا كان موجودًا، فسيتم استخدامه بدلاً من التعريف الموجود في الكائن المرشح. لا يحتاج الكائن المشترك المسمى إلى الوجود. وبالتالي، يمكن استخدام الكائن المشترك المسمى لتوفير تنفيذ بديل لوظائف معينة، ربما للتصحيح أو لأداء خاص بالجهاز.
يمكن تحديد هذا الخيار أكثر من مرة. سيتم إنشاء إدخالات DT\_AUXILIARY بالترتيب الذي تظهر به في سطر الأوامر.
-F name
--filter=name
عند إنشاء كائن ELF مشترك، قم بتعيين حقل DT\_FILTER الداخلي إلى الاسم المحدد. يخبر هذا الرابط الديناميكي أنه يجب استخدام جدول الرموز الخاص بالكائن المشترك الذي يتم إنشاؤه كمرشح على جدول الرموز الخاص بالكائن المشترك المسمى.
إذا قمت لاحقًا بربط برنامج بهذا الكائن المرشح، فسيلاحظ الرابط الديناميكي حقل DT\_FILTER عند تشغيل البرنامج. سيقوم الرابط الديناميكي بحل الرموز وفقًا لجدول الرموز الخاص بالكائن المرشح كالمعتاد، ولكنه سيرتبط فعليًا بالتعريفات الموجودة في الكائن المشترك المسمى. وبالتالي، يمكن استخدام الكائن المرشح لتحديد مجموعة فرعية من الرموز التي يوفرها الكائن المسمى.
استخدمت بعض الروابط القديمة الخيار -F طوال سلسلة أدوات الترجمة لتحديد تنسيق ملف الكائن لكل من ملفات الكائن المدخلة وملفات الكائن الناتجة. يستخدم الرابط GNU آليات أخرى لهذا الغرض: الخيارات -b و --format و --oformat، والأمر "TARGET" في نصوص الرابط، ومتغير البيئة "GNUTARGET". سيتجاهل الرابط GNU الخيار -F عند عدم إنشاء كائن ELF مشترك.
-fini=name
عند إنشاء ملف تنفيذي أو مكتبة مشتركة بتنسيق ELF، قم باستدعاء NAME عندما يتم إلغاء تحميل الملف التنفيذي أو المكتبة المشتركة، عن طريق تعيين DT_FINI إلى عنوان الوظيفة. بشكل افتراضي، يستخدم الرابط "_fini" كالوظيفة التي سيتم استدعاؤها.
-g يتم تجاهله. يتم توفيره من أجل التوافق مع الأدوات الأخرى.
-G قيمة
--gpsize=قيمة
قم بتعيين الحد الأقصى لحجم الكائنات التي سيتم تحسينها باستخدام مسجل GP إلى الحجم المحدد. هذا له معنى فقط لتنسيقات ملفات الكائنات مثل MIPS ELF التي تدعم وضع الكائنات الكبيرة والصغيرة في أقسام مختلفة. يتم تجاهل هذا بالنسبة لتنسيقات ملفات الكائنات الأخرى.
-h اسم
-soname=اسم
عند إنشاء مكتبة مشتركة بتنسيق ELF، قم بتعيين حقل DT_SONAME الداخلي إلى الاسم المحدد. عندما يتم ربط ملف تنفيذي بمكتبة مشتركة تحتوي على حقل DT_SONAME، فسيحاول الرابط الديناميكي تحميل المكتبة المشتركة المحددة بواسطة حقل DT_SONAME بدلاً من استخدام اسم الملف المقدم للرابط.
-i قم بإجراء ربط تزايدي (نفس خيار -r).
-init=اسم
عند إنشاء ملف تنفيذي أو مكتبة مشتركة بتنسيق ELF، قم باستدعاء NAME عندما يتم تحميل الملف التنفيذي أو المكتبة المشتركة، عن طريق تعيين DT_INIT إلى عنوان الوظيفة. بشكل افتراضي، يستخدم الرابط "_init" كالوظيفة التي سيتم استدعاؤها.
-l namespec
--library=namespec
أضف الأرشيف أو ملف الكائن المحدد بواسطة namespec إلى قائمة الملفات المراد ربطها. يمكن استخدام هذا الخيار عدة مرات. إذا كان namespec على شكل :filename، فسيقوم ld بالبحث في مسار المكتبة عن ملف يسمى filename، وإلا فسيقوم بالبحث في مسار المكتبة عن ملف يسمى libnamespec.a.
في الأنظمة التي تدعم المكتبات المشتركة، قد يقوم ld أيضًا بالبحث عن ملفات أخرى غير libnamespec.a. على وجه التحديد، على أنظمة ELF و SunOS، سيبحث ld في دليل عن مكتبة تسمى libnamespec.so قبل البحث عن مكتبة تسمى libnamespec.a. (بشكل تقليدي، يشير الامتداد ".so" إلى مكتبة مشتركة). لاحظ أن هذا السلوك لا ينطبق على :filename، والذي يحدد دائمًا ملفًا يسمى filename.
سيبحث الرابط في الأرشيف مرة واحدة فقط، في الموقع الذي تم تحديده في سطر الأوامر. إذا كان الأرشيف يحدد رمزًا لم يتم تعريفه في بعض الكائنات التي ظهرت قبل الأرشيف في سطر الأوامر، فسيقوم الرابط بتضمين الملفات المناسبة من الأرشيف. ومع ذلك، فإن الرمز غير المعرّف في كائن يظهر لاحقًا في سطر الأوامر لن يؤدي إلى قيام الرابط بالبحث في الأرشيف مرة أخرى.
راجع الخيار -( للحصول على طريقة لإجبار الرابط على البحث في الأرشيفات عدة مرات.
يمكنك سرد نفس الأرشيف عدة مرات في سطر الأوامر.
هذا النوع من البحث في الأرشيفات هو المعيار لبرامج الربط الخاصة بـ Unix. ومع ذلك، إذا كنت تستخدم ld على نظام AIX، فلاحظ أنه يختلف عن سلوك برنامج الربط الخاص بـ AIX.
-L searchdir
--library-path=searchdir
أضف المسار searchdir إلى قائمة المسارات التي سيبحث فيها ld عن مكتبات الأرشيف وبرامج التحكم الخاصة به. يمكنك استخدام هذا الخيار عدة مرات. يتم البحث في الدلائل بالترتيب الذي يتم تحديده به في سطر الأوامر. يتم البحث في الدلائل المحددة في سطر الأوامر قبل الدلائل الافتراضية. تنطبق خيارات -L على جميع خيارات -l، بغض النظر عن الترتيب الذي تظهر به الخيارات. لا تؤثر خيارات -L على كيفية بحث ld عن برنامج ربط ما، إلا إذا تم تحديد خيار -T.
إذا بدأ `searchdir` بـ "=" أو `$SYSROOT`، فسيتم استبدال هذه البادئة ببادئة `sysroot`، والتي يتم التحكم فيها بواسطة الخيار `--sysroot`، أو التي يتم تحديدها عند تكوين الرابط.
مجموعة المسارات الافتراضية التي يتم البحث فيها (بدون تحديدها باستخدام `-L`) تعتمد على وضع المحاكاة الذي يستخدمه `ld`، وفي بعض الحالات أيضًا على كيفية تكوينه.
يمكن أيضًا تحديد المسارات في برنامج الربط باستخدام الأمر `SEARCH_DIR`. يتم البحث في الدلائل بهذه الطريقة في النقطة التي يظهر فيها برنامج الربط في سطر الأوامر.
-m emulation
قم بمحاكاة برنامج الربط الخاص بالوضع المحدد. يمكنك سرد أوضاع المحاكاة المتاحة باستخدام الخيارات `--verbose` أو `-V`.
إذا لم يتم استخدام الخيار `-m`، فيتم أخذ الوضع من متغير البيئة `LDEMULATION`، إذا تم تعريفه.
بخلاف ذلك، يعتمد الوضع الافتراضي على كيفية تكوين الرابط.
--remap-inputs=pattern=filename
--remap-inputs-file=file
تتيح هذه الخيارات تغيير أسماء ملفات الإدخال قبل أن يحاول الرابط فتحها. سيؤدي الخيار `--remap-inputs=foo.o=bar.o` إلى أنه عند محاولة تحميل ملف يسمى `foo.o`، سيحاول بدلاً من ذلك تحميل ملف يسمى `bar.o`. يُسمح باستخدام أحرف البدل في اسم الملف الأول، لذلك سيؤدي الخيار `--remap-inputs=foo*.o=bar.o` إلى تغيير اسم أي ملف إدخال يطابق `foo*.o` إلى `bar.o`.
شكل بديل للخيار هو `--remap-inputs-file=filename`، والذي يسمح بقراءة عمليات إعادة التعيين من ملف. يمكن أن يحتوي كل سطر في الملف على عملية إعادة تعيين واحدة. يتم تجاهل الأسطر الفارغة. أي شيء من حرف هاش (#) إلى نهاية السطر يعتبر تعليقًا ويتم تجاهله أيضًا. يمكن فصل نمط المطابقة عن اسم الملف باستخدام مسافة بيضاء أو علامة يساوي (=).
يمكن تحديد الخيارات عدة مرات. يتم تجميع محتوياتها. تتم معالجة عمليات إعادة التعيين بالترتيب الذي تظهر به في سطر الأوامر، وعندما تكون من ملف، بالترتيب الذي تظهر به في الملف. إذا تم العثور على تطابق، فلن يتم إجراء المزيد من الفحوصات لهذا الاسم.
إذا كان اسم الملف البديل هو `/dev/null` أو ببساطة `NUL`، فإن إعادة التعيين ستؤدي في الواقع إلى تجاهل ملف الإدخال. يمكن أن تكون هذه طريقة مريحة لتجربة إزالة ملفات الإدخال من بيئة بناء معقدة.
لاحظ أن هذا الخيار يعتمد على الموضع ويؤثر فقط على أسماء الملفات التي تأتي بعده في سطر الأوامر. وبالتالي:
ld foo.o --remap-inputs=foo.o=bar.o
لن يكون له أي تأثير، في حين أن:
ld --remap-inputs=foo.o=bar.o foo.o
سيقوم بإعادة تسمية ملف الإدخال foo.o إلى bar.o.
لاحظ - تؤثر هذه الخيارات أيضًا على الملفات المشار إليها بواسطة عبارات INPUT في نصوص الارتباط. ولكن نظرًا لأنه تتم معالجة نصوص الارتباط بعد قراءة سطر الأوامر بأكمله، فإن موضع خيارات إعادة التعيين في سطر الأوامر ليس مهمًا.
إذا تم تمكين خيار verbose، فسيتم الإبلاغ عن أي تعيينات تطابق، على الرغم من أنه يجب تمكين خيار verbose في سطر الأوامر قبل ظهور أسماء الملفات التي تمت إعادة تعيينها.
إذا تم تمكين خيارات -Map أو --print-map، فسيتم تضمين قائمة إعادة التعيين في إخراج الخريطة.
-M
--print-map
اطبع خريطة ارتباط إلى الإخراج القياسي. توفر خريطة الارتباط معلومات حول الارتباط، بما في ذلك ما يلي:
أين يتم تعيين ملفات الكائنات في الذاكرة.
كيف يتم تخصيص الرموز الشائعة.
جميع أعضاء الأرشيف المضمنة في الارتباط، مع ذكر الرمز الذي تسبب في إدراج عضو الأرشيف.
القيم المعينة للرموز.
لاحظ - قد لا يتم عرض النتيجة الصحيحة للرموز التي يتم حساب قيمها بواسطة تعبير يتضمن مرجعًا لقيمة سابقة للرمز نفسه في خريطة الارتباط. وذلك لأن الارتباط يتجاهل النتائج الوسيطة ويحتفظ فقط بالقيمة النهائية للتعبير. في ظل هذه الظروف، سيعرض الارتباط القيمة النهائية محاطة بأقواس مربعة. على سبيل المثال، سيؤدي نص الارتباط الذي يحتوي على:
foo = 1
foo = foo * 4
foo = foo + 8
إلى إنتاج الإخراج التالي في خريطة الارتباط إذا تم استخدام خيار -M:
000000001 foo = 0x1
[0x0000000c] foo = (foo * 0x4)
[0x0000000c] foo = (foo + 0x8)
راجع قسم "التعبيرات" للحصول على مزيد من المعلومات حول التعبيرات في نصوص الارتباط.
كيف يتم دمج خصائص GNU.
عندما يقوم الارتباط بدمج مقاطع .note.gnu.property المدخلة في مقطع .note.gnu.property واحد في الإخراج، تتم إزالة بعض الخصائص أو تحديثها. يتم الإبلاغ عن هذه الإجراءات في خريطة الارتباط. على سبيل المثال:
إزالة الخاصية 0xc0000002 لدمج foo.o (0x1) و bar.o (غير موجود)
يشير هذا إلى أنه تتم إزالة الخاصية 0xc0000002 من الإخراج عند دمج الخصائص في foo.o، والتي تكون قيمة خاصيتها 0xc0000002 هي 0x1، و bar.o، التي لا تحتوي على خاصية 0xc0000002.
تحديث الخاصية 0xc0010001 (0x1) لدمج foo.o (0x1) و bar.o (0x1)
يشير هذا إلى أنه يتم تحديث قيمة الخاصية 0xc0010001 إلى 0x1 في الإخراج عند دمج الخصائص في foo.o، والتي تكون قيمة خاصيتها 0xc0010001 هي 0x1، و bar.o، والتي تكون قيمة خاصيتها 0xc0010001 هي 0x1.
في بعض أهداف ELF، تظهر قائمة بالإصلاحات التي تم إدخالها بواسطة --relax.
foo.o: ضبط الفرع في 0x00000008 باتجاه "far" في القسم .text
يشير هذا إلى أنه تم استبدال الفرع في 0x00000008 في foo.o، الذي يستهدف الرمز "far" في القسم .text، بـ "trampoline".
--print-map-discarded
--no-print-map-discarded
اطبع (أو لا تطبع) قائمة الأقسام التي تم تجاهلها وجمعها بواسطة جامع القمامة في خريطة الربط. مفعلة افتراضيًا.
--print-map-locals
--no-print-map-locals
اطبع (أو لا تطبع) الرموز المحلية في خريطة الربط. سيتم طباعة الرموز المحلية مع النص (local) قبل اسمها، وسيتم سردها بعد جميع الرموز العامة في قسم معين. لن يتم تضمين الرموز المحلية المؤقتة (عادةً تلك التي تبدأ بـ .L) في الإخراج. معطلة افتراضيًا.
-n
--nmagic
أوقف محاذاة الصفحات للأقسام، وعطّل الربط مع المكتبات المشتركة. إذا كان تنسيق الإخراج يدعم أرقام سحرية بنمط Unix، فضع علامة على الإخراج على أنه "NMAGIC".
-N
--omagic
اجعل أقسام النص والبيانات قابلة للقراءة والكتابة. أيضًا، لا تقم بمحاذاة قسم البيانات للصفحات، وعطّل الربط مع المكتبات المشتركة. إذا كان تنسيق الإخراج يدعم أرقام سحرية بنمط Unix، فضع علامة على الإخراج على أنه "OMAGIC". ملاحظة: على الرغم من السماح بقسم نص قابل للكتابة لأهداف PE-COFF، إلا أنه لا يتوافق مع مواصفات التنسيق التي نشرتها Microsoft.
--no-omagic
هذا الخيار يلغي معظم تأثيرات الخيار -N. إنه يعين قسم النص ليكون للقراءة فقط، ويجبر قسم البيانات على أن يكون محاذيًا للصفحات. ملاحظة - هذا الخيار لا يمكّن الربط مع المكتبات المشتركة. استخدم -Bdynamic لهذا.
-o output
--output=output
استخدم output كاسم للبرنامج الذي تم إنشاؤه بواسطة ld؛ إذا لم يتم تحديد هذا الخيار، فسيتم استخدام الاسم a.out افتراضيًا. يمكن أيضًا تحديد اسم ملف الإخراج بواسطة الأمر النصي "OUTPUT".
ملاحظة - سيقوم الرابط بحذف ملف الإخراج قبل أن يبدأ في الكتابة إليه. سيفعل ذلك حتى إذا تبين أنه لا يمكن إكمال الربط بسبب أخطاء.
ملاحظة - سيتحقق الرابط للتأكد من أن اسم ملف الإخراج لا يطابق اسم أي من ملفات الإدخال، ولكن هذا كل شيء. على وجه الخصوص، لن يشتكي إذا كان ملف الإخراج قد ي overwrite ملف مصدر أو ملف مهم آخر. لذلك، في أنظمة البناء، يوصى باستخدام الخيار -o كآخر خيار في سطر أوامر الرابط. على سبيل المثال، ضع في اعتبارك:
ld -o $(EXE) $(OBJS)
ld $(OBJS) -o $(EXE)
إذا لم يتم تعريف المتغير EXE لسبب ما، فقد ينتهي الأمر بالنسخة الأولى من أمر الرابط إلى حذف أحد ملفات الكائنات (الملف الأول في قائمة OBJS) في حين أن النسخة الثانية من أمر الرابط ستنشئ رسالة خطأ ولن تحذف أي شيء.
--dependency-file=depfile
اكتب ملف تبعية إلى depfile. يحتوي هذا الملف على قاعدة مناسبة لـ "make" تصف ملف الإخراج وجميع ملفات الإدخال التي تمت قراءتها لإنتاجه. الإخراج مشابه لإخراج المترجم مع -M -MP. لاحظ أنه لا يوجد خيار مثل خيار المترجم -MM، لاستبعاد "الملفات النظامية" (وهو ليس مفهومًا محددًا جيدًا في الرابط، على عكس "رؤوس النظام" في المترجم). لذلك، يكون الإخراج من --dependency-file دائمًا خاصًا بالحالة الدقيقة للتثبيت حيث تم إنتاجه، ولا ينبغي نسخه في ملفات make الموزعة دون تحرير دقيق.
-O level
إذا كانت level قيمة رقمية أكبر من صفر، يقوم ld بتحسين الإخراج. قد يستغرق هذا وقتًا أطول بكثير، لذلك يجب تمكينه فقط للإصدار النهائي. في الوقت الحالي، يؤثر هذا الخيار فقط على إنشاء مكتبة ELF المشتركة. قد تستخدم الإصدارات المستقبلية من الرابط هذا الخيار بشكل أكبر. بالإضافة إلى ذلك، لا يوجد حاليًا أي اختلاف في سلوك الرابط لقيم مختلفة غير صفرية لهذا الخيار. قد يتغير هذا في الإصدارات المستقبلية.
-plugin name
قم بإشراك مكون إضافي في عملية الربط. المعلمة name هي اسم الملف المطلق للمكون الإضافي. عادةً ما تتم إضافة هذه المعلمة تلقائيًا بواسطة المترجم، عند استخدام تحسين وقت الربط، ولكن يمكن للمستخدمين أيضًا إضافة مكونات إضافية خاصة بهم إذا كانوا يرغبون في ذلك.
لاحظ أن موقع المكونات الإضافية التي أنشأها المترجم يختلف عن المكان الذي تبحث فيه برامج ar و nm و ranlib عن مكوناتها الإضافية. لكي تتمكن هذه الأوامر من استخدام مكون إضافي يعتمد على المترجم، يجب أولاً نسخه إلى الدليل ${libdir}/bfd-plugins. جميع المكونات الإضافية للرابط القائم على gcc متوافقة مع الإصدارات السابقة، لذلك يكفي نسخ أحدثها فقط.
--push-state
يسمح الخيار --push-state بحفظ الحالة الحالية للأعلام التي تتحكم في معالجة الملفات المدخلة بحيث يمكن استعادتها باستخدام خيار --pop-state المقابل.
العناصر التي يغطيها هذا الخيار هي: -Bdynamic و -Bstatic و -dn و -dy و -call_shared و -non_shared و -static و -N و -n و --whole-archive و --no-whole-archive و -r و -Ur و --copy-dt-needed-entries و --no-copy-dt-needed-entries و --as-needed و --no-as-needed و -a.
أحد الأهداف من هذا الخيار هو مواصفات pkg-config. عند استخدامه مع الخيار --libs، يتم إدراج جميع المكتبات المطلوبة المحتملة ثم ربطها باستمرار. من الأفضل إرجاع شيء على النحو التالي:
-Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state
--pop-state
يعكس تأثير --push-state، ويستعيد القيم السابقة للأعلام التي تتحكم في معالجة الملفات المدخلة.
-q
--emit-relocs
اترك أقسام الإزاحة والمحتويات في الملفات التنفيذية المرتبطة بالكامل. قد تحتاج أدوات التحليل والتحسين اللاحقة للربط إلى هذه المعلومات من أجل إجراء تعديلات صحيحة على الملفات التنفيذية. يؤدي هذا إلى الحصول على ملفات تنفيذية أكبر.
هذا الخيار مدعوم حاليًا على منصات ELF فقط.
--force-dynamic
يجبر ملف الإخراج على أن يكون به أقسام ديناميكية. هذا الخيار خاص بأهداف VxWorks.
-r
--relocatable
قم بإنشاء إخراج قابل لإعادة التحديد - أي قم بإنشاء ملف إخراج يمكن استخدامه بدوره كإدخال لـ ld. يُطلق على هذا غالبًا الربط الجزئي. كنتيجة ثانوية، في البيئات التي تدعم أرقام التعريف القياسية لنظام Unix، يضبط هذا الخيار أيضًا رقم تعريف الملف للإخراج إلى "OMAGIC". إذا لم يتم تحديد هذا الخيار، يتم إنشاء ملف مطلق. عند ربط برامج C++، لن يحل هذا الخيار المراجع إلى المنشئات؛ للقيام بذلك، استخدم -Ur.
عندما لا يكون لملف الإدخال نفس تنسيق ملف الإخراج، يتم دعم الربط الجزئي فقط إذا كان ملف الإدخال لا يحتوي على أي عمليات إعادة توجيه. يمكن أن يكون للتنسيقات المختلفة للإخراج قيود إضافية؛ على سبيل المثال، لا تدعم بعض التنسيقات المستندة إلى "a.out" الربط الجزئي مع ملفات الإدخال بتنسيقات أخرى على الإطلاق.
عندما يحتوي الإخراج القابل لإعادة التوجيه على محتويات تتطلب تحسين وقت الربط (LTO) ومحتويات لا تتطلب ذلك، سيتم إنشاء قسم ".gnu_object_only" لاحتواء ملف كائن قابل لإعادة التوجيه، كما لو تم تطبيق -r على جميع مدخلات قابلة لإعادة التوجيه التي لا تتطلب LTO. عند معالجة مدخل قابل لإعادة التوجيه مع قسم ".gnu_object_only"، سيقوم الرابط باستخراج قسم ".gnu_object_only" كإدخال منفصل.
لاحظ أنه نظرًا لأن -r يجمع بعض الأقسام من ملفات إدخال مختلفة معًا، فقد يكون لذلك آثار سلبية على حجم الكود وموضعيته في الملف التنفيذي أو المكتبة المشتركة النهائية.
يقوم هذا الخيار بنفس وظيفة -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).
-u symbol
--undefined=symbol
اجعل الرمز (symbol) يتم إدخاله في ملف الإخراج كرمز غير محدد. قد يؤدي هذا، على سبيل المثال، إلى تشغيل ربط وحدات إضافية من المكتبات القياسية. يمكن تكرار -u مع وسائط خيارات مختلفة لإدخال رموز غير محددة إضافية. هذا الخيار يعادل أمر الربط "EXTERN".
إذا كان هذا الخيار يُستخدم لإجبار وحدات إضافية على تضمينها في الربط، وإذا كان من الخطأ أن يظل الرمز غير محدد، فيجب استخدام الخيار --require-defined بدلاً من ذلك.
--require-defined=symbol
تتطلب أن يكون الرمز (symbol) محددًا في ملف الإخراج. هذا الخيار هو نفسه خيار --undefined باستثناء أنه إذا لم يتم تعريف الرمز في ملف الإخراج، فستقوم أداة الربط بإصدار خطأ والخروج. يمكن تحقيق نفس التأثير في ملف الربط عن طريق استخدام "EXTERN" و "ASSERT" و "DEFINED" معًا. يمكن استخدام هذا الخيار عدة مرات لتحديد رموز إضافية.
-Ur للبرامج التي لا تستخدم المنشئات أو المدمرات، أو للأنظمة القائمة على ELF، فإن هذا الخيار يعادل -r: فإنه يقوم بإنشاء إخراج قابل لإعادة التوزيع - أي ملف إخراج يمكن استخدامه بدوره كإدخال لـ ld. بالنسبة للبرامج الثنائية الأخرى، فإن خيار -Ur مشابه لـ -r ولكنه يحل أيضًا المراجع للمنشئات والمدمرات.
بالنسبة لتلك الأنظمة التي يختلف فيها -r و -Ur، فإنه لا يعمل استخدام -Ur على الملفات التي تم ربطها بالفعل باستخدام -Ur؛ بمجرد إنشاء جدول المنشئات، لا يمكن إضافته إليه. استخدم -Ur فقط للربط الجزئي الأخير، و -r للآخرين.
--orphan-handling=MODE
يتحكم في كيفية التعامل مع الأقسام "اليتيمة". القسم "اليتم" هو القسم الذي لم يتم ذكره تحديدًا
في نص الربط.
يمكن أن يكون لـ MODE أي من القيم التالية:
"place"
يتم وضع الأقسام "اليتيمة" في قسم إخراج مناسب باتباع الاستراتيجية
الموصوفة في الأقسام "اليتيمة". يؤثر الخيار --unique أيضًا على كيفية وضع الأقسام.
"discard"
يتم تجاهل جميع الأقسام "اليتيمة" عن طريق وضعها في القسم `/DISCARD/`.
"warn"
سيضع الرابط القسم "اليتم" كما هو الحال في "place" وسيقوم أيضًا بإصدار تحذير.
"error"
سيخرج الرابط بخطأ إذا تم العثور على أي قسم "يتم".
إذا لم يتم إعطاء --orphan-handling، فإن الوضع الافتراضي هو "place".
--unique[=SECTION]
ينشئ قسم إخراج منفصلاً لكل قسم إدخال مطابق لـ SECTION، أو إذا كان
الوسيطة الاختيارية SECTION مفقودة، لكل قسم إدخال "يتم". القسم "اليتم" هو
القسم الذي لم يتم ذكره تحديدًا في نص الربط. يمكنك استخدام هذا الخيار
عدة مرات في سطر الأوامر. يمنع الدمج العادي لأقسام الإدخال بنفس الاسم،
مع إلغاء عمليات تعيين أقسام الإخراج في نص الربط.
-v
--version
-V يعرض رقم إصدار ld. يعرض الخيار -V أيضًا عمليات المحاكاة المدعومة. انظر
أيضًا وصف --enable-linker-version في الخيارات، وخيارات سطر الأوامر التي
يمكن استخدامها لإدراج سلسلة إصدار الرابط في ملف ثنائي.
-x
--discard-all
احذف جميع الرموز المحلية.
-X
--discard-locals
احذف جميع الرموز المحلية المؤقتة. (تبدأ هذه الرموز ببادئات تسمية محلية خاصة بالنظام، عادةً .L لأنظمة ELF أو L لأنظمة a.out التقليدية).
-y symbol
--trace-symbol=symbol
اطبع اسم كل ملف مرتبط به الرمز. يمكن إعطاء هذا الخيار عدة مرات. على العديد من الأنظمة، من الضروري إضافة شرطة سفلية في البداية.
هذا الخيار مفيد عندما يكون لديك رمز غير معرف في الارتباط الخاص بك ولكنك لا تعرف من أين يأتي المرجع.
-Y path
أضف مسارًا إلى مسار البحث الافتراضي للمكتبة. هذا الخيار موجود من أجل التوافق مع Solaris.
-z keyword
الكلمات الرئيسية المعترف بها هي:
call-nop=prefix-addr
call-nop=suffix-nop
call-nop=prefix-byte
call-nop=suffix-byte
حدد بايت "NOP" ذي البايت الواحد عند تحويل استدعاء غير مباشر إلى دالة معرفة محليًا، foo، عبر
فتحة GOT الخاصة بها. يقوم call-nop=prefix-addr بإنشاء "0x67 call foo".
يقوم call-nop=suffix-nop بإنشاء "call foo 0x90". يقوم call-nop=prefix-byte بإنشاء "byte call
foo". يقوم call-nop=suffix-byte بإنشاء "call foo byte". مدعوم لأنظمة i386 و x86_64.
cet-report=none
cet-report=warning
cet-report=error
حدد كيفية الإبلاغ عن الخصائص المفقودة GNU\_PROPERTY\_X86\_FEATURE\_1\_IBT و
GNU_PROPERTY_X86_FEATURE_1_SHSTK في قسم .note.gnu.property الخاص بالإدخال. cet-report=none، وهو الوضع الافتراضي، سيجعل الرابط لا يبلغ عن الخصائص المفقودة في ملفات الإدخال. سيجعل cet-report=warning الرابط يصدر تحذيرًا بشأن الخصائص المفقودة في ملفات الإدخال. سيجعل cet-report=error الرابط يصدر خطأً بشأن الخصائص المفقودة في ملفات الإدخال. لاحظ أن ibt سيقوم بإيقاف تشغيل الإبلاغ عن الخاصية المفقودة GNU_PROPERTY_X86_FEATURE_1_IBT وستقوم shstk بإيقاف تشغيل الإبلاغ عن الخاصية المفقودة GNU_PROPERTY_X86_FEATURE_1_SHSTK. مدعوم لأنظمة Linux/i386 و Linux/x86_64.
combreloc
nocombreloc
يجمع بين أقسام إعادة التوطين الديناميكية المتعددة ويرتبها لتحسين التخزين المؤقت للبحث عن الرموز الديناميكية. لا تفعل ذلك إذا كان `nocombreloc`.
common
nocommon
ينشئ رموزًا عامة بنوع `STT_COMMON` أثناء الربط القابل لإعادة التوطين. استخدم نوع `STT_OBJECT` إذا كان `nocommon`.
common-page-size=value
يحدد حجم الصفحة الأكثر استخدامًا على أنه `value`. سيتم تحسين تخطيط الصورة الذاكرة لتقليل الصفحات الذاكرة إذا كان النظام يستخدم صفحات بهذا الحجم.
defs
يعرض مراجع الرموز غير المحلولة من ملفات الكائنات العادية. يتم ذلك حتى إذا كان الرابط يقوم بإنشاء مكتبة مشتركة غير رمزية. هذا الخيار هو عكس الخيار `-z undefs`.
dynamic-undefined-weak
nodynamic-undefined-weak
يجعل الرموز الضعيفة غير المعرفة ديناميكية عند إنشاء كائن ديناميكي، إذا تمت الإشارة إليها من ملف كائن عادي ولم يتم فرض نطاقها المحلي عن طريق رؤية الرمز أو الإصدار. لا تجعلها ديناميكية إذا كان `nodynamic-undefined-weak`. إذا لم يتم إعطاء أي من الخيارين، فقد يختار الهدف بشكل افتراضي أن يكون أحد الخيارين ساري المفعول، أو يختار مجموعة أخرى من الرموز الضعيفة غير المعرفة لتكون ديناميكية. لا تدعم جميع الأهداف هذه الخيارات.
execstack
يعلم أن الكائن يتطلب مكدسًا قابلاً للتنفيذ.
global
هذا الخيار له معنى فقط عند إنشاء كائن مشترك. يجعل الرموز المعرفة بواسطة هذا الكائن المشترك متاحة لحل الرموز للمكتبات التي يتم تحميلها لاحقًا.
globalaudit
هذا الخيار له معنى فقط عند إنشاء ملف تنفيذي ديناميكي. يضع هذا الخيار علامة على الملف التنفيذي على أنه يتطلب تدقيقًا عالميًا عن طريق تعيين البت `DF_1_GLOBAUDIT` في العلامة الديناميكية `DT_FLAGS_1`. يتطلب التدقيق العالمي تشغيل أي مكتبة تدقيق محددة عبر خيارات سطر الأوامر `--depaudit` أو `-P` لجميع الكائنات الديناميكية التي يتم تحميلها بواسطة التطبيق.
ibtplt
ينشئ إدخالات PLT التي تدعم تتبع الفروع غير المباشرة (IBT) من Intel. مدعوم لنظامي 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
عند إنشاء ملف تنفيذي أو مكتبة مشتركة، قم بتمييزه لإخبار الرابط الديناميكي بتأجيل حل استدعاءات الوظائف إلى النقطة التي يتم فيها استدعاء الوظيفة (الربط الكسول)، بدلاً من وقت التحميل. الربط الكسول هو الوضع الافتراضي.
loadfltr
حدد أن يتم معالجة مرشحات الكائن على الفور في وقت التشغيل.
max-page-size=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
حدد أنه لا ينبغي إلغاء تحميل الكائن في وقت التشغيل.
nodlopen
حدد أن الكائن غير متاح لـ "dlopen".
nodump
حدد أنه لا يمكن تفريغ الكائن بواسطة "dldump".
noexecstack
يميز الكائن بأنه لا يتطلب مكدسًا قابلاً للتنفيذ.
noextern-protected-data
لا تعامل الرموز الخاصة بالبيانات المحمية على أنها خارجية عند إنشاء مكتبة مشتركة. يتجاوز هذا الخيار الإعداد الافتراضي للرابط الخلفي. يمكن استخدامه للتعامل مع عمليات إعادة التوجيه غير الصحيحة للرموز الخاصة بالبيانات المحمية التي تم إنشاؤها بواسطة المترجم. التحديثات على الرموز الخاصة بالبيانات المحمية بواسطة وحدة أخرى غير مرئية للمكتبة المشتركة الناتجة. مدعوم لـ i386 و x86-64.
noreloc-overflow
تعطيل فحص تجاوز إعادة التوجيه. يمكن استخدام هذا لتعطيل فحص تجاوز إعادة التوجيه إذا لم يكن هناك أي تجاوز لإعادة التوجيه الديناميكي في وقت التشغيل. مدعوم لـ x86\_64.
memory-seal
nomemory-seal
أخبر الملف التنفيذي أو المكتبة المشتركة أنه يجب إحكام جميع مقاطع PT\_LOAD لمنع المزيد من التلاعب (مثل تغيير علامات الحماية أو حجم المقطع أو إزالة التعيين). هذا هو إجراء أمني يتطلب دعم النظام. هذا يولد GNU\_PROPERTY\_MEMORY\_SEAL في قسم .note.gnu.property
now
عند إنشاء ملف تنفيذي أو مكتبة مشتركة، قم بتمييزه لإخبار الرابط الديناميكي بحل جميع الرموز عند بدء تشغيل البرنامج، أو عند تحميل المكتبة المشتركة بواسطة dlopen، بدلاً من تأجيل حل استدعاءات الوظائف إلى النقطة التي يتم فيها استدعاء الوظيفة لأول مرة.
origin
حدد أن الكائن يتطلب معالجة `$ORIGIN` في المسارات.
pack-relative-relocs
nopack-relative-relocs
ينشئ عمليات إعادة تحديد موقع نسبية مضغوطة في برنامج قابل للتنفيذ مستقل عن الموضع ومكتبة مشتركة. يضيف إدخالات "DT_RELR" و "DT_RELRSZ" و "DT_RELRENT" إلى القسم الديناميكي. يتم تجاهله عند إنشاء برنامج قابل للتنفيذ يعتمد على الموضع وإخراج قابل لإعادة التجميع. `nopack-relative-relocs` هو الافتراضي، والذي يعطل عمليات إعادة تحديد الموقع النسبية المضغوطة. عند الربط بمكتبة GNU C، تتم إضافة تبعية إصدار الرمز `GLIBC_ABI_DT_RELR` على المكتبة المشتركة C إلى الإخراج. مدعوم لأنظمة i386 و x86-64.
relro
norelro
أنشئ رأس قسم ELF "PT_GNU_RELRO" في الكائن. يحدد هذا مقطع ذاكرة يجب جعله للقراءة فقط بعد إعادة التحديد، إذا تم دعمه. سيؤدي تحديد حجم صفحة أصغر من حجم صفحة النظام إلى جعل هذه الحماية غير فعالة. لا تنشئ قسم ELF "PT_GNU_RELRO" إذا تم استخدام `norelro`.
report-relative-reloc
أبلغ عن عمليات إعادة تحديد موقع ديناميكية نسبية تم إنشاؤها بواسطة الرابط. مدعوم لأنظمة Linux/i386 و Linux/x86_64.
sectionheader
nosectionheader
أنشئ رأس قسم. لا تنشئ رأس قسم إذا تم استخدام `nosectionheader`. `sectionheader` هو الافتراضي.
separate-code
noseparate-code
أنشئ رأس قسم "PT_LOAD" منفصل للتعليمات البرمجية في الكائن. يحدد هذا مقطع ذاكرة يجب أن يحتوي فقط على تعليمات ويجب أن يكون في صفحات منفصلة تمامًا عن أي بيانات أخرى. لا تنشئ قسم "PT_LOAD" منفصل للتعليمات البرمجية إذا تم استخدام `noseparate-code`.
shstk
أنشئ `GNU_PROPERTY_X86_FEATURE_1_SHSTK` في قسم `.note.gnu.property` للإشارة إلى التوافق مع Intel Shadow Stack. مدعوم لأنظمة Linux/i386 و Linux/x86_64.
stack-size=value
حدد حجم مكدس لقسم ELF "PT_GNU_STACK". سيؤدي تحديد قيمة صفر إلى إلغاء أي قسم "PT_GNU_STACK" ذي حجم غير صفري افتراضي.
start-stop-gc
nostart-stop-gc
عندما تكون `--gc-sections` قيد التنفيذ، تؤدي الإشارة من قسم مُحتفظ به إلى `__start_SECNAME` أو `__stop_SECNAME` إلى الاحتفاظ بجميع أقسام الإدخال المسماة `SECNAME` أيضًا، إذا كان `SECNAME` قابلاً للتمثيل كمعرف C، وإذا قام الرابط بإنشاء `__start_SECNAME` أو `__stop_SECNAME`. يعطل الخيار `-z start-stop-gc` هذا التأثير، مما يسمح بإجراء عملية تجميع مهملات على الأقسام كما لو لم يتم تحديد الرموز الاصطناعية الخاصة. ليس للخيار `-z start-stop-gc` أي تأثير على تعريف `__start_SECNAME` أو `__stop_SECNAME` في ملف كائن أو برنامج ربط. سيمنع هذا التعريف الرابط من توفير `__start_SECNAME` أو `__stop_SECNAME` الاصطناعي، وبالتالي فإن المعالجة الخاصة بواسطة عملية تجميع المهملات لهذه المراجع.
start-stop-visibility=value
حدد رؤية رمز ELF للرموز الاصطناعية `__start_SECNAME` و `__stop_SECNAME`. يجب أن تكون القيمة `default` أو `internal` أو `hidden` أو `protected` بالضبط. إذا لم يتم إعطاء خيار `-z start-stop-visibility`، فسيتم استخدام `protected` للتوافق مع الممارسة التاريخية. ومع ذلك، يوصى بشدة باستخدام `-z start-stop-visibility=hidden` في البرامج والمكتبات المشتركة الجديدة بحيث لا يتم تصدير هذه الرموز بين الكائنات المشتركة، وهو ما لا يتم تقديمه عادةً.
نص
بدون_نص
إيقاف_النص
قم بالإبلاغ عن خطأ إذا تم تعيين DT_TEXTREL، أي إذا كان الكائن المستقل عن الموضع أو المشترك يحتوي على عمليات إعادة توجيه ديناميكية في أقسام للقراءة فقط. لا تقم بالإبلاغ عن خطأ إذا تم استخدام `بدون_نص` أو `إيقاف_النص`.
غير_معرف
لا تقم بالإبلاغ عن مراجع الرموز غير المحلولة من ملفات الكائنات العادية، سواء عند إنشاء ملف تنفيذي أو عند إنشاء مكتبة مشتركة. هذا الخيار هو عكس الخيار `-z defs`.
رمز_فريد
بدون_رمز_فريد
تجنب تكرار أسماء الرموز المحلية في جدول سلسلة الرموز. قم بإلحاق "."رقم"" بأسماء الرموز المحلية المكررة إذا تم استخدام `رمز_فريد`. `بدون_رمز_فريد` هو الافتراضي.
x86-64-baseline
x86-64-v2
x86-64-v3
x86-64-v4
حدد مستوى ISA x86-64 المطلوب في قسم `.note.gnu.property`. `x86-64-baseline` يولد "GNU_PROPERTY_X86_ISA_1_BASELINE". `x86-64-v2` يولد "GNU_PROPERTY_X86_ISA_1_V2". `x86-64-v3` يولد "GNU_PROPERTY_X86_ISA_1_V3". `x86-64-v4` يولد "GNU_PROPERTY_X86_ISA_1_V4". مدعوم لنظامي Linux/i386 و Linux/x86_64.
isa-level-report=none
isa-level-report=all
isa-level-report=needed
isa-level-report=used
حدد كيفية الإبلاغ عن مستويات ISA x86-64 في ملفات إعادة التجميع المدخلة. `isa-level-report=none`، وهو الافتراضي، سيجعل الرابط لا يبلغ عن مستويات ISA x86-64 في الملفات المدخلة. `isa-level-report=all` سيجعل الرابط يبلغ عن مستويات ISA x86-64 المطلوبة والمستخدمة في الملفات المدخلة. `isa-level-report=needed` سيجعل الرابط يبلغ عن مستويات ISA x86-64 المطلوبة في الملفات المدخلة. `isa-level-report=used` سيجعل الرابط يبلغ عن مستويات ISA x86-64 المستخدمة في الملفات المدخلة. مدعوم لنظامي Linux/i386 و Linux/x86_64.
يتم تجاهل الكلمات الرئيسية الأخرى من أجل التوافق مع نظام Solaris.
--gnu-tls-tag
--no-gnu-tls-tag
أضف تبعية علامة الإصدار "GLIBC_ABI_GNU_TLS" في البرامج والمكتبات المشتركة الناتجة عند الربط مع glibc إذا كانت ملفات الكائنات القابلة لإعادة التجميع المدخلة تستدعي "___tls_get_addr". سيفشل الإخراج في التحميل والتشغيل في وقت التشغيل مقابل glibc الذي لا يحدد علامة الإصدار "GLIBC_ABI_GNU_TLS". ما لم يتم تعطيلها بواسطة خيار `--disable-gnu-tls-tag` في وقت بناء الرابط، عندما لا يتم تحديد أي خيارات، سيضيف الرابط تبعية علامة الإصدار "GLIBC_ABI_GNU_TLS" إذا كانت المدخلات تحتوي على استدعاء "___tls_get_addr" و libc.so يحدد علامة الإصدار "GLIBC_ABI_GNU_TLS". مدعوم لنظام Linux/i386.
--gnu2-tls-tag
--no-gnu2-tls-tag
أضف تبعية علامة الإصدار "GLIBC_ABI_GNU2_TLS" في البرامج والمكتبات المشتركة الناتجة عند الربط مع glibc إذا كانت ملفات الكائنات القابلة لإعادة التجميع المدخلة تحتوي على إعادة توجيه "R_386_TLS_DESC_CALL" أو "R_X86_64_TLSDESC_CALL". سيفشل الإخراج في التحميل والتشغيل في وقت التشغيل مقابل glibc الذي لا يحدد علامة الإصدار "GLIBC_ABI_GNU2_TLS". ما لم يتم تعطيلها بواسطة خيار `--disable-gnu2-tls-tag` في وقت بناء الرابط، عندما لا يتم تحديد أي خيارات، سيضيف الرابط تبعية علامة الإصدار "GLIBC_ABI_GNU2_TLS" إذا كانت المدخلات تحتوي على إعادة التوجيه "R_386_TLS_DESC_CALL" أو "R_X86_64_TLSDESC_CALL" و libc.so يحدد علامة الإصدار "GLIBC_ABI_GNU2_TLS". مدعوم لنظامي Linux/i386 و Linux/x86_64.
-( archives -)
--start-group archives --end-group
يجب أن تكون الأرشيفات قائمة بملفات الأرشيف. يمكن أن تكون إما أسماء ملفات صريحة أو -l خيارات.
يتم البحث في الأرشيفات المحددة بشكل متكرر حتى لا يتم إنشاء أي مراجع غير محددة جديدة. عادةً، يتم البحث في الأرشيف مرة واحدة فقط بالترتيب المحدد على سطر الأوامر. إذا كانت هناك حاجة إلى رمز في هذا الأرشيف لحل رمز غير محدد يشير إليه كائن في أرشيف يظهر لاحقًا على سطر الأوامر، فلن يتمكن الرابط من حل هذه المرجعية. من خلال تجميع الأرشيفات، سيتم البحث فيها جميعًا بشكل متكرر حتى يتم حل جميع المراجع المحتملة.
يؤدي استخدام هذا الخيار إلى تكلفة كبيرة في الأداء. من الأفضل استخدامه فقط عندما تكون هناك مراجع دائرية لا مفر منها بين أرشيفين أو أكثر.
--accept-unknown-input-arch
--no-accept-unknown-input-arch
يخبر هذا الخيار الرابط بقبول ملفات الإدخال التي لا يمكن التعرف على بنيتها. يفترض أن المستخدم يعرف ما يفعله ويريد عن قصد ربط هذه الملفات غير المعروفة. كان هذا هو السلوك الافتراضي للرابط، قبل الإصدار 2.14. السلوك الافتراضي بدءًا من الإصدار 2.14 هو رفض ملفات الإدخال هذه، وبالتالي تمت إضافة خيار --accept-unknown-input-arch لاستعادة السلوك القديم.
--as-needed
--no-as-needed
يؤثر هذا الخيار على علامات ELF DT_NEEDED للمكتبات الديناميكية المذكورة على سطر الأوامر بعد خيار --as-needed. عادةً ما يضيف الرابط علامة DT_NEEDED لكل مكتبة ديناميكية مذكورة على سطر الأوامر، بغض النظر عما إذا كانت المكتبة مطلوبة بالفعل أم لا. يتسبب --as-needed في إنشاء علامة DT_NEEDED لمكتبة فقط إذا كانت في تلك المرحلة من الربط تلبي مرجعية رمز غير ضعيف غير محدد من ملف كائن عادي أو، إذا لم يتم العثور على المكتبة في قوائم DT_NEEDED للمكتبات الديناميكية المطلوبة الأخرى، مرجعية رمز غير ضعيف غير محدد من مكتبة ديناميكية أخرى مطلوبة. لا تؤثر ملفات الكائنات أو المكتبات التي تظهر على سطر الأوامر بعد المكتبة المعنية على ما إذا كانت المكتبة تعتبر مطلوبة أم لا. هذا مشابه لقواعد استخراج ملفات الكائنات من الأرشيفات. يستعيد --no-as-needed السلوك الافتراضي.
ملاحظة: على الأنظمة المستندة إلى Linux، يكون لخيار `--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`
`-call_shared`
اربط بمكتبات ديناميكية. هذا له معنى فقط على الأنظمة الأساسية التي تدعم المكتبات المشتركة. عادةً ما يكون هذا الخيار هو الافتراضي على هذه الأنظمة الأساسية. يمكن استخدام متغيرات مختلفة من هذا الخيار لتحقيق التوافق مع الأنظمة المختلفة. يمكنك استخدام هذا الخيار عدة مرات في سطر الأوامر: فهو يؤثر على البحث عن المكتبات للخيارات `-l` التي تليه.
`-Bgroup`
يتم تعيين علامة "DF_1_GROUP" في إدخال "DT_FLAGS_1" في القسم الديناميكي. هذا يتسبب في أن يقوم الرابط الديناميكي بإجراء عمليات البحث في هذا الكائن وتوابعه داخل المجموعة فقط. يتم تضمين `--unresolved-symbols=report-all`. هذا الخيار له معنى فقط على منصات ELF التي تدعم المكتبات المشتركة.
`-Bstatic`
`-dn`
`-non_shared`
`-static`
لا تربط بالمكتبات المشتركة. هذا له معنى فقط على الأنظمة الأساسية التي تدعم المكتبات المشتركة. المتغيرات المختلفة لهذا الخيار هي لتحقيق التوافق مع الأنظمة المختلفة. يمكنك استخدام هذا الخيار عدة مرات في سطر الأوامر: فهو يؤثر على البحث عن المكتبات للخيارات `-l` التي تليه. هذا الخيار يعني أيضًا `--unresolved-symbols=report-all`. يمكن استخدام هذا الخيار مع `-shared`. يعني القيام بذلك أنه يتم إنشاء مكتبة مشتركة ولكن يجب حل جميع المراجع الخارجية للمكتبة عن طريق استيراد الإدخالات من المكتبات الثابتة.
`-Bsymbolic`
عند إنشاء مكتبة مشتركة، اربط المراجع للرموز العامة بالتعريف داخل المكتبة المشتركة، إن وجد. عادةً، من الممكن لبرنامج مرتبط بمكتبة مشتركة تجاوز التعريف داخل المكتبة المشتركة. هذا الخيار له معنى فقط على منصات ELF التي تدعم المكتبات المشتركة.
`-Bsymbolic-functions`
عند إنشاء مكتبة مشتركة، اربط المراجع للرموز العامة للدالة بالتعريف داخل المكتبة المشتركة. هذا الخيار له معنى فقط على منصات ELF التي تدعم المكتبات المشتركة.
`-Bno-symbolic`
يمكن لهذا الخيار إلغاء خياري `-Bsymbolic` و`-Bsymbolic-functions` اللذين تم تحديدهما سابقًا.
`--dynamic-list=dynamic-list-file`
حدد اسم ملف القائمة الديناميكية للرابط. يتم استخدام هذا عادةً عند إنشاء مكتبات مشتركة لتحديد قائمة بالرموز العامة التي لا ينبغي ربط مراجعها بالتعريف داخل المكتبة المشتركة، أو إنشاء ملفات تنفيذية مرتبطة ديناميكيًا لتحديد قائمة بالرموز التي يجب إضافتها إلى جدول الرموز في الملف التنفيذي. هذا الخيار له معنى فقط على منصات ELF التي تدعم المكتبات المشتركة.
تنسيق القائمة الديناميكية هو نفسه تنسيق عقدة الإصدار بدون نطاق واسم العقدة. راجع VERSION لمزيد من المعلومات.
--dynamic-list-data
تضمين جميع الرموز العامة للبيانات في القائمة الديناميكية.
--dynamic-list-cpp-new
توفير القائمة الديناميكية المضمنة لمشغل C++ new و delete. هذا مفيد بشكل أساسي لبناء libstdc++ المشتركة.
--dynamic-list-cpp-typeinfo
توفير القائمة الديناميكية المضمنة لوقت تشغيل C++ لتحديد النوع.
--check-sections
--no-check-sections
يطلب من الرابط عدم التحقق من عناوين الأقسام بعد تعيينها لمعرفة ما إذا كانت هناك أي تداخلات. عادةً ما يقوم الرابط بإجراء هذا الفحص، وإذا وجد أي تداخلات، فإنه سينتج رسائل خطأ مناسبة. يعرف الرابط عن الأقسام الموجودة في التراكبات ويقوم بإجراء تعديلات عليها. يمكن استعادة السلوك الافتراضي باستخدام خيار سطر الأوامر --check-sections. عادةً لا يتم التحقق من تداخل الأقسام للروابط القابلة لإعادة التوزيع. يمكنك فرض التحقق في هذه الحالة باستخدام الخيار --check-sections.
--copy-dt-needed-entries
--no-copy-dt-needed-entries
يؤثر هذا الخيار على معالجة المكتبات الديناميكية المشار إليها بواسطة علامات DT_NEEDED داخل مكتبات ELF الديناميكية المذكورة في سطر الأوامر. عادةً لا يقوم الرابط بإضافة علامة DT_NEEDED إلى الملف الثنائي الناتج لكل مكتبة مذكورة في علامة DT_NEEDED في مكتبة الإدخال الديناميكية. ومع ذلك، عند تحديد --copy-dt-needed-entries في سطر الأوامر، سيتم إضافة إدخالات DT_NEEDED لأي مكتبات ديناميكية تتبع ذلك. يمكن استعادة السلوك الافتراضي باستخدام --no-copy-dt-needed-entries.
يؤثر هذا الخيار أيضًا على حل الرموز في المكتبات الديناميكية. مع --copy-dt-needed-entries، سيتم البحث بشكل متكرر في المكتبات الديناميكية المذكورة في سطر الأوامر، مع تتبع علامات DT_NEEDED الخاصة بها إلى مكتبات أخرى، وذلك من أجل حل الرموز المطلوبة بواسطة الملف الثنائي الناتج. مع الإعداد الافتراضي، يتوقف البحث في المكتبات الديناميكية التي تتبع ذلك عند المكتبة الديناميكية نفسها. لن يتم تتبع أي روابط DT_NEEDED لحل الرموز.
--cref
إخراج جدول المراجع المتقاطعة. إذا كان يتم إنشاء ملف خريطة للرابط، تتم طباعة جدول المراجع المتقاطعة في ملف الخريطة. خلاف ذلك، تتم طباعته على الإخراج القياسي.
تنسيق الجدول بسيط عن قصد، بحيث يمكن معالجته بسهولة بواسطة برنامج نصي إذا لزم الأمر. تتم طباعة الرموز، مرتبة حسب الاسم. لكل رمز، يتم إعطاء قائمة بأسماء الملفات. إذا كان الرمز معرفًا، فإن أول ملف مدرج هو موقع التعريف. إذا تم تعريف الرمز كقيمة عامة، فإن أي ملفات يحدث فيها ذلك تظهر بعد ذلك. أخيرًا، يتم إدراج أي ملفات تشير إلى الرمز.
--ctf-variables
--no-ctf-variables
يدعم تنسيق معلومات التصحيح CTF قسمًا يرمز إلى أسماء وأنواع المتغيرات الموجودة في البرنامج والتي لا تظهر في أي جدول رموز. من الواضح أنه لا يمكن البحث عن هذه المتغيرات عن طريق العنوان بواسطة أدوات التصحيح التقليدية، لذلك عادةً ما يتم إهدار المساحة المستخدمة لأنواعها وأسمائها: عادةً ما تكون الأنواع صغيرة ولكن غالبًا ما تكون الأسماء كبيرة.
يؤدي استخدام الخيار `--ctf-variables` إلى إنشاء هذا القسم. يمكن استعادة السلوك الافتراضي باستخدام `--no-ctf-variables`.
--ctf-share-types=method
يضبط الطريقة المستخدمة لمشاركة الأنواع بين وحدات الترجمة في CTF.
share-unconflicted
ضع جميع الأنواع التي ليس لها تعريفات غامضة في القاموس المشترك، حيث يمكن لأدوات التصحيح الوصول إليها بسهولة، حتى لو كانت موجودة في وحدة ترجمة واحدة فقط. هذا هو الإعداد الافتراضي.
share-duplicated
ضع فقط الأنواع الموجودة في وحدات ترجمة متعددة في القاموس المشترك: تذهب الأنواع التي تحتوي على تعريف واحد فقط إلى قواميس خاصة بكل وحدة ترجمة. دائمًا ما تذهب الأنواع ذات التعريفات الغامضة في وحدات ترجمة متعددة إلى قواميس خاصة بكل وحدة ترجمة. يميل هذا إلى جعل CTF أكبر، ولكنه قد يقلل من مقدار CTF الموجود في القاموس المشترك. بالنسبة للمشاريع الكبيرة جدًا، قد يؤدي ذلك إلى تسريع فتح CTF وتوفير الذاكرة في مستهلك CTF في وقت التشغيل.
--no-define-common
يمنع هذا الخيار تخصيص عناوين للرموز الشائعة. الأمر النصي "INHIBIT_COMMON_ALLOCATION" له نفس التأثير.
يسمح خيار `--no-define-common` بفصل قرار تخصيص العناوين للرموز الشائعة عن اختيار نوع الملف الناتج؛ وإلا فإن نوع الإخراج غير القابل لإعادة التوطين يجبر على تخصيص عناوين للرموز الشائعة. يسمح استخدام `--no-define-common` للرموز الشائعة التي تتم الإشارة إليها من مكتبة مشتركة بتخصيص العناوين لها فقط في البرنامج الرئيسي.
يزيل هذا المساحة المكررة غير المستخدمة في المكتبة المشتركة، ويمنع أيضًا أي ارتباك محتمل حول الحل إلى النسخة المكررة الخاطئة عندما تكون هناك العديد من الوحدات الديناميكية مع مسارات بحث متخصصة لدقة الرموز في وقت التشغيل.
--force-group-allocation
يجعل هذا الخيار أن يضع الرابط أعضاء مجموعة الأقسام كأقسام إدخال عادية، ويحذف مجموعات الأقسام. هذا هو السلوك الافتراضي للربط النهائي ولكن يمكن استخدام هذا الخيار لتغيير سلوك الربط القابل لإعادة التوطين (-r). الأمر النصي "FORCE_GROUP_ALLOCATION" له نفس التأثير.
--defsym=symbol=expression
قم بإنشاء رمز عام في ملف الإخراج، يحتوي على العنوان المطلق المعطى بواسطة التعبير. يمكنك استخدام هذا الخيار عدة مرات حسب الحاجة لتعريف رموز متعددة في سطر الأوامر. يتم دعم شكل محدود من العمليات الحسابية للتعبير في هذا السياق: يمكنك إعطاء ثابت سداسي عشري أو اسم رمز موجود، أو استخدام "+" و "-" لإضافة أو طرح ثوابت سداسية عشرية أو رموز. إذا كنت بحاجة إلى تعبيرات أكثر تفصيلاً، ففكر في استخدام لغة أوامر الرابط من برنامج نصي. ملاحظة: يجب ألا يكون هناك مسافة بين الرمز وعلامة التساوي ("=") والتعبير.
يعالج الرابط وسائط --defsym و -T بالترتيب، مع وضع --defsym قبل -T، مما سيحدد الرمز قبل معالجة نص الرابط من -T، في حين أن وضع --defsym بعد -T سيحدد الرمز بعد معالجة نص الرابط. لهذا الترتيب عواقب على التعبيرات داخل نص الرابط التي تستخدم رموز --defsym، وسيعتمد الترتيب الصحيح على ما تحاول تحقيقه.
^ -demangle[=style]
^ -no-demangle
تتحكم هذه الخيارات في ما إذا كان سيتم فك تشفير أسماء الرموز في رسائل الخطأ والمخرجات الأخرى. عندما يُطلب من الرابط فك التشفير، فإنه يحاول تقديم أسماء الرموز بطريقة قابلة للقراءة: حيث يقوم بإزالة الشرطات السفلية الرائدة إذا كانت تُستخدم بواسطة تنسيق الملف الكائني، وتحويل أسماء رموز C++ المشفرة إلى أسماء قابلة للقراءة للمستخدم. لدى المترجمين المختلفين أنماط تشفير مختلفة. يمكن استخدام وسيطة نمط فك التشفير الاختيارية لتحديد نمط فك تشفير مناسب لمترجمك. سيفك الرابط التشفير افتراضيًا ما لم يتم تعيين متغير البيئة COLLECT_NO_DEMANGLE. يمكن استخدام هذه الخيارات لتجاوز الإعداد الافتراضي.
^ Ifile
^ -dynamic-linker=file
يحدد اسم الرابط الديناميكي. هذا له معنى فقط عند إنشاء ملفات تنفيذية ELF مرتبطة ديناميكيًا. عادةً ما يكون الرابط الديناميكي الافتراضي صحيحًا؛ لا تستخدم هذا إلا إذا كنت تعرف ما تفعله.
^ -no-dynamic-linker
عند إنشاء ملف تنفيذي، احذف الطلب باستخدام رابط ديناميكي في وقت التحميل. هذا له معنى فقط للملفات التنفيذية ELF التي تحتوي على عمليات نقل ديناميكية، وعادةً ما يتطلب كود نقطة دخول قادر على معالجة عمليات النقل هذه.
^ -embedded-relocs
يشبه هذا الخيار الخيار --emit-relocs باستثناء أن عمليات النقل مخزنة في قسم خاص بالهدف. هذا الخيار مدعوم فقط بواسطة أهداف BFIN و CR16 و M68K.
^ -disable-multiple-abs-defs
لا تسمح بتعدد التعريفات مع الرموز المضمنة في اسم الملف الذي تم استدعاؤه بواسطة -R أو --just-symbols.
^ -fatal-warnings
^ -no-fatal-warnings
تعامل جميع التحذيرات على أنها أخطاء. يمكن استعادة السلوك الافتراضي باستخدام الخيار --no-fatal-warnings.
^ w
^ -no-warnings
لا تعرض أي رسائل تحذير أو خطأ. هذا يلغي --fatal-warnings إذا تم تمكينه. يمكن استخدام هذا الخيار عندما يكون من المعروف أن الملف الثنائي الناتج لن يعمل، ولكن لا تزال هناك حاجة لإنشائه.
^ -force-exe-suffix
تأكد من أن الملف الناتج يحتوي على لاحقة ".exe".
إذا لم يكن للملف الناتج المرتبط بالكامل والذي تم إنشاؤه بنجاح لاحقة ".exe" أو ".dll"، فسوف يجبر هذا الخيار الرابط على نسخ الملف الناتج إلى ملف بنفس الاسم مع لاحقة ".exe". هذا الخيار مفيد عند استخدام ملفات Make غير معدلة على مضيف Microsoft Windows، حيث لن يقوم بعض إصدارات Windows بتشغيل صورة ما لم تنتهي بلاحقة ".exe".
--gc-sections
--no-gc-sections
تمكين جمع البيانات المهملة للأقسام المدخلة غير المستخدمة. يتم تجاهل هذا الخيار على الأنظمة المستهدفة التي لا تدعمه. يمكن استعادة السلوك الافتراضي (بعدم إجراء جمع البيانات المهملة) عن طريق تحديد --no-gc-sections على سطر الأوامر. لاحظ أن جمع البيانات المهملة لتنسيقي COFF و PE مدعوم، ولكن يعتبر التنفيذ تجريبيًا حاليًا.
يحدد --gc-sections الأقسام المدخلة التي سيتم استخدامها عن طريق فحص الرموز وإعادة التعيين. يتم الاحتفاظ بالقسم الذي يحتوي على الرمز المدخل وأي قسم يحتوي على رموز غير معرفة على سطر الأوامر، وكذلك الأقسام التي تحتوي على رموز يتم الرجوع إليها بواسطة الكائنات الديناميكية. لاحظ أنه عند إنشاء مكتبات مشتركة، يجب أن يفترض الرابط أن أي رمز مرئي يتم الرجوع إليه. بمجرد تحديد هذه المجموعة الأولية من الأقسام، يقوم الرابط بشكل متكرر بتمييز أي قسم يتم الرجوع إليه بواسطة عمليات إعادة التعيين الخاصة به على أنه قيد الاستخدام. راجع --entry، و --undefined، و --gc-keep-exported.
يمكن تعيين هذا الخيار عند إجراء ربط جزئي (ممكن باستخدام الخيار -r). في هذه الحالة، يجب تحديد جذر الرموز التي سيتم الاحتفاظ بها بشكل صريح إما عن طريق أحد الخيارات --entry، أو --undefined، أو --gc-keep-exported أو عن طريق أمر "ENTRY" في برنامج الرابط.
كتوسعة GNU، لن يتم جمع الأقسام المدخلة بتنسيق ELF والتي تم وضع علامة عليها باستخدام العلامة "SHF_GNU_RETAIN".
--print-gc-sections
--no-print-gc-sections
عرض قائمة بجميع الأقسام التي تمت إزالتها بواسطة جمع البيانات المهملة. تتم طباعة القائمة على stderr. هذا الخيار فعال فقط إذا تم تمكين جمع البيانات المهملة عبر الخيار --gc-sections. يمكن استعادة السلوك الافتراضي (بعدم إدراج الأقسام التي تمت إزالتها) عن طريق تحديد --no-print-gc-sections على سطر الأوامر.
--gc-keep-exported
عند تمكين --gc-sections، يمنع هذا الخيار جمع البيانات المهملة للأقسام المدخلة غير المستخدمة التي تحتوي على رموز عالمية ذات رؤية افتراضية أو محمية. هذا الخيار مخصص للاستخدام في الملفات التنفيذية حيث سيتم جمع الأقسام غير المرجعية، بغض النظر عن الرؤية الخارجية للرموز الموجودة. لاحظ أن هذا الخيار ليس له أي تأثير عند ربط الكائنات المشتركة لأنه بالفعل السلوك الافتراضي. هذا الخيار مدعوم فقط لأنظمة ELF المستهدفة.
--print-output-format
طباعة اسم تنسيق الإخراج الافتراضي (والذي قد يتأثر بخيارات أخرى على سطر الأوامر). هذا هو السلسلة التي ستظهر في أمر "OUTPUT_FORMAT" في برنامج الرابط.
--print-memory-usage
طباعة الحجم المستخدم، والحجم الإجمالي، والحجم المستخدم لمناطق الذاكرة التي تم إنشاؤها باستخدام الأمر MEMORY. هذا مفيد على الأنظمة المدمجة للحصول على نظرة سريعة على مقدار الذاكرة المتاحة. تنسيق الإخراج عبارة عن رأس واحد وسطر واحد لكل منطقة. وهو سهل القراءة ويسهل تحليله بواسطة الأدوات. فيما يلي مثال على الإخراج:
منطقة الذاكرة الحجم المستخدم حجم المنطقة نسبة الاستخدام
ROM: 256 KB 1 MB 25.00%
RAM: 32 B 2 GB 0.00%
ملاحظة: إذا كنت تريد معرفة المزيد حول استخدام الذاكرة الخاص بالرابط نفسه، فإن الخيار `--stats` سيفعل ذلك.
--help
اطبع ملخصًا لخـيارات سطر الأوامر على الإخراج القياسي ثم قم بالخروج.
--target-help
اطبع ملخصًا لجميع الخيارات الخاصة بالهدف على الإخراج القياسي ثم قم بالخروج.
-Map=mapfile
اطبع خريطة الارتباط إلى الملف mapfile. انظر إلى وصف الخيار `-M` أعلاه. إذا كان mapfile هو الحرف "-" فقط، فسيتم كتابة الخريطة إلى stdout.
يؤدي تحديد دليل كـ mapfile إلى كتابة خريطة الارتباط كملف داخل الدليل. عادةً ما يتم حساب اسم الملف داخل الدليل على أنه اسم الملف الناتج مع إضافة ".map". ومع ذلك، إذا تم استخدام الحرف الخاص "%"، فسيتم استبداله بالمسار الكامل للملف الناتج. بالإضافة إلى ذلك، إذا كانت هناك أي أحرف بعد رمز "%"، فلن يتم إلحاق ".map" بعد ذلك.
-o foo.exe -Map=bar [ينشئ ./bar]
-o ../dir/foo.exe -Map=bar [ينشئ ./bar]
-o foo.exe -Map=../dir [ينشئ ../dir/foo.exe.map]
-o ../dir2/foo.exe -Map=../dir [ينشئ ../dir/foo.exe.map]
-o foo.exe -Map=% [ينشئ ./foo.exe.map]
-o ../dir/foo.exe -Map=% [ينشئ ../dir/foo.exe.map]
-o foo.exe -Map=%.bar [ينشئ ./foo.exe.bar]
-o ../dir/foo.exe -Map=%.bar [ينشئ ../dir/foo.exe.bar]
-o ../dir2/foo.exe -Map=../dir/% [ينشئ ../dir/../dir2/foo.exe.map]
-o ../dir2/foo.exe -Map=../dir/%.bar [ينشئ ../dir/../dir2/foo.exe.bar]
يعد تحديد أكثر من حرف "%" خطأ.
إذا كان ملف الخريطة موجودًا بالفعل، فسيتم استبداله بهذه العملية.
--no-keep-memory
يقوم ld عادةً بالتحسين من أجل السرعة بدلاً من استخدام الذاكرة عن طريق تخزين جداول الرموز للملفات المدخلة في الذاكرة. يخبر هذا الخيار ld بالتحسين من أجل استخدام الذاكرة بدلاً من ذلك، عن طريق إعادة قراءة جداول الرموز حسب الحاجة. قد يكون هذا مطلوبًا إذا نفدت مساحة الذاكرة في ld أثناء ربط ملف تنفيذي كبير.
--no-undefined
-z defs
قم بالإبلاغ عن مراجع الرموز غير المحلولة من ملفات الكائنات العادية. يتم ذلك حتى إذا كان الرابط يقوم بإنشاء مكتبة مشتركة غير رمزية. يتحكم المفتاح `--[no-]allow-shlib-undefined` في السلوك الخاص بالإبلاغ عن المراجع غير المحلولة الموجودة في المكتبات المشتركة المرتبطة.
يمكن عكس تأثير هذا الخيار باستخدام الخيار "-z undefs".
--allow-multiple-definition
-z muldefs
عادةً عندما يتم تعريف الرمز عدة مرات، سيبلغ الرابط عن خطأ قاتل. تسمح هذه الخيارات بتعريفات متعددة وسيتم استخدام التعريف الأول.
--allow-shlib-undefined
--no-allow-shlib-undefined
يسمح أو يمنع الرموز غير المعرفة في المكتبات المشتركة. هذا المفتاح مشابه لـ `--no-undefined` باستثناء أنه يحدد السلوك عندما تكون الرموز غير المعرفة في مكتبة مشتركة بدلاً من ملف كائن عادي. لا يؤثر على كيفية التعامل مع الرموز غير المعرفة في ملفات الكائنات العادية.
السلوك الافتراضي هو الإبلاغ عن الأخطاء لأي رموز غير معرفة يتم الرجوع إليها في المكتبات المشتركة إذا كان الرابط يستخدم لإنشاء ملف تنفيذي، ولكن السماح بها إذا كان الرابط يستخدم لإنشاء مكتبة مشتركة.
أسباب السماح بالرموز غير المعرفة في المكتبات المشتركة المحددة في وقت الربط هي:
قد لا تكون المكتبة المشتركة المحددة في وقت الربط هي نفسها الموجودة في وقت التحميل، لذلك قد يكون الرمز قابلاً للحل بالفعل في وقت التحميل.
هناك بعض أنظمة التشغيل، مثل BeOS و HPPA، حيث تكون الرموز غير المعرفة في المكتبات المشتركة أمرًا طبيعيًا.
يقوم نواة BeOS على سبيل المثال بتصحيح المكتبات المشتركة في وقت التحميل لتحديد الوظيفة الأكثر ملاءمة للبنية الحالية. يتم استخدام هذا، على سبيل المثال، لتحديد وظيفة memset المناسبة ديناميكيًا.
--error-handling-script=scriptname
إذا تم توفير هذا الخيار، فسوف يستدعي الرابط البرنامج النصي scriptname كلما تمت مواجهة خطأ. حاليًا، يتم دعم نوعين فقط من الأخطاء: الرموز المفقودة والمكتبات المفقودة. سيتم تمرير وسيطتين إلى البرنامج النصي: الكلمة الأساسية "undefined-symbol" أو "missing-lib" واسم الرمز غير المعرف أو المكتبة المفقودة. الغرض من ذلك هو أن يقدم البرنامج النصي اقتراحات للمستخدم حول مكان العثور على الرمز أو المكتبة. بعد انتهاء البرنامج النصي، سيتم عرض رسالة الخطأ العادية للرابط.
يتم التحكم في توفر هذا الخيار بواسطة مفتاح وقت التكوين، لذلك قد لا يكون موجودًا في تطبيقات معينة.
--no-undefined-version
عادةً، عندما يكون للرمز إصدار غير معرف، سيتجاهله الرابط. يمنع هذا الخيار الرموز التي تحتوي على إصدار غير معرف وسيصدر خطأ قاتلًا بدلاً من ذلك.
--default-symver
إنشاء واستخدام إصدار رمز افتراضي (اسم soname) للرموز المصدرة غير التي لا تحتوي على إصدار.
--default-imported-symver
إنشاء واستخدام إصدار رمز افتراضي (اسم soname) للرموز المستوردة التي لا تحتوي على إصدار.
--no-warn-mismatch
عادةً ما يصدر ld خطأ إذا حاولت ربط ملفات إدخال لا تتطابق لسبب ما، ربما لأنها تم تجميعها لمعالجات مختلفة أو لاتجاهات بايت مختلفة. يخبر هذا الخيار ld بأنه يجب أن يسمح بهدوء بهذه الأخطاء المحتملة. يجب استخدام هذا الخيار بحذر، في الحالات التي اتخذت فيها إجراءً خاصًا يضمن أن أخطاء الرابط غير مناسبة.
--no-warn-search-mismatch
عادةً ما يصدر ld تحذيرًا إذا وجد مكتبة غير متوافقة أثناء بحث المكتبة. يقوم هذا الخيار بإسكات التحذير.
--no-whole-archive
إيقاف تأثير خيار --whole-archive لملفات الأرشيف اللاحقة.
--noinhibit-exec
احتفظ بملف الإخراج القابل للتنفيذ كلما كان لا يزال قابلاً للاستخدام. عادةً، لن يقوم الرابط بإنتاج ملف إخراج إذا واجه أخطاء أثناء عملية الربط؛ فهو يخرج دون كتابة ملف إخراج عندما يصدر أي خطأ على الإطلاق.
-nostdlib
ابحث فقط في أدلة المكتبات المحددة بشكل صريح في سطر الأوامر. يتم تجاهل أدلة المكتبات المحددة في نصوص الرابط (بما في ذلك نصوص الرابط المحددة في سطر الأوامر).
--oformat=output-format
يمكن تكوين ld لدعم أكثر من نوع واحد من ملفات الكائنات. إذا تم تكوين ld الخاص بك بهذه الطريقة، فيمكنك استخدام خيار --oformat لتحديد تنسيق ثنائي لملف الكائن الناتج. حتى عندما يتم تكوين ld لدعم تنسيقات كائنات بديلة، فلا تحتاج عادةً إلى تحديد ذلك، حيث يجب أن يتم تكوين ld لإنتاج تنسيق إخراج افتراضي وهو التنسيق الأكثر شيوعًا على كل جهاز. `output-format` عبارة عن سلسلة نصية، اسم تنسيق معين مدعوم بواسطة مكتبات BFD. (يمكنك سرد التنسيقات الثنائية المتاحة باستخدام `objdump -i`). يمكن أن يحدد الأمر النصي "OUTPUT_FORMAT" أيضًا تنسيق الإخراج، ولكن هذا الخيار يلغي ذلك.
--out-implib file
أنشئ مكتبة استيراد في ملف تتوافق مع الملف القابل للتنفيذ الذي يقوم الرابط بإنشائه (على سبيل المثال، DLL أو برنامج ELF). يمكن استخدام مكتبة الاستيراد هذه (والتي يجب أن تسمى "*.dll.a" أو "*.a" لملفات DLL) لربط العملاء مقابل الملف القابل للتنفيذ الذي تم إنشاؤه؛ هذا السلوك يجعل من الممكن تخطي خطوة منفصلة لإنشاء مكتبة استيراد (على سبيل المثال، "dlltool" لملفات DLL). هذا الخيار متاح فقط لمنصات i386 PE و ELF من الرابط.
-pie
--pic-executable
أنشئ ملفًا تنفيذيًا مستقلاً عن الموضع. هذا مدعوم حاليًا فقط على منصات ELF. يتم نقل الملفات التنفيذية المستقلة عن الموضع بواسطة الرابط الديناميكي إلى العنوان الظاهري الذي يختاره نظام التشغيل لها، والذي يمكن أن يختلف بين عمليات الاستدعاء. يتم وضع علامة عليها على أنها ET_DYN في رأس ملف ELF، ولكنها تختلف عن المكتبات المشتركة بعدة طرق. على وجه الخصوص، لا يمكن تجاوز الرموز المحددة في ملف 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.
إذا لم يتم استخدام -rpath عند ربط ملف تنفيذي بتنسيق ELF، فسيتم استخدام محتويات متغير البيئة LD_RUN_PATH إذا تم تعريفه.
يمكن أيضًا استخدام الخيار -rpath على SunOS. افتراضيًا، على SunOS، سيقوم الرابط بإنشاء مسار بحث وقت التشغيل من جميع خيارات -L التي يتم إعطاؤها له. إذا تم استخدام خيار -rpath، فسيتم إنشاء مسار البحث في وقت التشغيل باستخدام خيارات -rpath فقط، مع تجاهل خيارات -L. يمكن أن يكون هذا مفيدًا عند استخدام gcc، والذي يضيف العديد من خيارات -L التي قد تكون على أنظمة ملفات مُثبتة عبر NFS.
من أجل التوافق مع روابط ELF الأخرى، إذا تبع الخيار -R اسم دليل، بدلاً من اسم ملف، فسيتم التعامل معه على أنه خيار -rpath.
^ rpath-link=dir
عند استخدام ELF أو SunOS، قد تتطلب إحدى المكتبات المشتركة مكتبة أخرى. يحدث هذا عندما يتضمن رابط ld -shared مكتبة مشتركة كأحد الملفات المدخلة.
عندما يواجه الرابط مثل هذا التبعية أثناء ربط غير مشترك وغير قابل لإعادة التوطين، فإنه سيحاول تلقائيًا تحديد موقع المكتبة المشتركة المطلوبة وتضمينها في الربط، إذا لم يتم تضمينها بشكل صريح. في مثل هذه الحالة، يتم البحث في عدة أدلة كما هو موضح أدناه. يحدد الخيار -rpath-link المجموعة الأولى من الأدلة التي سيتم البحث فيها. يمكن أن يحدد هذا الخيار تسلسلًا من أسماء الأدلة إما عن طريق توفير قائمة من الأسماء مفصولة بنقطتين، أو عن طريق ظهوره عدة مرات.
يمكن أن تظهر الرموز $ORIGIN و$LIB في أدلة البحث هذه. سيتم استبدالها بالمسار الكامل إلى الدليل الذي يحتوي على البرنامج أو المكتبة المشتركة في حالة $ORIGIN، أو lib (للملفات الثنائية 32 بت) أو lib64 (للملفات الثنائية 64 بت) في حالة $LIB.
يمكن أيضًا استخدام الشكل البديل لهذه الرموز - ${ORIGIN} و ${LIB}. الرمز $PLATFORM غير مدعوم.
يجب استخدام خيار --rpath-link بحذر لأنه يتجاوز مسار البحث الذي قد يكون قد تم تجميعه في مكتبة مشتركة. في مثل هذه الحالة، من الممكن استخدام مسار بحث مختلف عن الذي كان سيستخدمه الرابط الديناميكي في وقت التشغيل.
عندما تكون هناك حاجة إلى مكتبات مشتركة إضافية، سيبحث الرابط في الدلائل بالترتيب المدرج أدناه للعثور عليها. لاحظ مع ذلك أن هذا ينطبق فقط على المكتبات الإضافية المطلوبة لتلبية المكتبات المشتركة المضمنة بالفعل. لا ينطبق على المكتبات التي يتم تضمينها عبر خيار سطر الأوامر -l. يتم إجراء عمليات البحث عن المكتبات -l فقط في الدلائل المحددة بواسطة الخيار -L.
- أي الدلائل المحددة بخيارات -rpath-link.
- أي الدلائل المحددة بخيارات -rpath. الفرق بين -rpath و -rpath-link هو أن الدلائل المحددة بخيارات -rpath يتم تضمينها في الملف القابل للتنفيذ وتستخدم في وقت التشغيل، في حين أن خيار -rpath-link يكون فعالًا فقط في وقت الربط. دعم البحث في -rpath بهذه الطريقة متاح فقط للروابط الأصلية والروابط المتقاطعة التي تم تكوينها باستخدام الخيار --with-sysroot.
- على نظام ELF، للروابط الأصلية، إذا لم يتم استخدام خيارات -rpath و -rpath-link، فابحث في محتويات متغير البيئة "LD_RUN_PATH".
- على SunOS، إذا لم يتم استخدام خيار -rpath، فابحث في أي الدلائل المحددة باستخدام خيارات -L.
- للرابط الأصلي، ابحث في محتويات متغير البيئة "LD_LIBRARY_PATH".
- للرابط الأصلي لنظام ELF، يتم البحث في الدلائل الموجودة في "DT_RUNPATH" أو "DT_RPATH" لمكتبة مشتركة للعثور على المكتبات المشتركة التي تحتاجها. يتم تجاهل إدخالات "DT_RPATH" إذا كانت هناك إدخالات "DT_RUNPATH".
- للرابط الخاص بنظام Linux، إذا كان الملف /etc/ld.so.conf موجودًا، فابحث في قائمة الدلائل الموجودة في هذا الملف. ملاحظة: يتم إلحاق مسار هذا الملف بقيمة "sysroot"، إذا تم تحديد ذلك، ثم أي سلسلة "prefix" إذا تم تكوين الرابط باستخدام الخيار --prefix=<path>.
- للرابط الأصلي لنظام FreeBSD، أي الدلائل المحددة بواسطة الماكرو "_PATH_ELF_HINTS" المحدد في ملف الرأس elf-hints.h.
- أي الدلائل المحددة بواسطة الأمر "SEARCH_DIR" في برنامج الرابط المقدم على سطر الأوامر، بما في ذلك البرامج النصية المحددة بواسطة -T (وليس -dT).
- الدلائل الافتراضية، عادةً /lib و /usr/lib.
- أي الدلائل المحددة بواسطة البرنامج المساعد LDPT_SET_EXTRA_LIBRARY_PATH.
- أي الدلائل المحددة بواسطة الأمر "SEARCH_DIR" في برنامج الرابط الافتراضي.
لاحظ مع ذلك أنه على أنظمة Linux، هناك تحذير إضافي: إذا كان الخيار --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.*) }
}
الميزة الموجودة في ملف ترتيب الأقسام هي أنه يمكن استخدامه لترتيب تلك الأقسام التي تهم المستخدم دون الحاجة إلى القلق بشأن أي أقسام أخرى أو مناطق ذاكرة أو أي شيء آخر.
-shared
-Bshareable
إنشاء مكتبة مشتركة. يتم دعم هذا حاليًا على منصات ELF و XCOFF و SunOS. على SunOS، سينشئ الرابط تلقائيًا مكتبة مشتركة إذا لم يتم استخدام الخيار -e وكانت هناك رموز غير معرفة في الربط.
--sort-common
--sort-common=ascending
--sort-common=descending
يخبر هذا الخيار ld بفرز الرموز الشائعة حسب المحاذاة بترتيب تصاعدي أو تنازلي عند وضعها في أقسام الإخراج المناسبة. الرموز التي يتم أخذ محاذاتها في الاعتبار هي ستة عشر بايت أو أكبر، وثمانية بايت، وأربعة بايت، واثنين من البايت، وبايت واحد. هذا لمنع وجود فجوات بين الرموز بسبب قيود المحاذاة. إذا لم يتم تحديد ترتيب الفرز، فسيتم افتراض الترتيب التنازلي.
--sort-section=name
سيقوم هذا الخيار بتطبيق "SORT_BY_NAME" على جميع أنماط أقسام الأحرف البدلة في برنامج الربط.
--sort-section=alignment
سيؤدي هذا الخيار إلى تطبيق "SORT_BY_ALIGNMENT" على جميع أنماط الأقسام ذات الأحرف البادئة في البرنامج النصي للارتباط.
--spare-dynamic-tags=count
يحدد هذا الخيار عدد الفتحات الفارغة التي يجب تركها في قسم .dynamic في كائنات ELF المشتركة. قد تكون الفتحات الفارغة ضرورية لأدوات المعالجة اللاحقة، مثل الارتباط المسبق. القيمة الافتراضية هي 5.
--split-by-file[=size]
على غرار --split-by-reloc، فإنه ينشئ قسم إخراج جديد لكل ملف إدخال عند الوصول إلى الحجم المحدد. الحجم الافتراضي هو 1 إذا لم يتم تحديده.
--split-by-reloc[=count]
يحاول إنشاء أقسام إضافية في ملف الإخراج بحيث لا يحتوي أي قسم إخراج واحد في الملف على أكثر من عدد عمليات إعادة التعيين. هذا مفيد عند إنشاء ملفات كبيرة قابلة لإعادة التعيين للتنزيل في بعض نوى الوقت الفعلي بتنسيق ملف الكائن COFF؛ نظرًا لأن COFF لا يمكن أن يمثل أكثر من 65535 عملية إعادة تعيين في قسم واحد. لاحظ أن هذا سيفشل في العمل مع تنسيقات ملفات الكائنات التي لا تدعم الأقسام التعسفية. لن يقوم الارتباط بتقسيم أقسام الإدخال الفردية لإعادة توزيعها، لذلك إذا كان قسم الإدخال واحد يحتوي على أكثر من عدد عمليات إعادة التعيين، فسيحتوي قسم الإخراج واحد على هذا العدد من عمليات إعادة التعيين. القيمة الافتراضية للعدد هي 32768.
--stats[=filename]
حساب وعرض إحصائيات حول تشغيل الارتباط، مثل وقت التنفيذ واستخدام الذاكرة.
إذا لم يتم توفير وسيطة اسم الملف الاختيارية، فسيتم الإبلاغ عن معلومات أساسية فقط، وسيتم إرسالها إلى دفق الإخراج القياسي. إذا تم توفير وسيطة اسم الملف، فسيتم كتابة معلومات موسعة في الملف المحدد. إذا تم تعيين اسم الملف فقط على الرمز، فسيتم إرسال المعلومات الموسعة إلى دفق الإخراج القياسي. إذا بدأ اسم الملف بـ +، فسيتم فتح الملف في وضع الإلحاق بدلاً من وضع الكتابة فوق.
إذا تم تمكين خيار -Map، فسيتم تسجيل المعلومات أيضًا في ملف الخريطة. ملاحظة: إذا تم إعطاء كل من خيار --stats وخيار -Map وسيطات أسماء ملفات وتطابقتا، فسيتم كتابة المعلومات مرة واحدة فقط وليس مرتين.
إذا تم تعريف متغير البيئة "LD_STATS"، فسيكون سلوكه مثل خيار --stats. إذا كانت قيمة المتغير عبارة عن سلسلة، فسيتم استخدامها كاسم ملف لتسجيل المعلومات فيه. خلاف ذلك، سيتم إرسال المعلومات إلى دفق الإخراج القياسي. يسمح استخدام متغير البيئة بتسجيل الإحصائيات دون الحاجة إلى تغيير سطر أوامر الارتباط. ملاحظة: إذا تم استخدام كل من متغير البيئة وخيار --stats، فإن خيار --stats له الأسبقية.
تتضمن المعلومات الموسعة التي تم الإبلاغ عنها وقت وحدة المعالجة المركزية المستخدم، وإذا كانت مكالمة نظام المكتبة getrusage() متاحة، فسيتم تسجيل استخدام الذاكرة أيضًا. يتم الإبلاغ عن هذه المعلومات لأجزاء فردية من عملية الارتباط يشار إليها باسم المراحل. بالإضافة إلى ذلك، يتم الإبلاغ عن المعلومات أيضًا لمرحلة خاصة تسمى ALL والتي تغطي عملية الارتباط بأكملها. لاحظ أنه يمكن أن تحتوي المراحل الفردية أو تتداخل مع بعضها البعض، لذلك لا ينبغي افتراض أن الموارد الإجمالية المستخدمة بواسطة الارتباط هي مجموع الموارد المستخدمة بواسطة المراحل الفردية.
بالإضافة إلى ذلك، عند الإبلاغ عن معلومات موسعة، يتم تضمين إصدار الرابط، ووسائط سطر الأوامر، ووقت بدء الرابط أيضًا. هذا يجعل من السهل التعامل مع الحالة التي يتم فيها استدعاء روابط متعددة بواسطة نظام بناء، وتحديد الوسائط التي كانت مسؤولة عن إنتاج الإحصائيات التي يتم الإبلاغ عنها.
يبدو الإخراج الموسع كما يلي:
الإحصائيات: إصدار الرابط: (GNU Binutils) 2.44.50.20250401
الإحصائيات: بدأ الرابط: الأربعاء، 2 أبريل 09:36:41 2025
الإحصائيات: الوسائط: ld -z norelro -z nomemory-seal -z no-separate-code -o a.out [...]
الإحصائيات: المرحلة وقت وحدة المعالجة المركزية الذاكرة وقت المستخدم وقت النظام
الإحصائيات: الاسم (ميكروثانية) (كيلو بايت) (ثواني) (ثواني)
الإحصائيات: الكل 390082 217740 0 0
الإحصائيات: معالجة ctf 12 0 0 0
الإحصائيات: دمج السلاسل 1324 0 0 0
الإحصائيات: التحليل 349 288 0 0
الإحصائيات: المكونات الإضافية 1 0 0 0
الإحصائيات: معالجة الملفات 259616 214524 0 0
الإحصائيات: الكتابة 116493 0 0 0
--no-stats
يعطل الإبلاغ عن إحصائيات الاستخدام، في حالة تم تمكينه عبر خيار سطر الأوامر --stats أو متغير البيئة LD_STATS.
--sysroot=directory
استخدم الدليل كموقع sysroot، مع إلغاء الإعداد الافتراضي في وقت التكوين. هذا الخيار مدعوم فقط من قبل الروابط التي تم تكوينها باستخدام --with-sysroot.
--task-link
يستخدم هذا الخيار بواسطة أهداف COFF/PE لإنشاء ملف كائن مرتبط بالمهمة حيث تم تحويل جميع الرموز العامة إلى متغيرات ثابتة.
--traditional-format
بالنسبة لبعض الأهداف، يختلف إخراج ld عن إخراج بعض الروابط الموجودة. يطلب هذا الخيار من ld استخدام التنسيق التقليدي بدلاً من ذلك.
على سبيل المثال، في SunOS، يقوم ld بدمج الإدخالات المكررة في جدول سلسلة الرموز. يمكن أن يقلل هذا من حجم ملف الإخراج بمعلومات تصحيح كاملة بأكثر من 30 بالمائة. لسوء الحظ، لا يمكن لبرنامج SunOS "dbx" قراءة البرنامج الناتج ("gdb" لا يواجه أي مشاكل). يخبر خيار --traditional-format ld بعدم دمج الإدخالات المكررة.
--section-start=sectionname=org
قم بتحديد موقع القسم في ملف الإخراج في العنوان المطلق المحدد بواسطة org. يمكنك استخدام هذا الخيار عدة مرات حسب الحاجة لتحديد مواقع أقسام متعددة في سطر الأوامر. يجب أن يكون org عددًا صحيحًا سداسيًا عشريًا واحدًا؛ للتوافق مع الروابط الأخرى، يمكنك حذف البادئة 0x المرتبطة عادةً بالأرقام الست عشرية. ملاحظة: يجب ألا يكون هناك مسافة بيضاء بين sectionname وعلامة المساواة (=) و org.
--image-base=org
عند استخدام ELF، يكون هذا الخيار مماثلاً لـ -Ttext-segment، وكلا الخيارين يحددان بشكل فعال عنوان الأساس للتنفيذ القابل للتشغيل ELF.
عند استخدام PE، استخدم القيمة كعنوان أساس لبرنامجك أو ملف DLL. هذا هو أقل موقع ذاكرة سيتم استخدامه عند تحميل برنامجك أو ملف DLL. لتقليل الحاجة إلى إعادة التعيين وتحسين أداء ملفات DLL الخاصة بك، يجب أن يكون لكل منها عنوان أساس فريد وألا يتداخل مع ملفات DLL الأخرى. القيمة الافتراضية هي 0x400000 للملفات التنفيذية، و 0x10000000 لملفات DLL.
-Tbss=org
-Tdata=org
-Ttext=org
نفس الخيار --section-start، مع تحديد ".bss" أو ".data" أو ".text" كاسم القسم.
-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 تغيير هذا إلى تحذير.
--dll-verbose
--verbose[=NUMBER]
اعرض رقم الإصدار الخاص بـ ld وسرد عمليات الربط المدعومة. اعرض الملفات المدخلة التي يمكن فتحها والتي لا يمكن فتحها. اعرض برنامج الربط الذي يستخدمه الرابط. إذا كانت القيمة الاختيارية NUMBER أكبر من 1، فسيتم أيضًا عرض حالة رمز المكون الإضافي.
--version-script=version-scriptfile
حدد اسم برنامج إصدار للرابط. يتم استخدام هذا عادةً عند إنشاء مكتبات مشتركة لتحديد معلومات إضافية حول التسلسل الهرمي للإصدار للمكتبة التي يتم إنشاؤها. هذا الخيار مدعوم بالكامل فقط على منصات ELF التي تدعم المكتبات المشتركة؛ انظر VERSION. وهو مدعوم جزئيًا على منصات PE، والتي يمكنها استخدام نصوص الإصدار لتصفية رؤية الرمز في الوضع التلقائي للتصدير: أي رموز يتم وضع علامة عليها على أنها محلية في نص الإصدار لن يتم تصديرها.
--warn-common
يحذر عندما يتم دمج رمز عام مع رمز عام آخر أو مع تعريف رمز.
تسمح أدوات الربط الخاصة بـ Unix بهذه الممارسة غير الدقيقة إلى حد ما، ولكن أدوات الربط الموجودة في بعض أنظمة التشغيل الأخرى لا تسمح بذلك.
يسمح هذا الخيار بالعثور على المشكلات المحتملة الناتجة عن دمج الرموز العامة.
لسوء الحظ، تستخدم بعض مكتبات C هذه الممارسة، لذلك قد تحصل على بعض التحذيرات حول الرموز الموجودة في المكتبات بالإضافة إلى الرموز الموجودة في برامجك.
هناك ثلاثة أنواع من الرموز العامة، موضحة هنا بأمثلة C:
int i = 1;
تعريف، يوضع في قسم البيانات المهيأة من الملف الناتج.
extern int i;
مرجع غير معرف، لا يخصص مساحة. يجب أن يكون هناك إما تعريف أو رمز عام للمتغير في مكان ما.
int i;
رمز عام. إذا كانت هناك (واحد أو أكثر) من الرموز العامة لمتغير، فإنه يوضع في منطقة البيانات غير المهيأة من الملف الناتج. يقوم أداة الربط بدمج رموز عامة متعددة لنفس المتغير في رمز واحد. إذا كانت مختلفة الأحجام، فإنه يختار الحجم الأكبر. تحول أداة الربط الرمز العام إلى تعريف، إذا كان هناك تعريف لنفس المتغير.
يمكن للخيار --warn-common أن ينتج خمسة أنواع من التحذيرات. يتكون كل تحذير من زوج من الأسطر: يصف السطر الأول الرمز الذي تمت مصادفته للتو، ويصف السطر الثاني الرمز السابق الذي تمت مصادفته بنفس الاسم. سيكون أحد الرمزين أو كلاهما رمزًا عامًا.
تحويل رمز عام إلى مرجع، لأنه يوجد بالفعل تعريف للرمز.
<file>(<section>): تحذير: رمز عام لـ `<symbol>'
تم استبداله بتعريف
<file>(<section>): تحذير: تم تعريفه هنا
تحويل رمز عام إلى مرجع، لأنه يتم مصادفة تعريف لاحق للرمز. هذا هو نفسه الحالة السابقة، باستثناء أن الرموز تتم مصادفتها بترتيب مختلف.
<file>(<section>): تحذير: تعريف لـ `<symbol>'
يستبدل الرمز العام
<file>(<section>): تحذير: الرمز العام موجود هنا
دمج رمز عام مع رمز عام سابق له نفس الحجم.
<file>(<section>): تحذير: رموز عامة متعددة
لـ `<symbol>'
<file>(<section>): تحذير: الرمز العام السابق موجود هنا
دمج رمز عام مع رمز عام سابق له حجم أكبر. هذا هو نفسه الحالة السابقة، باستثناء أن الرموز تتم مصادفتها بترتيب مختلف.
<file>(<section>): تحذير: رمز عام لـ `<symbol>'
تم استبداله برمز عام أكبر
<file>(<section>): تحذير: الرمز العام الأكبر موجود هنا
دمج رمز عام مع رمز عام سابق له حجم أصغر. هذا هو نفسه الحالة السابقة، باستثناء أن الرموز تتم مصادفتها بترتيب مختلف.
<file>(<section>): تحذير: يوجد رمز `<symbol>' شائع
يقوم بإلغاء الرمز الأصغر الشائع.
<file>(<section>): تحذير: الرمز الأصغر الشائع موجود هنا.
--warn-constructors
يحذر إذا تم استخدام أي مُنشئات عامة. هذا مفيد فقط لبعض تنسيقات ملفات الكائنات.
بالنسبة للتنسيقات مثل COFF أو ELF، لا يمكن للرابط تحديد استخدام المُنشئات العامة.
--warn-execstack
--warn-execstack-objects
--no-warn-execstack
على منصات ELF، قد يقوم الرابط بإنشاء رسائل تحذير إذا طُلب منه إنشاء ملف إخراج يحتوي على مكدس قابل للتنفيذ.
هناك ثلاث حالات ممكنة:
لا يتم إنشاء أي تحذيرات.
يتم إنشاء تحذيرات دائمًا، حتى إذا تم طلب مكدس قابل للتنفيذ عبر خيار سطر الأوامر `-z execstack`.
يتم إنشاء تحذير فقط إذا طلب ملف كائن مكدسًا قابلاً للتنفيذ، ولكن ليس إذا تم استخدام خيار `-z execstack`.
الحالة الافتراضية تعتمد على كيفية تكوين الرابط عند إنشائه. خيار `--no-warn-execstack` يضع الرابط دائمًا في حالة عدم وجود تحذيرات. خيار `--warn-execstack` يضع الرابط في حالة التحذير الدائم. خيار `--warn-execstack-objects` يضع الرابط في حالة التحذير لملفات الكائنات فقط.
ملاحظة: يمكن لملفات إدخال بتنسيق ELF تحديد أنها تحتاج إلى مكدس قابل للتنفيذ عن طريق وجود قسم `.note.GNU-stack` مع تعيين بت القابل للتنفيذ في علامات القسم. يمكنهم تحديد أنهم لا يحتاجون إلى مكدس قابل للتنفيذ عن طريق وجود نفس القسم، ولكن بدون تعيين بت القابل للتنفيذ. إذا لم يكن لدى ملف الإدخال قسم `.note.GNU-stack`، فإن السلوك الافتراضي خاص بالهدف. بالنسبة لبعض الأهداف، فإن عدم وجود قسم كهذا يعني أنه مطلوب مكدس قابل للتنفيذ. غالبًا ما تكون هذه مشكلة بالنسبة للملفات المجمعة يدويًا.
--error-execstack
--no-error-execstack
إذا كان الرابط سينشئ رسالة تحذير حول مكدس قابل للتنفيذ، فسيقوم خيار `--error-execstack` بدلاً من ذلك بتحويل هذا التحذير إلى خطأ. لاحظ - لا يغير هذا الخيار حالة إنشاء تحذيرات المكدس القابل للتنفيذ للرابط. استخدم `--warn-execstack` أو `--warn-execstack-objects` لتعيين حالة تحذير معينة.
سيقوم خيار `--no-error-execstack` باستعادة السلوك الافتراضي لإنشاء رسائل تحذير.
--warn-multiple-gp
يحذر إذا كانت هناك حاجة إلى قيم متعددة للمؤشر العام في ملف الإخراج. هذا ذو معنى فقط لمعالجات معينة، مثل Alpha. على وجه التحديد، تضع بعض المعالجات القيم الكبيرة في قسم خاص. يشير مسجل خاص (المؤشر العام) إلى منتصف هذا القسم، بحيث يمكن تحميل الثوابت بكفاءة باستخدام وضع عنونة النسبي للقاعدة. نظرًا لأن الإزاحة في وضع العنونة النسبية للقاعدة ثابتة وصغيرة نسبيًا (على سبيل المثال، 16 بت)، فهذا يحد من الحد الأقصى لحجم مجموعة الثوابت. وبالتالي، في البرامج الكبيرة، غالبًا ما يكون من الضروري استخدام قيم متعددة للمؤشر العام من أجل أن تكون قادرًا على معالجة جميع الثوابت الممكنة. يتسبب هذا الخيار في إصدار تحذير كلما حدث ذلك.
--warn-once
قم بإظهار تحذير واحد فقط لكل رمز غير معرف، بدلاً من تحذير لكل وحدة تشير إليه.
--warn-rwx-segments
--no-warn-rwx-segments
قم بإظهار تحذير إذا قام الرابط بإنشاء جزء قابل للتحميل، بحجم غير صفري، مع تعيين جميع علامات الأذونات الثلاث: القراءة والكتابة والتنفيذ. يمثل هذا الجزء ثغرة أمنية محتملة. بالإضافة إلى ذلك، سيتم إنشاء تحذيرات إذا تم إنشاء جزء لتخزين متغيرات خاصة بالموضوع مع تعيين علامة أذونات التنفيذ، بغض النظر عما إذا كانت لديه علامات القراءة و/أو الكتابة.
يتم تمكين هذه التحذيرات افتراضيًا. يمكن تعطيلها باستخدام الخيار `--no-warn-rwx-segments` وإعادة تمكينها باستخدام الخيار `--warn-rwx-segments`.
--error-rwx-segments
--no-error-rwx-segments
إذا كان الرابط سيقوم بإنشاء رسالة تحذير حول جزء قابل للتنفيذ أو جزء قابل للكتابة، أو جزء TLS قابل للتنفيذ، فإن الخيار `--error-rwx-segments` سيحول هذا التحذير إلى خطأ بدلاً من ذلك. سيقوم الخيار `--no-error-rwx-segments` باستعادة السلوك الافتراضي المتمثل في إنشاء رسالة تحذير فقط.
ملاحظة - لا يقوم الخيار `--error-rwx-segments` بمفرده بتشغيل التحذيرات حول هذه الأجزاء. يتم تمكين هذه التحذيرات افتراضيًا، إذا تم تكوين الرابط بهذه الطريقة، أو عبر خيار سطر الأوامر `--warn-rwx-segments`.
--warn-section-align
قم بإظهار تحذير إذا تم تغيير عنوان جزء الإخراج بسبب المحاذاة. عادةً، يتم تعيين المحاذاة بواسطة جزء الإدخال. لن يتم تغيير العنوان إلا إذا لم يتم تحديده بشكل صريح؛ أي، إذا لم يحدد أمر "SECTIONS" عنوان بداية للجزء.
--warn-textrel
قم بإظهار تحذير إذا أضاف الرابط DT\_TEXTREL إلى ملف قابل للتنفيذ مستقل عن الموضع أو كائن مشترك.
--warn-alternate-em
قم بإظهار تحذير إذا كان الكائن يحتوي على رمز آلة ELF بديل.
--warn-unresolved-symbols
إذا كان الرابط سيقوم بالإبلاغ عن رمز غير محلول (انظر الخيار `--unresolved-symbols`)، فإنه سيقوم عادةً بإنشاء خطأ. يقوم هذا الخيار بجعل الرابط يقوم بإنشاء تحذير بدلاً من ذلك.
--error-unresolved-symbols
يقوم هذا باستعادة السلوك الافتراضي للرابط المتمثل في إنشاء أخطاء عند الإبلاغ عن رموز غير محلولة.
--whole-archive
لكل أرشيف مذكور في سطر الأوامر بعد الخيار `--whole-archive`، قم بتضمين كل ملف كائن في الأرشيف في الربط، بدلاً من البحث في الأرشيف عن ملفات الكائن المطلوبة. عادةً ما يتم استخدام هذا لتحويل ملف أرشيف إلى مكتبة مشتركة، مما يجبر على تضمين كل كائن في المكتبة المشتركة الناتجة. يمكن استخدام هذا الخيار أكثر من مرة.
نقطتان يجب ملاحظتهما عند استخدام هذا الخيار من gcc: أولاً، لا يعرف gcc عن هذا الخيار، لذلك يجب عليك استخدام `-Wl,-whole-archive`. ثانيًا، لا تنسَ استخدام `-Wl,-no-whole-archive` بعد قائمة الأرشيفات الخاصة بك، لأن gcc سيضيف قائمة الأرشيفات الخاصة به إلى الربط الخاص بك وقد لا ترغب في أن يؤثر هذا العلم على تلك الأرشيفات أيضًا.
--wrap=symbol
استخدام دالة تغليف للرمز (symbol). أي مرجع غير معرف للرمز سيتم حله إلى "__wrap_symbol". أي مرجع غير معرف إلى "__real_symbol" سيتم حله إلى الرمز.
يمكن استخدام هذا لتوفير دالة تغليف لدالة نظام. يجب أن تسمى دالة التغليف "__wrap_symbol". إذا كانت ترغب في استدعاء دالة النظام، فيجب أن تستدعي "__real_symbol".
إليك مثال بسيط:
void *
__wrap_malloc (size_t c)
{
printf ("تم استدعاء malloc مع %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".
يتم استبدال المراجع غير المعرفة فقط بواسطة المرتبط. لذلك، لا يتم حل المراجع الداخلية لوحدة الترجمة إلى "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" ورأس قسم "PT_GNU_EH_FRAME" في ELF.
--no-ld-generated-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
قم بتعيين الحجم الافتراضي لجداول التجزئة الخاصة بالمرتبط إلى رقم أولي قريب من الرقم. يمكن أن يؤدي زيادة هذه القيمة إلى تقليل الوقت الذي يستغرقه المرتبط لإكمال مهامه، على حساب زيادة متطلبات ذاكرة المرتبط. وبالمثل، يمكن أن يؤدي تقليل هذه القيمة إلى تقليل متطلبات الذاكرة على حساب السرعة. القيمة الافتراضية هي 4051 في الظروف العادية و 1021 إذا تم استخدام خيار سطر الأوامر "--reduce-memory-overheads".
--hash-style=style
يحدد نوع جدول التجزئة الخاص بالمُوصِّل. يمكن أن يكون "sysv" لنمط ELF الكلاسيكي ".hash"، أو "gnu" لنمط GNU الجديد ".gnu.hash"، أو "both" لكل من جدولي التجزئة الكلاسيكي ELF ".hash" و GNU الجديد ".gnu.hash". يعتمد الوضع الافتراضي على كيفية تكوين المُوصِّل، ولكن بالنسبة لمعظم أنظمة Linux، سيكون "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 ويعيد تسميتها بحيث تبدأ بـ ".zdebug" بدلاً من ".debug". يضغط --compress-debug-sections=zlib-gabi أيضًا مقاطع تصحيح الأخطاء DWARF، ولكنه بدلاً من إعادة تسميتها، فإنه يعين علامة SHF_COMPRESSED في رؤوس المقاطع.
الخيار --compress-debug-sections=zlib هو اسم مستعار للخيار --compress-debug-sections=zlib-gabi.
--compress-debug-sections=zstd يضغط مقاطع تصحيح الأخطاء DWARF باستخدام zstd.
لاحظ أن هذا الخيار يتجاوز أي ضغط في مقاطع تصحيح الأخطاء المدخلة، لذلك إذا تم ربط ملف ثنائي باستخدام --compress-debug-sections=none، على سبيل المثال، فسيتم إلغاء ضغط أي مقاطع تصحيح أخطاء مضغوطة في الملفات المدخلة قبل نسخها في الملف الثنائي الناتج.
يختلف سلوك الضغط الافتراضي اعتمادًا على الهدف وخيارات التهيئة المستخدمة لبناء سلسلة الأدوات. يمكن تحديد الوضع الافتراضي عن طريق فحص الإخراج من خيار --help الخاص بالمُوصِّل.
--reduce-memory-overheads
يقلل هذا الخيار من متطلبات الذاكرة في وقت تشغيل المُوصِّل، على حساب سرعة الربط. تم تقديمه لتحديد الخوارزمية القديمة ذات التعقيد الزمني O(n^2) لإنشاء ملف خريطة الربط، بدلاً من الخوارزمية الجديدة ذات التعقيد الزمني O(n) التي تستخدم حوالي 40٪ ذاكرة إضافية لتخزين الرموز.
تأثير آخر لهذا الخيار هو تعيين الحجم الافتراضي لجدول التجزئة إلى 1021، مما يوفر الذاكرة على حساب إطالة وقت تشغيل المُوصِّل. ومع ذلك، لا يتم ذلك إذا تم استخدام خيار --hash-size.
يمكن أيضًا استخدام الخيار --reduce-memory-overheads لتمكين مقايضات أخرى في الإصدارات المستقبلية من المُوصِّل.
--max-cache-size=size
يقوم ld بتخزين معلومات إعادة التحديد وجداول الرموز للملفات المدخلة في الذاكرة بحجم غير محدود عادةً. يحدد هذا الخيار الحد الأقصى لحجم ذاكرة التخزين المؤقت إلى الحجم المحدد. ملاحظة - إذا تم استخدام خيار سطر الأوامر --no-keep-memory، فسيتصرف المُوصِّل كما لو تم تعيين الحد الأقصى لحجم ذاكرة التخزين المؤقت إلى 0 - أي لا يتم الاحتفاظ بأي شيء.
--build-id
--build-id=style
يطلب إنشاء قسم ELF ذي الملاحظة ".note.gnu.build-id" أو قسم COFF ".buildid". يحتوي المحتوى الموجود في الملاحظة على بتات فريدة تحدد هذا الملف المرتبط. يمكن أن يكون النمط "uuid" لاستخدام 128 بتًا عشوائيًا؛ أو "sha1" لاستخدام تجزئة SHA1 المكونة من 160 بت؛ أو "md5" لاستخدام تجزئة MD5 المكونة من 128 بت؛ أو "xx" لاستخدام تجزئة XXHASH المكونة من 128 بت على الأجزاء القياسية من محتوى الإخراج؛ أو "0xhexstring" لاستخدام سلسلة بتات تم اختيارها والمحددة كسلسلة سداسية عشرية ذات عدد زوجي من الأرقام (يتم تجاهل الأحرف "-" و ":" بين أزواج الأرقام). إذا تم حذف النمط، فسيتم استخدام "sha1".
تنتج الأنماط "md5" و "sha1" و "xx" معرفًا يكون دائمًا هو نفسه في ملف الإخراج المتطابق، ولكنه فريد تقريبًا بين جميع ملفات الإخراج غير المتطابقة. لا يُقصد استخدامه للمقارنة كملخص لمحتويات الملف. قد يتم تغيير ملف مرتبط لاحقًا بواسطة أدوات أخرى، ولكن سلسلة بتات معرف الإنشاء التي تحدد الملف المرتبط الأصلي لا تتغير.
يمكّن تمرير "none" للمعامل "style" تعطيل الإعداد من أي خيارات "--build-id" تم تحديدها مسبقًا في سطر الأوامر.
--package-metadata=JSON
يطلب إنشاء قسم ملاحظات ELF ".note.package". تكون محتويات الملاحظة بتنسيق JSON، كما هو محدد في مواصفات بيانات التعريف الخاصة بالحزمة. لمزيد من المعلومات، راجع: https://systemd.io/ELF_PACKAGE_METADATA/. يدعم وسيط JSON ترميز النسبة المئوية والترميزات التالية %[string] (حيث يشير "string" إلى الاسم في مراجع الأحرف المسماة في HTML): %[comma] لـ "،"، %[lbrace] لـ "{"، %[quot] لـ '"'، %[rbrace] لـ "}"، و %[space] لحرف المسافة. إذا كان وسيط JSON مفقودًا أو فارغًا، فسيؤدي ذلك إلى تعطيل إنشاء قسم الملاحظات، إذا كان قد تم تمكينه بواسطة ظهور سابق لخيار --package-metadata. إذا تم تجميع الرابط باستخدام libjansson، فسيتم التحقق من صحة سلسلة JSON.
يدعم رابط i386 PE خيار "-shared"، والذي يتسبب في أن يكون الإخراج مكتبة مرتبطة ديناميكيًا (DLL) بدلاً من ملف تنفيذي عادي. يجب أن تقوم بتسمية الإخراج "*.dll" عند استخدام هذا الخيار. بالإضافة إلى ذلك، يدعم الرابط ملفات "*.def" القياسية بالكامل، والتي يمكن تحديدها في سطر أوامر الرابط مثل ملف كائن (في الواقع، يجب أن يسبق الأرشيفات التي يقوم بتصدير الرموز منها، لضمان ربطها، تمامًا مثل ملف كائن عادي).
بالإضافة إلى الخيارات الشائعة لجميع الأهداف، يدعم رابط i386 PE خيارات إضافية لسطر الأوامر خاصة بهدف i386 PE. يمكن فصل الخيارات التي تأخذ قيمًا عن قيمها إما بمسافة أو بعلامة يساوي.
--add-stdcall-alias
إذا تم تحديده، فسيتم تصدير الرموز التي تحتوي على لاحقة stdcall (@nn) كما هي وأيضًا مع إزالة اللاحقة. [هذا الخيار خاص بمنفذ الرابط الذي يستهدف i386 PE].
--base-file file
استخدم الملف المحدد كاسم للملف الذي سيتم فيه حفظ العناوين الأساسية لجميع عمليات إعادة التوطين المطلوبة لإنشاء DLLs باستخدام dlltool. [هذا خيار خاص بـ i386 PE].
--dll
قم بإنشاء DLL بدلاً من ملف تنفيذي عادي. يمكنك أيضًا استخدام -shared أو تحديد "LIBRARY" في ملف ".def" معين. [هذا الخيار خاص بمنفذ الرابط الذي يستهدف i386 PE].
--enable-long-section-names
--disable-long-section-names
تضيف متغيرات PE لتنسيق كائن COFF امتدادًا يسمح باستخدام أسماء أقسام أطول من ثمانية أحرف، وهو الحد الطبيعي لتنسيق COFF. افتراضيًا، يُسمح بهذه الأسماء فقط في ملفات الكائنات، نظرًا لأن الصور القابلة للتنفيذ المرتبطة بالكامل لا تحمل جدول سلاسل COFF المطلوب لدعم الأسماء الأطول. كتوسيع GNU، من الممكن السماح باستخدامها في الصور القابلة للتنفيذ أيضًا، أو (ربما بلا فائدة!) حظرها في ملفات الكائنات، باستخدام هذين الخيارين. الصور القابلة للتنفيذ التي تم إنشاؤها بهذه الأسماء الطويلة للأقسام هي صور غير قياسية إلى حد ما، حيث أنها تحمل جدول سلاسل، وقد تولد مخرجات مربكة عند فحصها باستخدام أدوات غير GNU تدعم PE، مثل عارضات الملفات وأدوات التفريغ. ومع ذلك، تعتمد GDB على استخدام أسماء أقسام PE الطويلة للعثور على أقسام معلومات التصحيح Dwarf-2 في صورة قابلة للتنفيذ في وقت التشغيل، لذلك إذا لم يتم تحديد أي من الخيارين في سطر الأوامر، فسوف يقوم ld بتمكين أسماء الأقسام الطويلة، مع تجاوز السلوك الافتراضي والصحي تقنيًا، عندما يجد وجود معلومات تصحيح أثناء ربط صورة قابلة للتنفيذ وعدم تجريد الرموز. [هذا الخيار صالح لجميع منافذ أداة الربط التي تستهدف PE]
--enable-stdcall-fixup
--disable-stdcall-fixup
إذا وجدت أداة الربط رمزًا لا يمكنها حله، فسوف تحاول إجراء "ربط غامض" من خلال البحث عن رمز آخر معرف يختلف فقط في تنسيق اسم الرمز (cdecl مقابل stdcall) وستقوم بحل هذا الرمز عن طريق الارتباط بالمطابقة. على سبيل المثال، قد يتم ربط الرمز غير المعرف "_foo" بالدالة "_foo@12"، أو قد يتم ربط الرمز غير المعرف "_bar@16" بالدالة "_bar". عندما تقوم أداة الربط بذلك، فإنها تطبع تحذيرًا، نظرًا لأنه من المفترض أن تفشل في الربط بشكل طبيعي، ولكن في بعض الأحيان قد تحتاج مكتبات الاستيراد التي تم إنشاؤها من مكتبات DLL التابعة لجهات خارجية إلى تمكين هذه الميزة لكي تكون قابلة للاستخدام. إذا قمت بتحديد --enable-stdcall-fixup، فسيتم تمكين هذه الميزة بالكامل ولن يتم طباعة أي تحذيرات. إذا قمت بتحديد --disable-stdcall-fixup، فسيتم تعطيل هذه الميزة وسيتم اعتبار هذه المطابقات أخطاء. [هذا الخيار خاص بمنفذ أداة الربط الذي يستهدف i386 PE]
--leading-underscore
--no-leading-underscore
بالنسبة لمعظم الأهداف، فإن بادئة الرمز الافتراضية هي شرطة سفلية، ويتم تعريفها في وصف الهدف. باستخدام هذا الخيار، من الممكن تعطيل/تمكين بادئة الرمز الافتراضية.
--export-all-symbols
إذا تم تحديده، فسيتم تصدير جميع الرموز العامة في الكائنات المستخدمة لإنشاء DLL. لاحظ أن هذا هو الإعداد الافتراضي إذا لم يكن هناك أي رموز يتم تصديرها بخلاف ذلك. عندما يتم تصدير الرموز بشكل صريح عبر ملفات DEF أو بشكل ضمني عبر سمات الدالة، فإن الإعداد الافتراضي هو عدم تصدير أي شيء آخر ما لم يتم تحديد هذا الخيار. لاحظ أن الرموز "DllMain@12" و "DllEntryPoint@0" و "DllMainCRTStartup@12" و "impure_ptr" لن يتم تصديرها تلقائيًا. بالإضافة إلى ذلك، لن يتم إعادة تصدير الرموز المستوردة من مكتبات DLL الأخرى، ولا الرموز التي تحدد التخطيط الداخلي لـ DLL مثل تلك التي تبدأ بـ "_head_" أو تنتهي بـ "_iname". بالإضافة إلى ذلك، لن يتم تصدير أي رموز من "libgcc" أو "libstd++" أو "libmingw32" أو "crtX.o". لن يتم تصدير الرموز التي تبدأ أسماؤها بـ "__rtti_" أو "__builtin_"، للمساعدة في مكتبات DLL C++. أخيرًا، هناك قائمة واسعة من الرموز الخاصة بـ Cygwin التي لا يتم تصديرها (وبديهي، هذا ينطبق عند إنشاء DLLs لأهداف 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 رمز،رمز،...
يحدد قائمة بالرموز التي يجب ألا يتم تصديرها تلقائيًا. يمكن تحديد أسماء الرموز بفواصل أو نقطتين. [هذا الخيار خاص بمنفذ الرابط الذي يستهدف i386 PE]
--exclude-all-symbols
يحدد أنه لا ينبغي تصدير أي رموز تلقائيًا. [هذا الخيار خاص بمنفذ الرابط الذي يستهدف i386 PE]
--file-alignment
يحدد محاذاة الملف. ستبدأ الأقسام في الملف دائمًا عند إزاحات الملف التي تكون مضاعفات لهذا الرقم. بشكل افتراضي، يكون هذا 512. [هذا الخيار خاص بمنفذ الرابط الذي يستهدف i386 PE]
--heap reserve
--heap reserve,commit
يحدد عدد البايتات من الذاكرة التي يجب حجزها (وإلغاء تخصيصها اختياريًا) لاستخدامها كذاكرة مكدسة لهذا البرنامج. بشكل افتراضي، يتم حجز 1 ميجابايت، وإلغاء تخصيص 4 كيلوبايت. [هذا الخيار خاص بمنفذ الرابط الذي يستهدف i386 PE]
--kill-at
إذا تم إعطاؤه، فسيتم تجريد اللاحقات stdcall (@nn) من الرموز قبل تصديرها. [هذا الخيار خاص بمنفذ الرابط الذي يستهدف i386 PE]
--large-address-aware
إذا تم إعطاؤه، فسيتم تعيين البت المناسب في حقل "الخصائص" في رأس COFF للإشارة إلى أن هذا الملف القابل للتنفيذ يدعم العناوين الافتراضية الأكبر من 2 جيجابايت. يجب استخدام هذا بالتزامن مع مفتاح "/3GB" أو "/USERVA=value ميجابايت" في قسم "[أنظمة التشغيل]" من ملف BOOT.INI. وإلا، فلن يكون لهذا البت أي تأثير. [هذا الخيار خاص بمنافذ الرابط التي تستهدف PE]
--disable-large-address-aware
يعكس تأثير خيار "--large-address-aware" السابق. هذا مفيد إذا تم دائمًا تعيين "--large-address-aware" بواسطة برنامج تشغيل المترجم (مثل Cygwin gcc) ولا يدعم الملف القابل للتنفيذ عناوين افتراضية أكبر من 2 جيجابايت. [هذا الخيار خاص بمنافذ الرابط التي تستهدف PE]
--major-image-version قيمة
يحدد الرقم الرئيسي لـ "إصدار الصورة". بشكل افتراضي، يكون 1. [هذا الخيار خاص بمنفذ الرابط الذي يستهدف i386 PE]
--major-os-version القيمة
يحدد الرقم الرئيسي لـ "إصدار نظام التشغيل". القيمة الافتراضية هي 4. [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
--major-subsystem-version القيمة
يحدد الرقم الرئيسي لـ "إصدار النظام الفرعي". القيمة الافتراضية هي 4. [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
--minor-image-version القيمة
يحدد الرقم الثانوي لـ "إصدار الصورة". القيمة الافتراضية هي 0. [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
--minor-os-version القيمة
يحدد الرقم الثانوي لـ "إصدار نظام التشغيل". القيمة الافتراضية هي 0. [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
--minor-subsystem-version القيمة
يحدد الرقم الثانوي لـ "إصدار النظام الفرعي". القيمة الافتراضية هي 0. [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
--output-def الملف
سينشئ الرابط الملف المحدد، والذي سيحتوي على ملف DEF مطابق لمكتبة الارتباط الديناميكي (DLL) التي يقوم الرابط بإنشائها. يمكن استخدام ملف DEF هذا (الذي يجب أن يسمى "*.def") لإنشاء مكتبة استيراد باستخدام "dlltool" أو يمكن استخدامه كمرجع للرموز المصدرة أو المستوردة ضمنيًا. [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
--enable-auto-image-base
--enable-auto-image-base=القيمة
اختر تلقائيًا قاعدة الصورة لمكتبات الارتباط الديناميكي (DLLs)، مع إمكانية البدء بالقيمة المحددة، ما لم يتم تحديد قاعدة باستخدام وسيطة "--image-base". من خلال استخدام قيمة تجزئة تم إنشاؤها من اسم مكتبة الارتباط الديناميكي (DLL) لإنشاء قواعد صور فريدة لكل مكتبة ارتباط ديناميكي (DLL)، يتم تجنب التصادمات في الذاكرة وعمليات إعادة التوطين التي يمكن أن تؤخر تنفيذ البرنامج. [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
--disable-auto-image-base
لا تقم بإنشاء قاعدة صورة فريدة تلقائيًا. إذا لم يتم تحديد قاعدة صورة محددة بواسطة المستخدم ("--image-base")، فاستخدم الإعداد الافتراضي للنظام الأساسي. [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
--dll-search-prefix السلسلة
عند الارتباط ديناميكيًا بمكتبة ارتباط ديناميكي (DLL) بدون مكتبة استيراد، ابحث عن "<السلسلة><اسم_الأساس>.dll" بدلاً من "lib<اسم_الأساس>.dll". يسمح هذا السلوك بالتمييز بسهولة بين مكتبات الارتباط الديناميكي (DLLs) التي تم إنشاؤها لمختلف "الأنظمة الفرعية": الأصلية، Cygwin، UWin، PW، إلخ. على سبيل المثال، تستخدم مكتبات الارتباط الديناميكي (DLLs) الخاصة بـ Cygwin عادةً "--dll-search-prefix=cyg". [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
--enable-auto-import
قم بإجراء ارتباط متطور لـ "_symbol" بـ "\_\_imp\_\_symbol" لاستيراد البيانات من مكتبات الارتباط الديناميكي (DLLs)، وبالتالي يمكن تجاوز آلية "dllimport" من جانب المستخدم والإشارة إلى أسماء الرموز غير المعالجة. [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
تنطبق الملاحظات التالية على التنفيذ الأصلي للميزة وهي قديمة اليوم لأنظمة Cygwin و MinGW.
ملاحظة: سيؤدي استخدام امتداد "auto-import" إلى جعل قسم النص من ملف الصورة قابلاً للكتابة. هذا لا يتوافق مع مواصفات تنسيق PE-COFF التي نشرتها Microsoft.
ملحوظة - سيؤدي استخدام ملحق "الاستيراد التلقائي" أيضًا إلى جعل البيانات للقراءة فقط والتي عادةً ما توضع في قسم .rdata يتم وضعها في قسم .data بدلاً من ذلك. هذا من أجل التغلب على مشكلة الثوابت الموصوفة هنا:
http://www.cygwin.com/ml/cygwin/2004-09/msg01101.html
عادةً ما "سيعمل" استخدام "الاستيراد التلقائي" - ولكن في بعض الأحيان قد ترى هذه الرسالة:
"لا يمكن استيراد المتغير '<var>' تلقائيًا. يرجى قراءة الوثائق الخاصة بخيار "--enable-auto-import" الخاص بـ ld لمزيد من التفاصيل."
تحدث هذه الرسالة عندما يصل بعض التعبيرات (أو التعبيرات الفرعية) إلى عنوان يتم الحصول عليه في النهاية عن طريق جمع ثابتين (تسمح جداول استيراد Win32 بواحد فقط). تتضمن الحالات التي قد تحدث فيها هذه المشكلة الوصول إلى حقول متغيرات الهياكل المستوردة من ملف DLL، بالإضافة إلى استخدام فهرس ثابت في متغير مصفوفة مستورد من ملف DLL. أي متغير متعدد الكلمات (المصفوفات، الهياكل، long long، إلخ) قد يؤدي إلى ظهور هذا الخطأ. ومع ذلك، بغض النظر عن نوع البيانات المحدد للمتغير المصدر، فسيكتشف ld ذلك دائمًا، ويصدر التحذير، ويخرج.
هناك عدة طرق لمعالجة هذه الصعوبة، بغض النظر عن نوع البيانات للمتغير المصدر:
إحدى الطرق هي استخدام خيار "--enable-runtime-pseudo-reloc". هذا يترك مهمة تعديل المراجع في التعليمات البرمجية الخاصة بك للبيئة وقت التشغيل، لذلك تعمل هذه الطريقة فقط عندما تدعم بيئة وقت التشغيل هذه الميزة.
الحل الثاني هو إجبار أحد "الثوابت" على أن يكون متغيرًا - أي غير معروف وغير قابل للتحسين في وقت الترجمة. بالنسبة للمصفوفات، هناك احتمالان: أ) جعل الفهرس (عنوان المصفوفة) متغيرًا، أو ب) جعل "الفهرس الثابت" متغيرًا. وبالتالي:
extern type extern_array[];
extern_array[1] -->
{ volatile type *t=extern_array; t[1] }
أو
extern type extern_array[];
extern_array[1] -->
{ volatile int t=1; extern_array[t] }
بالنسبة للهياكل (ومعظم أنواع البيانات متعددة الكلمات الأخرى)، فإن الخيار الوحيد هو جعل الهيكل نفسه (أو long long، أو ...) متغيرًا:
extern struct s extern_struct;
extern_struct.field -->
{ volatile struct s *t=&extern_struct; t->field }
أو
extern long long extern_ll;
extern_ll -->
{ volatile long long * local_ll=&extern_ll; *local_ll }
الطريقة الثالثة للتعامل مع هذه الصعوبة هي التخلي عن "الاستيراد التلقائي" للرمز المخالف ووضع علامة عليه باستخدام "__declspec(dllimport)". ومع ذلك، في الممارسة العملية، يتطلب ذلك استخدام تعريفات وقت الترجمة (#defines) للإشارة إلى ما إذا كنت تقوم ببناء ملف DLL، أو تقوم ببناء تعليمات برمجية للعميل التي سترتبط بملف DLL، أو تقوم ببناء/ربط مكتبة ثابتة. عند اتخاذ القرار بين الطرق المختلفة لحل مشكلة "العنوان المباشر مع إزاحة ثابتة"، يجب أن تفكر في الاستخدام النموذجي الواقعي:
الأصل:
--foo.h
extern int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
printf("%d\n",arr[1]);
}
الحل 1:
--foo.h
extern int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
/* هذا الحل هو لتجنب مشاكل في نظامي التشغيل Win32 و Cygwin؛ لا تقم "بالتحسين" */
volatile int *parr = arr;
printf("%d\n",parr[1]);
}
الحل 2:
--foo.h
/* ملاحظة: يتم افتراض التصدير التلقائي (لا يوجد __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" لاستيراد البيانات من ملفات DLL. [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
--enable-runtime-pseudo-reloc
إذا كان الكود الخاص بك يحتوي على تعبيرات موصوفة في قسم --enable-auto-import، أي استيراد البيانات من ملف DLL مع إزاحة غير صفرية، فسيؤدي هذا الخيار إلى إنشاء متجه من "إعادة التوطين الزائفة في وقت التشغيل" والتي يمكن استخدامها بواسطة بيئة وقت التشغيل لضبط المراجع إلى هذه البيانات في الكود الخاص بك. [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
--disable-runtime-pseudo-reloc
لا تقم بإنشاء عمليات إعادة توطين زائفة لاستيراد البيانات ذات الإزاحة غير الصفرية من ملفات DLL. [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
--enable-extra-pe-debug
عرض معلومات تصحيح إضافية متعلقة بالارتباط التلقائي للرموز. [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
--section-alignment
يحدد محاذاة القسم. ستبدأ الأقسام دائمًا في الذاكرة في عناوين هي مضاعفات لهذا الرقم. الافتراضي هو 0x1000. [هذا الخيار خاص بمنفذ الرابط المستهدف i386 PE]
--stack reserve
--stack reserve,commit
حدد عدد البايتات من الذاكرة التي سيتم حجزها (وربما تخصيصها) لاستخدامها كذاكرة مكدس لهذا البرنامج. الافتراضي هو 2 ميجابايت محجوزة، و 4 كيلو بايت مخصصة. [هذا الخيار خاص بمنفذ الرابط المستهدف 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
الصورة متوافقة مع تخطيط عشوائي لمساحة العناوين 64 بت (ASLR). هذا الخيار مفعل افتراضيًا لصور PE ذات 64 بت في أهداف MinGW.
هذا الخيار يعني أيضًا --dynamicbase و --enable-reloc-section.
--dynamicbase
--disable-dynamicbase
يمكن نقل عنوان قاعدة الصورة باستخدام الترتيب العشوائي لمساحة العناوين (ASLR). تم تقديم هذه الميزة مع نظام التشغيل MS Windows Vista لأهداف PE i386. هذا الخيار مفعل افتراضيًا لأهداف MinGW ولكن يمكن تعطيله عبر الخيار --disable-dynamicbase. هذا الخيار يعني أيضًا --enable-reloc-section.
--forceinteg
--disable-forceinteg
يتم فرض عمليات التحقق من تكامل التعليمات البرمجية. هذا الخيار معطل افتراضيًا.
--nxcompat
--disable-nxcompat
الصورة متوافقة مع ميزة منع تنفيذ البيانات (DEP). تم تقديم هذه الميزة مع MS Windows XP SP2 لأهداف PE i386. الخيار مفعل افتراضيًا لأهداف MinGW.
--no-isolation
--disable-no-isolation
على الرغم من أن الصورة تفهم العزل، إلا أنه لا ينبغي عزل الصورة. هذا الخيار معطل افتراضيًا.
--no-seh
--disable-no-seh
لا تستخدم الصورة SEH. لا يمكن استدعاء أي معالج SE من هذه الصورة. هذا الخيار معطل افتراضيًا.
--no-bind
--disable-no-bind
لا تقم بربط هذه الصورة. هذا الخيار معطل افتراضيًا.
--wdmdriver
--disable-wdmdriver
يستخدم برنامج التشغيل نموذج برنامج التشغيل MS Windows. هذا الخيار معطل افتراضيًا.
--tsaware
--disable-tsaware
الصورة متوافقة مع Terminal Server. هذا الخيار معطل افتراضيًا.
--insert-timestamp
--no-insert-timestamp
أدخل طابعًا زمنيًا حقيقيًا في الصورة. هذا هو السلوك الافتراضي لأنه يتطابق مع التعليمات البرمجية القديمة ويعني أن الصورة ستعمل مع أدوات أخرى خاصة. المشكلة في هذا الافتراضي هي أنه سينتج عنه صور مختلفة قليلاً في كل مرة يتم فيها ربط نفس المصادر. يمكن استخدام الخيار --no-insert-timestamp لإدخال قيمة صفرية للطابع الزمني، مما يضمن أن الملفات الثنائية التي تم إنتاجها من مصادر متطابقة ستكون متطابقة.
إذا كان الخيار --insert-timestamp نشطًا، فإن الوقت الذي يتم إدخاله هو إما الوقت الذي يتم فيه الربط
أو، إذا تم تحديد متغير البيئة "SOURCE_DATE_EPOCH"، فإن عدد الثواني منذ حقبة Unix كما هو محدد في هذا المتغير.
--enable-reloc-section
--disable-reloc-section
إنشاء جدول إعادة التوطين الأساسي، وهو أمر ضروري إذا تم تحميل الصورة في عنوان أساس صورة مختلف عن العنوان المحدد في رأس PE. هذا الخيار مفعل افتراضيًا.
يستخدم هدف C6X uClinux تنسيقًا ثنائيًا يسمى DSBT لدعم المكتبات المشتركة. تحتاج كل مكتبة مشتركة في النظام إلى الحصول على فهرس فريد؛ تستخدم جميع الملفات التنفيذية فهرسًا بقيمة 0.
--dsbt-size size
يقوم هذا الخيار بتعيين عدد الإدخالات في DSBT للملف التنفيذي أو المكتبة المشتركة الحالية إلى الحجم. الإعداد الافتراضي هو إنشاء جدول يحتوي على 64 إدخالًا.
--dsbt-index index
يحدد هذا الخيار فهرس DSBT للملف التنفيذي أو المكتبة المشتركة الحالية إلى القيمة index. القيمة الافتراضية هي 0، وهو ما يناسب إنشاء الملفات التنفيذية. إذا تم إنشاء مكتبة مشتركة بفهرس DSBT بقيمة 0، فسيتم نسخ عمليات إعادة التعيين "R_C6000_DSBT_INDEX" في ملف الإخراج.
--no-merge-exidx-entries
يعطل هذا الخيار دمج إدخالات exidx المتجاورة في معلومات فك تشابك الإطار.
--branch-stub
يمكّن هذا الخيار استرخاء الفروع في الرابط عن طريق إدراج أقسام فروع عند الحاجة لتوسيع نطاق الفروع. عادةً لا يكون هذا الخيار مطلوبًا لأن C-SKY يدعم تعليمات الفروع والاستدعاء التي يمكنها الوصول إلى النطاق الكامل للذاكرة، ويتم التعامل مع استرخاء الفروع عادةً بواسطة المترجم أو المجمع.
--stub-group-size=N
يسمح هذا الخيار بتحكم أدق في إنشاء أقسام فروع الرابط. يقوم بتعيين الحد الأقصى لحجم مجموعة من أقسام الإدخال التي يمكن التعامل معها بواسطة قسم فرعي واحد. يؤدي وجود قيمة سالبة لـ N إلى وضع أقسام الفروع بعد الفروع الخاصة بها، بينما يسمح وجود قيمة موجبة بوضع أقسام الفروع إما قبل الفروع أو بعدها. تشير القيم 1 أو -1 إلى أن الرابط يجب أن يختار الإعدادات الافتراضية المناسبة.
تدعم روابط 68HC11 و 68HC12 خيارات محددة للتحكم في تعيين تبديل بنك الذاكرة وإنشاء التعليمات البرمجية المؤقتة.
--no-trampoline
يعطل هذا الخيار إنشاء التعليمات البرمجية المؤقتة. افتراضيًا، يتم إنشاء تعليمات برمجية مؤقتة لكل وظيفة بعيدة يتم استدعاؤها باستخدام تعليمات "jsr" (يحدث هذا عندما يتم الحصول على مؤشر إلى وظيفة بعيدة).
--bank-window name
يشير هذا الخيار إلى الرابط باسم منطقة الذاكرة في مواصفة الذاكرة التي تصف نافذة بنك الذاكرة. ثم يستخدم الرابط تعريف هذه المنطقة لحساب الترقيم والتحويلات داخل نافذة الذاكرة.
يتم دعم الخيارات التالية للتحكم في إنشاء GOT عند الربط لأهداف 68K.
--got=type
يخبر هذا الخيار الرابط بنظام إنشاء GOT الذي سيتم استخدامه. يجب أن يكون type أحد القيم التالية: single أو negative أو multigot أو target. للحصول على مزيد من المعلومات، راجع إدخال Info الخاص بـ ld.
يتم دعم الخيارات التالية للتحكم في إنشاء تعليمات microMIPS والتحقق من إعادة تعيين الفروع للانتقالات بين أوضاع ISA عند الربط لأهداف MIPS.
--insn32
--no-insn32
تتحكم هذه الخيارات في اختيار تعليمات microMIPS المستخدمة في التعليمات البرمجية التي ينشئها الرابط، مثل تلك الموجودة في PLT أو عمليات الربط الكسول، أو في عملية الاسترخاء. إذا تم استخدام --insn32، فسيستخدم الرابط فقط ترميزات تعليمات 32 بت. افتراضيًا أو إذا تم استخدام --no-insn32، يتم استخدام جميع ترميزات التعليمات، بما في ذلك تلك ذات 16 بت حيثما أمكن ذلك.
--ignore-branch-isa
--no-ignore-branch-isa
تتحكم هذه الخيارات في عمليات التحقق من إعادة تعيين الفروع للانتقالات غير الصالحة بين أوضاع ISA. إذا تم استخدام --ignore-branch-isa، فسيقبل الرابط أي عمليات إعادة تعيين للفروع، وسيتم فقدان أي انتقال بين أوضاع ISA مطلوب في عملية إعادة التعيين، باستثناء بعض حالات تعليمات "BAL" التي تفي بشروط الاسترخاء ويتم تحويلها إلى تعليمات "JALX" مكافئة حيث يتم حساب عملية إعادة التعيين المرتبطة. افتراضيًا أو إذا تم استخدام --no-ignore-branch-isa، يتم إجراء فحص مما يتسبب في فقدان انتقال بين أوضاع ISA مما يؤدي إلى حدوث خطأ.
--compact-branches
--no-compact-branches
تتحكم هذه الخيارات في إنشاء تعليمات مضغوطة بواسطة الرابط في إدخالات PLT لـ MIPS R6.
بالنسبة للهدف pdp11-aout، يمكن إنشاء ثلاثة متغيرات من تنسيق الإخراج يتم تحديدها بواسطة خيارات التالى: المتغير الافتراضي لـ pdp11-aout هو خيار --omagic، بينما بالنسبة للهدف الأخرى --nmagic هو الافتراضي. يتم تعريف خيار --imagic فقط للهدف pdp11-aout، بينما يتم وصف الخيارات الأخرى هنا كما يتم تطبيقها على هدف pdp11-aout.
-N
--omagic
ضع علامة على الإخراج كـ "OMAGIC" (0407) في رأس a.out للإشارة إلى أن جزء النص ليست محمية للكتابة ويتم مشاركتها. نظرًا لأن قسمي النص والبيانات قابلان للقراءة والكتابة، يتم تخصيص قسم البيانات على الفور بجوار قسم النص. هذا هو أقدم تنسيق لبرامج PDP11 القابلة للتنفيذ وهو الافتراضي لـ ld على أنظمة PDP11 Unix من البداية وحتى 2.11BSD.
-n
--nmagic
ضع علامة على الإخراج كـ "NMAGIC" (0410) في رأس a.out للإشارة إلى أنه عند تنفيذ ملف الإخراج، سيتم قراءة جزء النص فقط ومشاركته بين جميع العمليات التي تقوم بتنفيذ نفس الملف. يتضمن هذا نقل مناطق البيانات إلى أول حدود صفحة ممكنة بحجم 8 كيلو بايت بعد نهاية النص. ينشئ هذا الخيار تنسيقًا قابلاً للتنفيذ خالصًا.
-z
--imagic
ضع علامة على الإخراج كـ "IMAGIC" (0411) في رأس a.out للإشارة إلى أنه عند تنفيذ ملف الإخراج، سيتم تحميل برنامج النص ومناطق البيانات في مساحات عناوين منفصلة باستخدام ميزة تقسيم تعليمات ومساحة البيانات في وحدة إدارة الذاكرة في النماذج الأكبر من PDP11. هذا يضاعف مساحة العنوان المتاحة للبرنامج. الجزء النصي مرة أخرى خالص، ومحمي للكتابة، وقابل للمشاركة. الاختلاف الوحيد في تنسيق الإخراج بين هذا الخيار والآخرين، بصرف النظر عن رقم السحر، هو أن كل من النص وبدء أقسام البيانات في الموقع 0. حدد خيار -z هذا التنسيق في 2.11BSD. هذا ينشئ تنسيقًا قابلاً للتنفيذ منفصلاً.
--no-omagic
يعادل --nmagic لـ pdp11-aout.
البيئة
يمكنك تغيير سلوك ld باستخدام متغيرات البيئة "GNUTARGET" و "LDEMULATION" و "COLLECT_NO_DEMANGLE".
"GNUTARGET" يحدد تنسيق ملف الكائن للإدخال إذا كنت لا تستخدم -b (أو مرادفها
--format). يجب أن تكون قيمته أحد أسماء BFD لتنسيق الإدخال. إذا لم يكن هناك "GNUTARGET" في البيئة، يستخدم ld التنسيق الطبيعي للهدف. إذا تم تعيين "GNUTARGET"
إلى "افتراضي" ثم يحاول BFD اكتشاف تنسيق الإدخال عن طريق فحص الملفات الثنائية؛ غالبًا ما تنجح هذه الطريقة، ولكن هناك حالات محتملة من الغموض، حيث لا توجد طريقة لضمان
أن رقم السحر المستخدم لتحديد تنسيقات ملفات الكائنات فريد. ومع ذلك، فإن إجراء التكوين
لـ BFD على كل نظام يضع التنسيق التقليدي لهذا النظام أولاً في
قائمة البحث، لذلك يتم حل حالات الغموض لصالح التقاليد.
"LDEMULATION" تحدد الإعداد الافتراضي للمحاكاة إذا لم تستخدم الخيار `-m`. يمكن أن تؤثر المحاكاة على جوانب مختلفة من سلوك الرابط، وخاصةً برنامج الربط الافتراضي. يمكنك سرد المحاكاة المتاحة باستخدام الخيارات `--verbose` أو `-V`. إذا لم يتم استخدام الخيار `-m`، ولم يتم تعريف متغير البيئة "LDEMULATION"، يعتمد الإعداد الافتراضي للمحاكاة على كيفية تكوين الرابط.
عادةً، سيقوم الرابط افتراضيًا بإلغاء تشفير الرموز. ومع ذلك، إذا تم تعيين "COLLECT\_NO\_DEMANGLE" في البيئة، فسيقوم افتراضيًا بعدم إلغاء تشفير الرموز. يتم استخدام متغير البيئة هذا بطريقة مماثلة بواسطة برنامج تغليف الرابط "gcc". يمكن تجاوز الإعداد الافتراضي باستخدام الخيارات `--demangle` و `--no-demangle`.
إذا كان الخيار الخاص بـ PE/COFF "--insert-timestamp" نشطًا وكان متغير البيئة "SOURCE\_DATE\_EPOCH" مُعرَّفًا، فسيتم إدراج قيمة الطابع الزمني في هذا المتغير في رأس COFF بدلاً من الوقت الحالي.
إذا تم تعريف متغير البيئة "LD\_STATS"، فسيتم تسجيل معلومات حول استخدام موارد الرابط، تمامًا كما لو تم استخدام الخيار "--stats". إذا كان لمتغير "LD_STATS" قيمة سلسلة، فسيتم استخدام هذا كاسم للملف الذي يجب تخزين المعلومات فيه. وإلا، فسيتم إرسال المعلومات إلى تدفق الإخراج القياسي.
انظر أيضًا
ar(1)، nm(1)، objcopy(1)، objdump(1)، readelf(1) وإدخالات المعلومات الخاصة بـ binutils و ld.
حقوق النشر
حقوق النشر (ج) 1991-2025 مؤسسة البرمجيات الحرة، إنك.
يُمنح الإذن لنسخ وتوزيع و/أو تعديل هذا المستند وفقًا لشروط ترخيص وثائق جنو الحرة، الإصدار 1.3 أو أي إصدار لاحق تنشره مؤسسة البرمجيات الحرة؛ بدون أقسام ثابتة، وبدون نصوص الغلاف الأمامي، وبدون نصوص الغلاف الخلفي. يتم تضمين نسخة من الترخيص في القسم الذي يحمل عنوان "ترخيص وثائق جنو الحرة".