2012-02-21 167 views
2

此代碼編譯海合會就好,但使用LLVM(LLVM-GCC)時,與ldrLLVM-GCC彙編:LDR語法

問題行說"constant expression expected"是語法:如何指定我的數組是什麼地方?我不想用字節對位移進行硬編碼: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

你問LLVM的郵件列表上? LLVM 3.1將具有ARM彙編器,但同時它們是解決LLVM行爲問題的最佳資源。或者閱讀源代碼,當然。 http://llvm.org/docs/CodeGenerator.html#targetfeatures表示ARM的asm解析器不被支持,所以它使用gas代碼。 – 2012-03-10 15:37:13

+0

你能告訴你正在發佈的命令來構建這些代碼嗎?像'gcc -fpic hello.c'一樣? – 2012-03-12 20:20:03

+0

@vasile任何運氣?我想知道你的構建命令,以便我可以準確地重現你的情況 – 2012-03-13 06:51:38

回答

2

嘗試改變

ldr r7, =maskTable 

ldr r7, maskTable 

,並刪除

.data 

部分。這似乎是對付.data部分GCC < 4.6的錯誤/缺少能力

0

我不知道自己的答案,但如果是我,我會看一些編譯的C代碼,看看編譯器是怎麼做的。確保編譯器不處於PIC模式或某種情況,否則會做更復雜和不必要的事情。

+0

我需要PIC標誌,所以我不能簡化這種情況。編譯後的代碼有一個硬編碼的值:'ldr r7 [pc#138]'我真的不想要,因爲如果我在.S文件中改變了某些東西,它將需要更新換檔位置。這很醜陋。 – Sam 2012-03-12 13:30:40

+0

我發現編譯器輸出不太可能有很大的偏移量(但是我沒有使用LLVM)。你在看彙編代碼還是反彙編?通常這些由彙編程序填寫,如果它們在同一部分內,或者由鏈接程序填充,如果符號位於不同的部分或不同的文件中。 – ams 2012-03-12 16:48:06

1

有兩件事情可以嘗試:

  1. 變化ldr r7, =maskTableadr r7, maskTable
  2. 存儲表的下一個單獨的標籤的地址並加載它手動喜歡如下:

.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