作为一个具体的例子,在GAS 2.24版本中,移动地址:
在这种特定情况下或者一般情况下,使用其中任何一种有理由吗?我不明白汇编器如何对任一情况做出更好的推测。
NASM 2.10.09在上述两种情况下都只使用R_X86_64_32。更新:nasm的6377180边缘提交在2.11之后生成了与Gas相同的输出,这似乎是一个错误,正如Ross所提到的那样。
我已经解释了我对R_X86_64_32S的理解,详见:https://dev59.com/SW025IYBdhLWcg3wSkAq#33289761。
mov $s, %eax
s:
之后:
as --64 -o a.o a.S
objdump -Sr a.o
使用零扩展:
0000000000000000 <s-0x5>:
0: b8 00 00 00 00 mov $0x0,%eax
1: R_X86_64_32 .text+0x5
但是关于内存访问:
mov s, %eax
s:
编译为符号扩展:
0000000000000000 <s-0x7>:
0: 8b 04 25 00 00 00 00 mov 0x0,%eax
3: R_X86_64_32S .text+0x7
在这种特定情况下或者一般情况下,使用其中任何一种有理由吗?我不明白汇编器如何对任一情况做出更好的推测。
NASM 2.10.09在上述两种情况下都只使用R_X86_64_32。更新:nasm的6377180边缘提交在2.11之后生成了与Gas相同的输出,这似乎是一个错误,正如Ross所提到的那样。
我已经解释了我对R_X86_64_32S的理解,详见:https://dev59.com/SW025IYBdhLWcg3wSkAq#33289761。
. = 0xFFFFFFFF80000000;
https://dev59.com/SW025IYBdhLWcg3wSkAq#33289761,它会在_32
上出现问题,但不会在_32S
上出现问题。 - Ciro Santilli OurBigBook.com