Incluir un archivo binario con GNU ld linker script

Tengo un script enlazador en funcionamiento. Quiero agregar otra sección de datos cuyo contenido se extrae directamente de un archivo (ld no debe analizarlo y extraer las secciones, etc.). ¿Cómo puedo hacer eso?

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 = .; } 

Podría intentar usar objcopy para convertirlo en un objeto normal al que pueda vincular, y luego hacer referencia a sus símbolos en el script del enlazador como lo haría con un objeto normal. Desde la página del manual objcopy :

-B bfdarch –binary-architecture = bfdarch Útil cuando se transforma un archivo de entrada binario sin formato en un archivo de objeto. En este caso, la architecture de salida se puede establecer en bfdarch. Esta opción se ignorará si el archivo de entrada tiene un bfdarch conocido. Puede acceder a estos datos binarios dentro de un progtwig al hacer referencia a los símbolos especiales que se crean mediante el proceso de conversión. Estos símbolos se llaman _binary_objfile_start , _binary_objfile_end y _binary_objfile_size . por ejemplo, puede transformar un archivo de imagen en un archivo de objeto y luego acceder a él en su código utilizando estos símbolos.

… donde objfile se ampliará al nombre del archivo de objeto de entrada.

Ver también la opción --rename-section .

Puede colocar el archivo sin formato en una sección separada en el ensamblado y luego incluir esta sección en el script del enlazador.

Primero necesitas crear un archivo .S de plantilla, ej.

 .section .rawdata .incbin "blob1.raw" 

… y modifique la secuencia de comandos del enlazador para incluir esta sección a su gusto:

 .data : { *(.rawdata*) } 

También puede echar un vistazo aquí para obtener información un poco más detallada sobre la plantilla .S.

Otra solución es generar un segundo script del enlazador que contenga bytes de su binario utilizando la función BYTE , y luego incluirlo en el script anterior del enlazador utilizando la directiva INCLUDE .

Puede generar la secuencia de comandos desde su archivo binario utilizando hexdump de la siguiente manera:

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

Y luego incluirlo de esta manera:

 SECTIONS { .text : { /* ... */ kramelfs = .; INCLUDE "ramelfs.ld" ; kramelfs_end = .; /* ... */ } }