此代码在gcc上编译得很好,但是当使用llvm(llvm-gcc)时,它在"constant expression expected"
ldr
问题是语法:如何指定数组所在的位置?我不想以字节为单位硬编码位移:ldr r7, [pc, #some_shift]
但要使用文字来保持代码清洁和安全。
知道如何让它发挥作用吗?
.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
答案 0 :(得分:2)
尝试更改
ldr r7, =maskTable
到
ldr r7, maskTable
并删除
.data
部分。它似乎是gcc的错误/缺失能力< 4.6处理.data
部分
答案 1 :(得分:1)
您可以尝试两件事:
ldr r7, =maskTable
更改为adr r7, maskTable
。.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
答案 2 :(得分:0)
我自己不知道答案,但如果是我,我会看一些编译过的C代码,看看编译器是如何做到的。确保编译器不处于PIC模式或其他状态,或者它会做更复杂和不必要的事情。