Ten kod dobrze się kompiluje na gcc, ale gdy używasz llvm (llvm-gcc), wyświetla "constant expression expected"
w wierszu z ldr
Problemem jest składnia: Jak określić miejsce, w którym znajduje się moja tablica? Nie chcę na sztywno kodować przemieszczenia w bajtach: ldr r7, [pc, #some_shift]
, ale używać literału, aby kod był czysty i bezpieczny.
Jakiś pomysł, jak to sprawić?
.globl func_name
func_name:
push {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}
//[Some stripped code]
add r6, r6, sl, lsl #2
sub ip, ip, sl
ldr r7, =maskTable // Here it crashes
add sl, sl, #4 @ 0x4
// Some stripped code here
mov r0, #0 @ 0x0 // return 0
pop {r4, r5, r6, r7, r8, r9, sl, fp, ip, pc}
.word 0x00000000
.data
.align 5
maskTable:
.word 0x00000000, 0x00000000, 0x00000000, 0x00000000
.word 0x0000FFFF, 0x00000000, 0x00000000, 0x00000000
.word 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000
3 odpowiedzi
Spróbuj zmienić
ldr r7, =maskTable
Do
ldr r7, maskTable
I usuń
.data
Sekcja. Wydaje się, że jest to błąd/brakująca zdolność gcc < 4.6 do radzenia sobie z sekcją .data
Istnieją dwie rzeczy, które możesz spróbować:
- Zmień
ldr r7, =maskTable
naadr r7, maskTable
. - Zapisz adres tabeli pod osobną etykietą i załaduj ją ręcznie w następujący sposób:
.globl func_name
func_name:
push {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}
//[Some stripped code]
add r6, r6, sl, lsl #2
sub ip, ip, sl
ldr r7, maskTable_adr // Here it crashes
add sl, sl, #4 @ 0x4
// Some stripped code here
mov r0, #0 @ 0x0 // return 0
pop {r4, r5, r6, r7, r8, r9, sl, fp, ip, pc}
.word 0x00000000
.data
.align 5
maskTable_adr:
.word maskTable
maskTable:
.word 0x00000000, 0x00000000, 0x00000000, 0x00000000
.word 0x0000FFFF, 0x00000000, 0x00000000, 0x00000000
.word 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000
Sam nie znam odpowiedzi, ale gdybym to był ja, spojrzałbym na jakiś skompilowany kod C i zobaczyłbym, jak to robi kompilator. Upewnij się, że kompilator nie jest w trybie PIC lub coś takiego, albo zrobi coś bardziej skomplikowanego i niepotrzebnego.
Podobne pytania
Powiązane pytania
Nowe pytania
gcc
GCC to kolekcja kompilatorów GNU. Jest to de facto standardowy kompilator C, C ++, Go, Fortran i Ada w systemie Linux, a także obsługuje wiele innych języków i platform.