我正在将一个共享库从32位移植到64位。它由一些程序集(为NASM编写)组成,它导出了几个程序和一些更高级别的C粘合代码。我正在使用NASM 2.10.01和GNU ld 2.22的64位Debian机器上构建。
修复了所有推/弹问题(推动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 :(得分:2)
我已经解决了!就我而言,重新安置的原因是:
1)libc
次来电,我通过将wrt ..plt
追加到libc
次来电来解决这个问题。 call rand wrt ..plt
,
2)对代码中放置的常量的引用,这些常量需要从例如push MASK_RGB
到push ptr [rel MASK_RGB]
(其中ptr
是我自己的类型,与给定平台的本机字类型别名)。