No se puede obtener la sección especial del enlazador PIC32 para aparecer en el archivo de salida

5

Estoy definiendo una sección especial para algunos datos que quiero mostrar al comienzo de mi imagen binaria PIC32, como sigue en la sección SECCIONES de mi archivo elf32pic32mx.ld:

  .headerdata ORIGIN(kseg0_program_mem)  :
  {
    *(.headerdata)
  } >kseg0_program_mem

y luego en mi código, estoy inicializando una estructura como esta:

const MODULEINFO SER_05_ModuleInfo __attribute__((section (".headerdata"))) = 
{
    sizeof(MODULEINFO),         // UINT16 HeaderSize
    MODULE_TYPE,                // UNIT16 ModuleType
    // etc. etc.
};

Cuando compilo y vinculo el programa, la estructura se muestra en el archivo de mapa:

.headerdata     0x9d000000       0x48
 *(.headerdata)
 .headerdata    0x9d000000       0x48 DriverHeader.o
                0x9d000000                SER_05_ModuleInfo

pero los datos reales no se muestran en el archivo de salida hexadecimal.

Si omito el atributo ((sección (".headerdata")) en la estructura, la estructura aparece en el archivo .rodata del archivo de mapa, y los datos se muestran en mi archivo de salida hexadecimal.

Al definir secciones especiales, ¿hay algo más que deba hacerse para que realmente generen resultados además de la línea > kseg0_program_mem?

    
pregunta tcrosley

1 respuesta

4

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

    
respondido por el Austin Phillips

Lea otras preguntas en las etiquetas