2014-03-27 77 views
0

我使用NASM 64編譯.S到.O,然後創建一個共享庫,像這樣的gcc:NASM問題搬遷R_X86_64_PC32共享庫

nasm -f elf64 source/strlen.S 
nasm -f elf64 source/strchr.S 
nasm -f elf64 source/memset.S 
nasm -f elf64 source/strcspn.S 
nasm -f elf64 source/rindex.S 
nasm -f elf64 source/strpbrk.S 
nasm -f elf64 source/strcmp.S 
nasm -f elf64 source/strncmp.S 
nasm -f elf64 source/strcasecmp.S 
/usr/bin/gcc -shared ./source/strlen.o ./source/strchr.o ./source/memset.o ./source/strcspn.o ./source/rindex.o ./source/strpbrk.o ./source/strcmp.o ./source/strncmp.o ./source/strcasecmp.o -o libasm.so 

源/ rindex.S調用fonction strlen的是在源/ strlen.S 編譯行拋出一個錯誤:

/usr/bin/ld: ./source/rindex.o: relocation R_X86_64_PC32 against symbol `strlen' can not be used when making a shared object; recompile with -fPIC 

編譯.S但我使用NASM時,我可以用用gcc -fPIC選項,我沒有找到等效選項。

有人知道我該如何避免這個問題?

在此先感謝。

回答

1

您需要確保您正在編寫與位置無關的代碼。您可能會發現DEFAULT RELREL關鍵字本身很有用。