Включить двоичный файл с GNU ld linker script

У меня есть рабочий компоновщик script. Я хочу добавить еще один раздел данных, содержимое которого выталкивается непосредственно из файла (ld не должен анализировать его и извлекать разделы и т.д.). Как я могу это сделать?

OUTPUT_FORMAT("elf32-i386")
ENTRY(start)
SECTIONS
{
  .text 0x100000 : {
    *(.multiboot)
    *(.text)
    *(.code)
    *(.rodata*)
  }
  .data : {
    *(.data)
  }
  .bss : {
    *(.bss)
  }
  kernel_end = .;
  roottask_start = .;
  .data : {

    HERE I WANT TO INCLUDE THE ENTIRE CONTENTS OF ANOTHER (BINARY) FILE

  }
  roottask_end = .;
}

Ответ 1

Вы можете попробовать использовать objcopy, чтобы преобразовать его в обычный объект, к которому вы можете подключиться, а затем ссылаться на его символы в компоновщике script, как если бы вы делали обычный объект. На странице objcopy руководства:

-B bfdarch --binary-архитектура = bfdarch  Полезно при преобразовании исходного двоичного входного файла в объект  файл. В этом случае выходная архитектура может быть установлена ​​на bfdarch.  Эта опция будет проигнорирована, если входной файл имеет известный bfdarch.  Вы можете получить доступ к этим двоичным данным внутри программы, указав  специальные символы, которые создаются процессом преобразования. Эти  символы называются _binary_objfile_start, _binary_objfile_end и  _binary_objfile_size. например вы можете преобразовать файл изображения в  файл объекта, а затем получить доступ к нему в вашем коде с помощью этих символов.

... где objfile будет расширен до имени входного объектного файла.

См. также параметр --rename-section.

Ответ 2

Вы можете поместить исходный файл в отдельный раздел в сборке, а затем включить этот раздел в компоновщик script.

Сначала вам нужно создать файл шаблона .S, например.

.section .rawdata
.incbin "blob1.raw"

... и изменить компоновщик script, чтобы включить этот раздел по своему усмотрению:

.data : {

    *(.rawdata*)

}

Вы также можете посмотреть здесь здесь для получения более подробной информации о шаблоне .S.

Ответ 3

Другим решением является создание второго компоновщика script, содержащего байты из вашего бинарного файла, используя функцию BYTE, а затем включить его в прежний компоновщик script с помощью директивы INCLUDE.

Вы можете сгенерировать script из двоичного файла с помощью hexdump следующим образом:

cat ramelfs | hexdump -v -e '"BYTE(0x" 1/1 "%02X" ")\n"' > ramelfs.ld

И затем включите его следующим образом:

SECTIONS {
    .text : {

        /* ... */

        kramelfs = .;
        INCLUDE "ramelfs.ld" ;
        kramelfs_end = .;

       /* ... */
    }
}