簡體   English   中英

llc:不支持的符號重定位

[英]llc: unsupported relocation on symbol

問題

llc給我以下錯誤:

LLVM錯誤:符號上不支持的重定位

詳細的編譯流程

我正在為編譯器的中級IR(MIR)實現LLVM前端,並將各種方法轉換為許多位代碼文件后,將它們鏈接( llvm-link ),對其進行優化( opt ),將其轉換為機器代碼( llc ),使它們成為共享庫(鏈接程序包裝為clang ),然后動態加載它們。 對於我正在編譯的某些方法, llc步驟失敗!

步驟1: llvm-link :合並許多位碼文件

我可能有很多互相調用的函數,所以我將llvm-link到可能相互交互的不同位碼文件。 此步驟沒有問題。 例:

llvm-link function1.bc function2.bc -o lnk.bc

第2步: opt :運行優化過程

目前,我正在使用以下內容:

opt -O3 lnk.bc -o opt.bc

這一步沒有問題,但是那是導致問題的原因! 另外,這是必要的,因為將來我將需要此步驟來傳遞額外的通行證,例如loop-unroll

步驟3: 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 此命令失敗,並出現我在此答案之上寫的錯誤。

步驟4: clang :生成共享對象

對於Step 3失敗的情況,則無法達到此步驟。 如果llc成功,則此步驟也將成功!

附加信息

組態

以下內容在llvm3.6上運行,后者在arm設備上運行。

我注意到的事情

  • 如果我在opt步驟中省略了-O3 (或其他任何級別),則llc將起作用。
  • 如果我不這樣做,而是我從llc省略了它們,那么llc仍然會失敗。 這使我認為opt -O<level>引起了問題。
  • 如果我直接使用llc ,它將起作用,但是我將無法運行opt允許的特定通行證,因此這對我來說不是一個選擇。
  • 使用到目前為止已編譯的2個函數(相對於其原始MIR)使用了循環, 遇到了此問題。 其他人產生工作代碼!
  • 如果我在llc不使用pic模型,它可以生成obj.o ,但是從中創建.so會遇到問題!

問題

  1. 為什么會這樣呢?

  2. 為什么opt具有-relocation-model選項? 難道那不應該只是個llc嗎? 我嘗試將optllc都設置為pic ,但是仍然失敗。

  3. 我使用的是clang因為它具有鏈接器的包裝程序以獲取.so 是否可以使用LLVM工具來執行此步驟?

首先,不要同時使用llc和opt。 這些是開發人員端工具,切勿在任何生產環境中使用。 取而代之的是,通過LLVM庫實現您自己適當的優化和代碼生成運行時。

至於這個特定的錯誤-拇指代碼生成器可能包含一些錯誤。 請減少問題並報告。 或者根本不使用拇指模式:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM