wewnętrzne przeniesienie nie zostało naprawione

Niedawno rozpocząłem programowanie asemblera dla rdzeni ramion. Moje pierwsze małe dema, tylko z sekcją .text, działały bez żadnych problemów.

Jako rozszerzenie logiczne chciałem uporządkować kod asemblera do zwykłych sekcji: .text, .data, .bss.

Napisałem więc następujący prosty program:

<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>

Ale

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

kończy się błędem

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

Nie mam pojęcia, dlaczego asembler narzeka na relokację, ponieważ myślałem, że to zadanie łącznika. Mogłem sobie wyobrazić, że muszę powiedzieć asemblerowi, że moja sekcja .data nie znajduje się na końcowej pozycji pamięci na etapie montażu, ale nie mogę znaleźć niczego związanego.

Chociaż znalazłem sposób na poprawne skompilowanie kodu, zastępując go

<code> .section .data
</code>

przez

<code> .org .
</code>

to nie jest satysfakcjonujące rozwiązanie. Zwłaszcza ze względu na fakt, że dokumentacja gazowa podkreśla sens tej sekcji.

Może ktoś z was ekspertów pomoże mi zdobyć mądrość

questionAnswers(2)

yourAnswerToTheQuestion