4

我正在将共享库从 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;问题是,我确实在使用 PIC,如NASM 手册第 9.2 节所述。但是,在我看来,NASM 以某种方式没有在 ELF 符号表中将我的代码标记为 PIC,这导致链接器抗议,并且我在手册中找不到任何相关的命令行开关或指令来解决这个问题。

有任何想法吗?

4

1 回答 1

3

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

1)libc电话,我通过附加电话wrt ..plt来解决libc,例如call rand wrt ..plt

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

于 2012-08-21T19:41:37.933 回答