Recientemente comencé la programación del ensamblador para núcleos de brazo. Mis primeros pequeños demos, solo con la sección .text, funcionaron sin ningún problema.reubicación interna no reparada
Como una 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:
.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
Pero
/opt/arm/bin/arm-as -ggdb -mcpu=arm7tdmi demo.s -o demo.o
salidas con el error
prog.s: Assembler messages:
prog.s:17: Error: internal_relocation (type: OFFSET_IMM) not fixed up
make: *** [prog.o] Error 1
no tengo ni idea de por qué el ensamblador se queja de reubicación, porque pensé que esa es la tarea del enlazador. Me podría imaginar que tengo que decirle al ensamblador que mi sección .data no está ubicada en la posición de memoria final en la etapa de ensamblaje, pero no puedo encontrar nada relacionado.
Aunque he encontrado una manera para obtener el código ensamblado correctamente, mediante la sustitución de
.section .data
por
.org .
que 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 alguien de ustedes, los expertos pueden ayudar a mí para ganar algo de sabiduría
Gracias por su explicación y el ejemplo. Esto o algo similar debería ir a la sección del brazo de la documentación binutils. Memorizaré que el enlazador hace la gran escala y el codificador la reubicación a pequeña escala. Si tengo algo de tiempo extra, estudiaré algunos c-programs desarmados y espero obtener más información ... – user1146332
¿es esta la respuesta aceptada? – aditya