reubicación interna no arreglada

Recientemente comencé a programar ensamblador para núcleos de brazos. Mis primeras pequeñas demostraciones, solo con la sección .text, se ejecutaron sin problemas.

Como extensión lógica, quería estructurar el código del ensamblador en las secciones habituales: .text, .data, .bss.

Así que escribí el siguiente programa simple:

<code> .globl _start

 .section .text

 _start:
     b   main
     b   .
     b   .
     b   .
     b   .
     b   .
     b   .
     b   .  


 main:
    ldr r0, x
    nop

 .section .data

 x:  .word  0xf0f0f0f0

 .end
</code>

Pero

<code>  /opt/arm/bin/arm-as -ggdb -mcpu=arm7tdmi demo.s -o demo.o
</code>

sale con el error

<code> prog.s: Assembler messages:
 prog.s:17: Error: internal_relocation (type: OFFSET_IMM) not fixed up
 make: *** [prog.o] Error 1
</code>

No tengo ni idea de por qué el ensamblador se queja de la reubicación, porque pensé que esa es la tarea del enlazador. Podría imaginar que tengo que decirle al ensamblador que mi sección de datos no se encuentra en la posición final de memoria en la etapa de ensamblaje, pero no puedo encontrar nada relacionado.

Aunque encontré una manera de obtener el código ensamblado correctamente, reemplazando

<code> .section .data
</code>

por

<code> .org .
</code>

Esa no es una solución satisfactoria. Especialmente en vista del hecho de que la documentación del gas resalta el sentido de esta sección.

Tal vez alguno de ustedes expertos me pueda ayudar a ganar algo de sabiduría.

Respuestas a la pregunta(2)

Su respuesta a la pregunta