2013-04-13 57 views
5

我有一個llvm模塊,我傾銷爲llvm::WriteBitcodeToFile的位代碼文件。我想將此位代碼文件轉換爲包含模塊中功能的本機可動態加載庫。從LLVM位創建位置獨立的目標文件位代碼

我該怎麼做?我嘗試使用llc對於這一點,但是這將產生代碼,顯然是不重定位的,因爲執行以下步驟之後:

llc -enable-pie -cppgen=functions -filetype=asm executableModule -o em.s 

然後,用GNU as assemblying成目標文件:

as -o mylib.o em.s 

最後,試圖以產生共享庫:

gcc -shared -o libmyfile.so -fPIC mylib.o 

失敗,錯誤:

/usr/bin/ld: error: mylib.o: requires dynamic R_X86_64_PC32 reloc against 'X.foo' which may overflow at runtime; recompile with -fPIC 
collect2: ld returned 1 exit status 

回答

8

您需要設置重定位模型。像-llc -relocation-model = pic。不要使用PIE,因爲它是用於可執行文件,而不是用於庫。另外,-cppgen在這裏沒有任何意義,它只適用於cpp後端。

+0

謝謝!!!!,是否有一種工具直接從IR位代碼構建庫,而不依賴於彙編程序? – lurscher

+0

我見過這個llc支持本地代碼輸出,但它是實驗性的。對此有沒有生產質量的方法? – lurscher

+0

嗨。你會告訴選擇「-relocation-model」的選項嗎?我可以爲「lli」找到它,但「lli」不是「llc」。 – beroal