Assembly 继续获取e8 00作为调用程序集中函数的机器代码

Assembly 继续获取e8 00作为调用程序集中函数的机器代码,assembly,linker,x86,disassembly,machine-code,Assembly,Linker,X86,Disassembly,Machine Code,我知道在我的文件中使用objdump-dr时,call在机器代码中显示为e8 00,因为它尚未链接。但是我需要找出链接器完成工作后,00将变成什么。我知道它应该计算偏移量,但我对此有点困惑 作为下面代码的一个示例,链接器部分完成后,e8 00应该如何处理?我怎么才能得到这个答案呢 我正在使用以下示例代码进行测试:(我正在尝试调用moo) 节的反汇编。文本: 0000000000000000 : 0:55推送%rbp 1:48 89 e5 mov%rsp,%rbp 4:89 7d fc mov%e

我知道在我的文件中使用
objdump-dr
时,
call
在机器代码中显示为
e8 00
,因为它尚未链接。但是我需要找出链接器完成工作后,
00
将变成什么。我知道它应该计算偏移量,但我对此有点困惑

作为下面代码的一个示例,链接器部分完成后,
e8 00
应该如何处理?我怎么才能得到这个答案呢

我正在使用以下示例代码进行测试:(我正在尝试调用moo)

节的反汇编。文本:
0000000000000000 :
0:55推送%rbp
1:48 89 e5 mov%rsp,%rbp
4:89 7d fc mov%edi,-0x4(%rbp)
7:8b 45 fc mov-0x4(%rbp),%eax
a:83 e8 0a子$0xa,%eax
d:5d pop%rbp
e:c3 retq
000000000000000 F:
f:55%按需付费
10:48 89 e5 mov%rsp,%rbp
13:89 7d fc mov%edi,-0x4(%rbp)
16:b8 01 00 mov$0x1,%eax
1b:5d pop%rbp
1c:c3 retq
00000000000000 1D:
1d:55%推送rbp
1e:48 89 e5 mov%rsp,%rbp
21:48 83欧共体10分$0x10,%rsp
25:c7 45 fc 8e 0c 00移动$0xc8e,-0x4(%rbp)
2c:8b 45 fc mov-0x4(%rbp),%eax
2f:89 c7 mov%eax%edi
31:e8 00呼叫36
32:R_X86_64_PC32 moo-0x4
36:89 45 fc mov%eax,-0x4(%rbp)
39:b8 00 mov$0x0,%eax
3e:c9-q
3f:c3 retq

使用
objdump-r
您可以使用反汇编
-d
打印重新定位:

  31:   e8 00 00 00 00          callq  36 <main+0x19>
            32: R_X86_64_PC32   moo-0x4

如果要编译代码而不重新定位,请显示源代码和编译选项。

我知道的几种体系结构上的目标文件和可执行文件不一定在链接时修复跳转目标

这是一个提供灵活性的功能

在指令执行之前,跳转目标地址不必固定。它们不需要在链接时甚至在程序启动时修复

大多数系统(Windows、Linux、Unix、VAX/VMS)在目标代码中将这些位置标记为需要调整的地址。还有关于目标地址是什么、它是什么类型的引用(如绝对或相对;16位、24位、32位、64位等)的附加信息

那里的零值不一定是占位符,而是用来计算结果的基值。例如,如果指令出于任何原因-
调用5+外部地址
,则目标代码中可能存在
5
e8 05 00

如果要查看执行时的地址,请在调试器下运行程序,在该指令处放置断点,然后在指令执行前查看该指令


一种常见的反病毒、增强安全性的功能称为ASLR(),它故意在不一致的地址加载程序段,以阻止恶意代码更改程序或数据。在此环境中运行的程序可能在程序运行一段时间后才分配某些目标地址


(与此相关的是,VAX/VMS特别有一个复杂的修正模式,其中一个方程描述了计算值所需的运算。运算包括加法、减法、乘法、除法、移位、旋转,可能还有其他。我从未见过实际使用它,但思考如何应用上限是很有趣的能力。)

但您清楚地知道如何执行所有这些操作。您知道如何在链接之前进行反汇编,而只是在链接之后进行反汇编,以查看链接器如何修改这些说明

asm(".globl _start; _start: nop\n");

unsigned int foo ( unsigned int x )
{
    return(x+5);
}
unsigned int moo ( unsigned int x )
{
    return(foo(x)+3);
}

int main ( void )
{
    return(moo(3)+2);
}

0000000000000000 <_start>:
   0:   90                      nop

0000000000000001 <foo>:
   1:   55                      push   %rbp
   2:   48 89 e5                mov    %rsp,%rbp
   5:   89 7d fc                mov    %edi,-0x4(%rbp)
   8:   8b 45 fc                mov    -0x4(%rbp),%eax
   b:   83 c0 05                add    $0x5,%eax
   e:   5d                      pop    %rbp
   f:   c3                      retq   

0000000000000010 <moo>:
  10:   55                      push   %rbp
  11:   48 89 e5                mov    %rsp,%rbp
  14:   48 83 ec 08             sub    $0x8,%rsp
  18:   89 7d fc                mov    %edi,-0x4(%rbp)
  1b:   8b 45 fc                mov    -0x4(%rbp),%eax
  1e:   89 c7                   mov    %eax,%edi
  20:   e8 00 00 00 00          callq  25 <moo+0x15>
  25:   83 c0 03                add    $0x3,%eax
  28:   c9                      leaveq 
  29:   c3                      retq   

000000000000002a <main>:
  2a:   55                      push   %rbp
  2b:   48 89 e5                mov    %rsp,%rbp
  2e:   bf 03 00 00 00          mov    $0x3,%edi
  33:   e8 00 00 00 00          callq  38 <main+0xe>
  38:   83 c0 02                add    $0x2,%eax
  3b:   5d                      pop    %rbp
  3c:   c3                      retq   


0000000000001000 <_start>:
    1000:   90                      nop

0000000000001001 <foo>:
    1001:   55                      push   %rbp
    1002:   48 89 e5                mov    %rsp,%rbp
    1005:   89 7d fc                mov    %edi,-0x4(%rbp)
    1008:   8b 45 fc                mov    -0x4(%rbp),%eax
    100b:   83 c0 05                add    $0x5,%eax
    100e:   5d                      pop    %rbp
    100f:   c3                      retq   

0000000000001010 <moo>:
    1010:   55                      push   %rbp
    1011:   48 89 e5                mov    %rsp,%rbp
    1014:   48 83 ec 08             sub    $0x8,%rsp
    1018:   89 7d fc                mov    %edi,-0x4(%rbp)
    101b:   8b 45 fc                mov    -0x4(%rbp),%eax
    101e:   89 c7                   mov    %eax,%edi
    1020:   e8 dc ff ff ff          callq  1001 <foo>
    1025:   83 c0 03                add    $0x3,%eax
    1028:   c9                      leaveq 
    1029:   c3                      retq   

000000000000102a <main>:
    102a:   55                      push   %rbp
    102b:   48 89 e5                mov    %rsp,%rbp
    102e:   bf 03 00 00 00          mov    $0x3,%edi
    1033:   e8 d8 ff ff ff          callq  1010 <moo>
    1038:   83 c0 02                add    $0x2,%eax
    103b:   5d                      pop    %rbp
    103c:   c3                      retq   
asm(“.globl\u start;\u start:nop\n”);
无符号整数foo(无符号整数x)
{
返回(x+5);
}
无符号整数moo(无符号整数x)
{
返回(foo(x)+3);
}
内部主(空)
{
回报率(moo(3)+2);
}
0000000000000000 :
0:90不
0000000000000001 :
1:55%rbp
2:48 89 e5 mov%rsp,%rbp
5:89 7d fc mov%edi,-0x4(%rbp)
8:8b 45 fc mov-0x4(%rbp),%eax
b:83 c0 05添加$0x5,%eax
e:5d pop%rbp
f:c3 retq
0000000000000010 :
10:55%rbp
11:48 89 e5 mov%rsp,%rbp
14:48 83 ec 08分$0x8,%rsp
18:89 7d fc mov%edi,-0x4(%rbp)
1b:8b 45 fc mov-0x4(%rbp),%eax
1e:89 c7 mov%eax%edi
20:e8 00 00 callq 25
25:83 c0 03添加$0x3,%eax
28:c9-Q
29:c3 retq
00000000000000 2A:
2a:55%的rbp
2b:48 89 e5 mov%rsp,%rbp
2e:bf 03 00 mov$0x3,%edi
33:e8 00呼叫38
38:83 C002添加$0x2,%eax
3b:5d pop%rbp
3c:c3 retq
0000000000001000 :
1000:90不
0000000000001001 :
1001:55%rbp
1002:48 89 e5 mov%rsp,%rbp
1005:89 7d fc mov%edi,-0x4(%rbp)
1008:8b 45 fc mov-0x4(%rbp),%eax
100b:83 c0 05添加$0x5,%eax
100e:5d pop%rbp
gdb ./program
(gdb) start
(gdb) disassemble main
asm(".globl _start; _start: nop\n");

unsigned int foo ( unsigned int x )
{
    return(x+5);
}
unsigned int moo ( unsigned int x )
{
    return(foo(x)+3);
}

int main ( void )
{
    return(moo(3)+2);
}

0000000000000000 <_start>:
   0:   90                      nop

0000000000000001 <foo>:
   1:   55                      push   %rbp
   2:   48 89 e5                mov    %rsp,%rbp
   5:   89 7d fc                mov    %edi,-0x4(%rbp)
   8:   8b 45 fc                mov    -0x4(%rbp),%eax
   b:   83 c0 05                add    $0x5,%eax
   e:   5d                      pop    %rbp
   f:   c3                      retq   

0000000000000010 <moo>:
  10:   55                      push   %rbp
  11:   48 89 e5                mov    %rsp,%rbp
  14:   48 83 ec 08             sub    $0x8,%rsp
  18:   89 7d fc                mov    %edi,-0x4(%rbp)
  1b:   8b 45 fc                mov    -0x4(%rbp),%eax
  1e:   89 c7                   mov    %eax,%edi
  20:   e8 00 00 00 00          callq  25 <moo+0x15>
  25:   83 c0 03                add    $0x3,%eax
  28:   c9                      leaveq 
  29:   c3                      retq   

000000000000002a <main>:
  2a:   55                      push   %rbp
  2b:   48 89 e5                mov    %rsp,%rbp
  2e:   bf 03 00 00 00          mov    $0x3,%edi
  33:   e8 00 00 00 00          callq  38 <main+0xe>
  38:   83 c0 02                add    $0x2,%eax
  3b:   5d                      pop    %rbp
  3c:   c3                      retq   


0000000000001000 <_start>:
    1000:   90                      nop

0000000000001001 <foo>:
    1001:   55                      push   %rbp
    1002:   48 89 e5                mov    %rsp,%rbp
    1005:   89 7d fc                mov    %edi,-0x4(%rbp)
    1008:   8b 45 fc                mov    -0x4(%rbp),%eax
    100b:   83 c0 05                add    $0x5,%eax
    100e:   5d                      pop    %rbp
    100f:   c3                      retq   

0000000000001010 <moo>:
    1010:   55                      push   %rbp
    1011:   48 89 e5                mov    %rsp,%rbp
    1014:   48 83 ec 08             sub    $0x8,%rsp
    1018:   89 7d fc                mov    %edi,-0x4(%rbp)
    101b:   8b 45 fc                mov    -0x4(%rbp),%eax
    101e:   89 c7                   mov    %eax,%edi
    1020:   e8 dc ff ff ff          callq  1001 <foo>
    1025:   83 c0 03                add    $0x3,%eax
    1028:   c9                      leaveq 
    1029:   c3                      retq   

000000000000102a <main>:
    102a:   55                      push   %rbp
    102b:   48 89 e5                mov    %rsp,%rbp
    102e:   bf 03 00 00 00          mov    $0x3,%edi
    1033:   e8 d8 ff ff ff          callq  1010 <moo>
    1038:   83 c0 02                add    $0x2,%eax
    103b:   5d                      pop    %rbp
    103c:   c3                      retq   
20:   e8 00 00 00 00        callq  25 <moo+0x15>
1033: e8 d8 ff ff ff        callq  1010 <moo>