由于PIC,无法从汇编中链接x86-64对象的共享库

时间:2012-08-11 18:07:24

标签: linker 64-bit x86-64 nasm ld

我正在将一个共享库从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,这导致链接器抗议,我找不到任何相关的命令行开关或指令 手册来解决这个问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我已经解决了!就我而言,重新安置的原因是:

1)libc次来电,我通过将wrt ..plt追加到libc次来电来解决这个问题。 call rand wrt ..plt

2)对代码中放置的常量的引用,这些常量需要从例如push MASK_RGBpush ptr [rel MASK_RGB](其中ptr是我自己的类型,与给定平台的本机字类型别名)。