Привет У меня есть «линкер сценарий» для 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;
Я думаю, что оба указаны, так как ваш начальный адрес программы и ваш текстовый раздел должны быть определены. –