Включить бинарный файл со скриптом GNU ld linker - PullRequest
23 голосов
/ 29 ноября 2008

У меня есть рабочий скрипт компоновщика. Я хочу добавить еще один раздел данных, содержимое которого извлекается непосредственно из файла (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 = .;
}

Ответы [ 3 ]

17 голосов
/ 30 ноября 2008

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

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

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

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

10 голосов
/ 27 августа 2013

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

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

.section .rawdata
.incbin "blob1.raw"

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

.data : {

    *(.rawdata*)

}

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

5 голосов
/ 15 декабря 2011

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

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

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

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

SECTIONS {
    .text : {

        /* ... */

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

       /* ... */
    }
}
...