2012-08-11 31 views
2

無法從程序集中的x86-64對象鏈接共享庫我將一個共享庫從32位移植到64位。它由一些程序集(爲NASM編寫)組成,可以導出多個程序和一些較高級別的C代碼。我使用的是NASM 2.10.01和GNU ld 2.22的64位Debian機器。由於PIC(NASM)

修正了所有的推/拉問題(推送32位寄存器顯然不能在64位模式下工作),我有組裝對象,但現在我被連接暫停階段。這是我的命令行 - 組件:

nasm -Ox -dPTC_ARCH=X64 -f elf64 particl.asm -o particlasm.o

鏈接:

ld -shared -lc -S -melf_x86_64 particlasm.o ptc_highlevel.o -o libparticlasm.so (該-lc開關強制在連接標準C庫 - 我需要在裝配代碼它的一些功能)

但是,鏈接失敗,並顯示以下消息:

ld: particlasm.o: relocation R_X86_64_32 against `.text' can not be used when making a shared object; recompile with -fPIC 
particlasm.o: could not read symbols: Bad value` 

我知道爲什麼在64位系統上需要PIC;事情是,我的確在按照NASM manual的第9.2節所述使用PIC。然而,在我看來,NASM在某種程度上不會將我的代碼標記爲ELF符號表中的PIC,這會導致鏈接器發生抗議,我在 手冊中找不到任何相關的命令行開關或指令來解決此問題。

任何想法?

+0

我有,除了生成絕對地址不能相對RIP的一打警告,它不會幫助鏈接器的問題... – IneQuation 2012-08-12 08:10:25

回答

1

我已經解決了!在我的情況下,重定位產生於:

1)libc調用,我通過追加wrt ..pltlibc調用,例如, call rand wrt ..plt,

2)對置於代碼內的常量的引用,需要從例如, push MASK_RGBpush ptr [rel MASK_RGB](其中ptr是我自己的類型,可以將給定平臺的本機字類型別名)。