binary - Incluir un archivo binario con GNU ld linker script
(3)
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 = .;
}
Otra solución es generar un segundo script del enlazador que contenga bytes de su binario usando la función BYTE
, y luego incluirlo en el script del enlazador anterior usando 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 = .;
/* ... */
}
}
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 arquitectura 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 programa 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.