2012-08-11 32 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是我自己的类型,可以将给定平台的本机字类型别名)。