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