这段代码在gcc上编译得很好,但是当使用llvm (llvm-gcc)时,它显示为"constant expression expected" on the line with ldr
问题出在语法上:如何指定数组所在的位置?我不想将位移硬编码为bytes: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发布于 2012-03-13 04:14:17
试着改变
ldr r7, =maskTable至
ldr r7, maskTable并删除
.data部分。.data版块处理,gcc < 4.6似有bug/缺失能力
发布于 2012-03-13 16:13:42
您可以尝试以下两种方法:
将表的地址更改为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发布于 2012-03-12 18:19:24
我自己也不知道答案,但如果是我,我会看一些编译过的C代码,看看编译器是如何做到的。确保编译器没有处于PIC模式,否则它会做一些更复杂和不必要的事情。
https://stackoverflow.com/questions/9374703
复制相似问题