Включите двоичный файл со сценарием компоновщика GNU ld

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

person Pandemonium    schedule 29.11.2008    source источник
comment
GCC: stackoverflow.com/questions/4864866/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 21.02.2018


Ответы (3)


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

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

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

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

person CesarB    schedule 29.11.2008
comment
Текст bfdarch не означает буквально (и не нужен). Если вы запутаетесь, см. Связывание произвольных данных с помощью набора инструментов gcc arm. - person artless noise; 24.06.2013

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

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

.section .rawdata
.incbin "blob1.raw"

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

.data : {

    *(.rawdata*)

}

Вы также можете посмотреть здесь здесь для Немного подробнее о шаблоне .S.

person lmctl    schedule 27.08.2013

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

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

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

А затем включите это так:

SECTIONS {
    .text : {

        /* ... */

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

       /* ... */
    }
}
person aimxhaisse    schedule 15.12.2011