Dump of assembler code for function read@plt:
0x0000000000402458 <read@plt+0>: jmpq *0x2b4f72(%rip) # 0x6b73d0 <_GLOBAL_OFFSET_TABLE_+232>
0x000000000040245e <read@plt+6>: pushq $0x1a
0x0000000000402463 <read@plt+11>: jmpq 0x4022a8
有谁知道?
BTW,read
如何知道他到了文件的末尾?
答案 0 :(得分:2)
不,这是一个直接的价值。 pushq
将一个值推送到堆栈,可能是一个寄存器,但你会发现它们被%rbx
等操作数表示。
$0x1a
是一个立即值 - 您也可以通过该指令的长度(从x+6
到x+10
五个字节)来判断。 pushq
指令能够推送寄存器,存储器内容(64位)或32位立即值(符号扩展为64位)。
在这种情况下,五个字节是操作码0x68
以及要推送的32位值。如果要检查内存,它可能看起来像0x68 0x1a 0x00 0x00 0x00
。
不要被该代码所迷惑,这根本不是“真正的”read
调用。它是一个存根,用于在运行时修复引用,其中代码段可以在处理器之间共享,即使在不同的基址也是如此。
PLT是一个占用空间小的每个进程存根,它第一次跳转到真正的共享代码,在此过程中自行修复,以便将来直接跳转到那里。有关此过程的说明,请参阅here。
答案 1 :(得分:0)
寄存器(通常)没有内存位置,它们是CPU寄存器。
答案 2 :(得分:0)
尚未提及,但领先的$符号表示常量。在查看汇编转储时很简单。
一个简单的陷阱:当查看未链接的二进制文件的转储时,不要被遍布的0x00000000所欺骗。如果没有前导$,那些是链接器重定位,而不是常量0值。