Почему SIZEOF_HEADERS в ld-скрипте равен 0?

Ниже приведен фрагмент моего сценария ld:

Формат вывода:

OUTPUT_FORMAT("elf32-i386", "elf32-i386",
          "elf32-i386")
OUTPUT_ARCH(i386)

Схема памяти:

MEMORY
{
  CFLASH             (xri)    : ORIGIN = 0x20000000, LENGTH = 0x1000
  (...omitted...)
}

REGION_ALIAS("CODE",    CFLASH)

Макет разделов:

SECTIONS
{
  PROVIDE (__executable_start = SEGMENT_START("text-segment", ORIGIN(CODE))); 
  . = SEGMENT_START("text-segment", ORIGIN(CODE)) + SIZEOF_HEADERS;  <=== PLACE 1
  
  (...omitted...)

  .startup_bsp        :
  {
    KEEP (*(.startup_bsp))
    . = ALIGN (., 0x4);
  } >CODE =0xF4F4F4F4

  (...omitted...)

Как я понял, счетчик местоположения. обозначает VMA. В PLACE 1 для VMA должно быть установлено значение 0x20000000 + SIZEOF_HEADERS.

Но когда я выгружал заголовки разделов из сгенерированного файла ELF, я вижу следующее:

введите описание изображения здесь

Итак, VMA и LMA по-прежнему равны 0x20000000, где SIZEOF_HEADERS ??? Я думаю, это должен быть размер заголовка файла ELF, но он кажется равным 0. Почему?

Согласно здесь:

SIZEOF_HEADERS

Вернуть размер заголовков выходного файла в байтах. Это информация, которая появляется в начале выходного файла. Вы можете использовать этот номер при установке начального адреса первого раздела, если хотите, для облегчения разбиения по страницам.

При создании выходного файла ELF, если сценарий компоновщика использует встроенную функцию SIZEOF_HEADERS, компоновщик должен вычислить количество заголовков программы, прежде чем он определит все адреса и размеры разделов. Если компоновщик позже обнаружит, что ему нужны дополнительные заголовки программ, он сообщит об ошибке «недостаточно места для заголовков программ». Чтобы избежать этой ошибки, вы должны избегать использования функции SIZEOF_HEADERS, или вы должны переделать свой сценарий компоновщика, чтобы избежать принудительного использования компоновщиком дополнительных заголовков программ, или вы должны сами определить заголовки программ с помощью команды PHDRS (см. PHDRS).


person smwikipedia    schedule 16.07.2016    source источник


Ответы (1)


Пока что, я полагаю, это >CODE, который переопределяет VMA, рассчитанный по счетчику местоположения .. Раздел .startup_bsp добавляется к области памяти CODE.

И поскольку это первый раздел для CODE региона, он занимает начальный адрес этого региона.

person smwikipedia    schedule 18.07.2016