लिंकर स्क्रिप्ट भ्रम - कई लेबल की आवश्यकता क्यों है?

हैलो मेरे पास जीएनयू लिंकर ld के लिए "लिंकर स्क्रिप्ट" है और मेरे पास इसके दो प्रश्न हैं:

OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(__start)

SECTIONS
{
    . = 0x11029000;

    .text :
    {
        __exidx_start = .;
        PROVIDE (__gnu_textstart = .);
        startup.o(.text .text.*)
        *(.text .text.*)
    }

    .rodata : 
    { 
        *(.rodata .rodata.*); 
    }

    __exidx_end = .;
    PROVIDE (__gnu_textend = .);

    .data :
    {
        PROVIDE (__gnu_datastart = .);
        *(.data .data.*); 
        PROVIDE (__gnu_dataend = .);
    }

    .bss :
    {
        PROVIDE (__gnu_bssstart = .);
        *(.bss .bss.*) *(COMMON); 
        PROVIDE (__gnu_bssend = .);
    }

    PROVIDE (end = .);
    PROVIDE (__end = .);
    __image_size = ((__gnu_bssstart - __gnu_textstart) + 511) & ~ 511;
    __EH_FRAME_BEGIN__ = 0;

}

Q1: Why do we define multiple labels like __exidx_start and __gnu_textstart for the same adress? The later is defined using PROVIDE.

Q2: At the end the linker script calculates the image size like this:

__image_size = ((__gnu_bssstart - __gnu_textstart) + 511) & ~ 511;

अगर हम इसकी गणना करते हैं तो क्या हमें वही परिणाम मिलेंगे:

__image_size = ((__exdix_start - __exidx_end) + 511) & ~ 511;
1
मुझे लगता है कि आपके प्रोग्राम शुरू होने के बाद दोनों निर्दिष्ट हैं और आपके टेक्स्ट सेक्शन को परिभाषित करने की आवश्यकता है।
जोड़ा लेखक Cookie Butter, स्रोत

1 उत्तर

http://www.sourceware.org/binutils/docs-2.10/ से ld_3.html # SEC17 ऐसा लगता है कि PROVIDE कमांड का उपयोग केवल एक घोषणा के रूप में किया जाता है यदि मैंने किसी अन्य घोषणा के बिना उपयोग किया है। लाभ यह है कि प्रतीक को किसी उपयोगकर्ता द्वारा परिभाषित किया जा सकता है, जिसे वे चुनना चाहिए (या यदि वे प्रतीक के बारे में नहीं जानते हैं)। एक अर्थ में, प्रावधान में परिभाषा एक प्रकार के डिफ़ॉल्ट के रूप में कार्य करेगी यदि इसे कभी और परिभाषित नहीं किया गया है लेकिन अभी भी संदर्भित किया गया है।

यह देखते हुए, मुझे लगता है कि __ gnu_textstart को __ exidx_start के प्रकार का उपनाम माना जाता है और इसलिए Q2 हां है, क्योंकि प्रतीकों एक ही स्थान का संदर्भ देते हैं।

1
जोड़ा