Dado el código presentado, un volcado de objetos de los encabezados mostrará algo similar a lo siguiente:
pic32-objdump -x main.o
9 .rodata 00000004 00000000 00000000 00000360 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
10 .headerdata 00000004 00000000 00000000 00000364 2**2
CONTENTS, ALLOC, LOAD, DATA
Esto muestra que la sección en la que se colocan los datos del encabezado no tiene los atributos READONLY y CODE y esto, a su vez, hace que el enlazador funcione de manera diferente en los datos de esa sección. En mis pruebas limitadas, parece que el contenido en .headerdata
se trata como otros datos, lo que significa que se coloca en una sección especial llamada .dinit
y se carga desde la memoria flash a la RAM en el inicio del programa. Menciona que los datos de la sección .headerdata
no aparecen en su archivo hexadecimal. Sospecho que lo encontrará en la sección .dinit
.
Si está intentando obtener una funcionalidad similar a .rodata
pero con su propio nombre de sección, deberá marcar su sección .headerdata
con un atributo r
adicional como este:
static const MODULEINFO SER_05_ModuleInfo __attribute__((section (".headerdata,r"))) =
dando como resultado un volcado de encabezado de objeto de la siguiente manera:
9 .rodata 00000004 00000000 00000000 00000360 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
10 .headerdata 00000004 00000000 00000000 00000364 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
Esto se tratará de forma similar a .rodata
en el vinculador, siempre y cuando haya agregado su fragmento de script de vinculador especial como se indica.
Supongo que estás intentando convertir tu encabezado en el primer conjunto de datos que está presente en el espacio del programa. Aunque las adiciones al script de vinculador que ha enumerado parecen funcionar, por lo general prefiero simplemente agregar las secciones adicionales en línea con las secciones existentes en el orden preferido. En lugar de una sección de tipo .headerdata ORIGIN(kseg0_program_mem)
separada, puedes editar la sección .text
para terminar con algo como esto:
.text :
{
*(.headerdata)
*(.stub .gnu.linkonce.t.*)
KEEP (*(.text.*personality*))
*(.mips16.fn.*)
*(.mips16.call.*)
*(.gnu.warning)
} >kseg0_program_mem
El uso de pic32-objdump -d main.elf
mostrará un desmontaje completo del binario final en el que ahora debería ver los datos de su encabezado en la dirección correcta.
Es posible que desee comprobar que colocar su encabezado al inicio del espacio del programa no altere el funcionamiento de otras partes del sistema, como el manejo de excepciones.
Encontré una copia del código del compilador pic30.c
gcc flotando en la web en algún lugar y las marcas de atributo de la sección aceptada parecen ser:
b - BSS
x - código ejecutable
r - Datos de solo lectura
d - Datos grabables