【发布时间】:2018-08-29 15:26:06
【问题描述】:
我正在编写一些汇编代码(英特尔),但我不明白为什么当我尝试创建共享库时这段代码不起作用:
BITS 64
SECTION .text
GLOBAL test
test:
push rbp
mov rbp, rsp
mov rax, 3
mov al, BYTE [rel array + rax]
pop rbp
ret
SECTION .data
array times 256 db 0
而如果您通过使用数字更改寄存器来修改带有“mov”的行,它会起作用:
mov al, BYTE [rel array + 3]
我的 nasm 没有任何错误,但是当我尝试使用 ld 链接和创建共享库时:
relocation R_X86_64_32S 对 `.data' 在制作时不能使用 共享对象;用 -fPIC 重新编译
我找到了“R_X86_64_32S”错误的答案:How does C++ linking work in practice?
但是我不明白为什么我不能使用“rax”作为偏移量,而我可以使用数字。
有没有办法浏览数组?
这是我用来创建共享库的命令:
nasm -f elf64 test.s
ld -shared test.o -o test.so
【问题讨论】:
-
相关:stackoverflow.com/questions/43367427/…:PIE 可执行文件对使用
[array + rax]有相同的限制,因为它要求地址适合 32 位符号扩展值。正如 Jester 所说,奇怪的是 NASM 没有在[rel array + rax]上发出警告,因为 rel 不是一个选项,所以它被编码为[abs array + rax]。顺便说一句,您可以使用default rel让 NASM 尽可能使用 RIP-relative。
标签: arrays assembly shared-libraries x86-64 position-independent-code