2013-04-13 10 views
5

Ho un modulo llvm che ho scaricato come file bitcode con llvm::WriteBitcodeToFile. Voglio trasformare questo file di bitcode in una libreria nativa caricabile dinamicamente che contiene le funzioni nel modulo.creare il file oggetto indipendente dalla posizione dal codice bit LLVM

Come faccio? Ho provato ad utilizzare llc per questo, ma questo produce codice che a quanto pare non è rilocabile, dal momento che dopo aver fatto le seguenti operazioni:

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

poi, assemblying con GNU as in un file oggetto:

as -o mylib.o em.s 

finalmente , cercando di produrre una libreria condivisa con:

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

fallisce con l'errore:

/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 

risposta

8

È necessario impostare il modello di riposizionamento. Qualcosa come -llc -relocation-model = pic. Non usare PIE, perché è per i file eseguibili, non per le librerie. Inoltre, -cppgen non ha alcun senso qui, è solo per il backend cpp.

+0

grazie !!!!, c'è uno strumento per costruire la libreria direttamente dal codice bit IR, senza fare affidamento sull'assemblatore? – lurscher

+0

ho visto quell'autentico supporto per l'output del codice nativo, ma è sperimentale. Esiste un approccio di qualità produttiva per questo? – lurscher

+0

Ciao. Diresti dove è descritta l'opzione "-relocation-model"? Posso trovarlo per "lli", ma "lli" non è "llc". – beroal