2013-11-27 5 views
1

Привет У меня есть «линкер сценарий» для GNU линкер 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: Почему мы определяем несколько ярлыков как __exidx_start и __gnu_textstart для того же адреса? Более поздняя версия определена с использованием PROVIDE.

Q2: В конце сценария компоновщик вычисляет размер изображения, как это:

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

ли мы получим тот же результат, если мы рассчитали так:

__image_size = ((__exdix_start - __exidx_end) + 511) & ~ 511; 
+0

Я думаю, что оба указаны, так как ваш начальный адрес программы и ваш текстовый раздел должны быть определены. –

ответ

1

От http://www.sourceware.org/binutils/docs-2.10/ld_3.html#SEC17 похоже, что использование команды PROVIDE подразумевается как декларация ТОЛЬКО ЕСЛИ используется без другого объявления. Преимущество состоит в том, что символ может быть определен пользователем, если они будут выбирать (или если они просто не знают о символе). В некотором смысле, определение в PROVIDE будет действовать как дефолт, если он никогда не определяется в другом месте, но все еще ссылается.

Учитывая, что, я предположил бы, что __gnu_textstart предназначается, чтобы быть псевдонимом сортов для __exidx_start и, следовательно, ответ на Q2 да, так как символы ссылаться на те же места.