[英]llc: unsupported relocation on symbol
llc
給我以下錯誤:
LLVM錯誤:符號上不支持的重定位
我正在為編譯器的中級IR(MIR)實現LLVM前端,並將各種方法轉換為許多位代碼文件后,將它們鏈接( llvm-link
),對其進行優化( opt
),將其轉換為機器代碼( llc
),使它們成為共享庫(鏈接程序包裝為clang
),然后動態加載它們。 對於我正在編譯的某些方法, llc
步驟失敗!
llvm-link
:合並許多位碼文件 我可能有很多互相調用的函數,所以我將llvm-link
到可能相互交互的不同位碼文件。 此步驟沒有問題。 例:
llvm-link function1.bc function2.bc -o lnk.bc
opt
:運行優化過程 目前,我正在使用以下內容:
opt -O3 lnk.bc -o opt.bc
這一步沒有問題,但是那是導致問題的原因! 另外,這是必要的,因為將來我將需要此步驟來傳遞額外的通行證,例如loop-unroll
llc
:生成機器代碼(PIC) 我正在使用以下命令:
llc -march=thumb -arm-reserve-r9 -mcpu=cortex-a9 -filetype=obj -relocation-model pic opt.bc -o obj.o
我保留了我設置的拱門特定標志,以防它們導致問題。 我正在使用Position Independent Code
因為在下一步中,我將構建一個shared object
。 此命令失敗,並出現我在此答案之上寫的錯誤。
clang
:生成共享對象 對於Step 3
失敗的情況,則無法達到此步驟。 如果llc
成功,則此步驟也將成功!
以下內容在llvm3.6上運行,后者在arm
設備上運行。
opt
步驟中省略了-O3
(或其他任何級別),則llc
將起作用。 llc
省略了它們,那么llc
仍然會失敗。 這使我認為opt -O<level>
引起了問題。 llc
,它將起作用,但是我將無法運行opt
允許的特定通行證,因此這對我來說不是一個選擇。 llc
不使用pic
模型,它可以生成obj.o
,但是從中創建.so
會遇到問題! 為什么會這樣呢?
為什么opt
具有-relocation-model
選項? 難道那不應該只是個llc
嗎? 我嘗試將opt
和llc
都設置為pic
,但是仍然失敗。
我使用的是clang
因為它具有鏈接器的包裝程序以獲取.so
。 是否可以使用LLVM工具來執行此步驟?
首先,不要同時使用llc和opt。 這些是開發人員端工具,切勿在任何生產環境中使用。 取而代之的是,通過LLVM庫實現您自己適當的優化和代碼生成運行時。
至於這個特定的錯誤-拇指代碼生成器可能包含一些錯誤。 請減少問題並報告。 或者根本不使用拇指模式:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.