realocação interna não corrigida
Recentemente iniciei a programação assembler para núcleos de braço. Minhas primeiras demos, apenas com a seção .text, rodaram sem problemas.
Como uma extensão lógica, eu queria estruturar o código assembler nas seções usuais: .text, .data, .bss.
Então eu escrevi o seguinte programa simples:
<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>
Mas
<code> /opt/arm/bin/arm-as -ggdb -mcpu=arm7tdmi demo.s -o demo.o </code>
sai com o erro
<code> prog.s: Assembler messages: prog.s:17: Error: internal_relocation (type: OFFSET_IMM) not fixed up make: *** [prog.o] Error 1 </code>
Eu não tenho idéia porque o montador se queixa de relocação, porque eu pensei que essa é a tarefa do vinculador. Eu poderia imaginar que eu tenho que dizer ao montador que minha seção .data não está localizada na posição final de memória no estágio de montagem, mas não consigo encontrar nada relacionado.
Embora eu encontrei uma maneira de obter o código montado corretamente, substituindo
<code> .section .data </code>
por
<code> .org . </code>
essa não é uma solução satisfatória. Especialmente em vista do fato de que a documentação do gás destaca o sentido desta seção.
Talvez alguém de vocês especialistas possa me ajudar a ganhar alguma sabedoria