我正在将共享库从 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
Linking:
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;事实是,我确实按照 9.2 节中的描述使用 PICNASM手册。然而,在我看来,NASM 不知何故没有在 ELF 符号表中将我的代码标记为 PIC,这导致链接器抗议,并且我在
手动修复此问题。
有任何想法吗?
我已经解决了!就我而言,搬迁的原因是:
1) libc
调用,我通过附加解决了wrt ..plt
to libc
电话,例如call rand wrt ..plt
,
2)对代码中放置的常量的引用,这些常量需要从例如push MASK_RGB
to push ptr [rel MASK_RGB]
(where ptr
是我自己的类型,它是给定平台的本机单词类型的别名)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)