无法从x86-64的对象,因为从PIC的组件链接共享库(Can't link a share

2019-06-26 23:54发布

我是从32位移植的共享库到64位。 它是由一些汇编(NASM为书面),其出口几个程序和较高C级胶水代码一点点。 我建立一个64位的Debian机器上NASM 01年2月10日和GNU LD 2.22。

已经修复了所有的推/弹出问题(推寄存器的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`

我知道为什么需要PIC,在64位系统; 事情是,我确实使用PIC作为的第9.2节中描述NASM手册 。 然而,在我看来,NASM不知何故没有标记我的代码作为ELF符号表,这会导致链接抗议PIC,我无法找到任何相关的命令行开关或手册中的指示来解决这个问题。

有任何想法吗?

Answer 1:

我已经解决了! 在我的情况下搬迁,原因是:

1) libc电话,我通过附加解决wrt ..pltlibc调用,如call rand wrt ..plt

2)放置在码内的常数,这需要从例如,改变的引用push MASK_RGBpush ptr [rel MASK_RGB]其中, ptr是我自己类型的别名天然字类型对于给定的平台)。



文章来源: Can't link a shared library from an x86-64 object from assembly because of PIC