c-使用指令指针的偏移量反汇编对象文件



本书提供了以下示例。

有两个.c文件和一个.h文件。

main.c

#include "function.h"
extern int nCompletionStatus;
int main(int argc, char* argv[])
{
float x = 1.0;
float y = 5.0;
float z;
z = add_and_multiply(x,y);
nCompletionStatus = 1;
return 0;
}

函数.h

#pragma once
#define FIRST_OPTION
#ifdef FIRST_OPTION
#define MULTIPLIER (3.0)
#else
#define MULTIPLIER (2.0)
#endif
float add_and_multiply(float x, float y);

函数.c

#include "function.h"
int nCompletionStatus = 0;
float add(float x, float y)
{
float z = x + y;
return z;
}
float add_and_multiply(float x, float y)
{
float z = add(x,y);
z *= MULTIPLIER;
return z;
} 

要生成.o文件,提供以下命令:

gcc -c function.c main.c

然后,要查看main.o的内容,我们有:

objdump -D -M intel main.o

作者在他的书中列出了objdump输出的(片段(内容,从而集中于main.oadd_and_multiply(,)externednCompletionStatus:中未解决的外部引用

27: 89 04 24             mov    DWORD PTR [esp],eax
2a: e8 fc ff ff ff       call   2b <main + 0x2b>    ;//highlighted (a) by author
2f: d9 5c 24 1c          fstp   DWORD PTR [esp+0x1c]
33: c7 05 00 00 00 00 01 mov    DWORD PTR ds:0x0,0x1 ;//highlighted (b) by author

在我的机器上,与作者生产的略有不同,我得到了以下objdump的输出(仅限相关部件(:

3c: e8 00 00 00 00       call   41 <main+0x41>;//Equivalent to highlight (a) of author?
41: 66 0f 7e c0          movd   eax,xmm0
45: 89 45 fc             mov    DWORD PTR [rbp-0x4],eax
48: c7 05 00 00 00 00 01 mov    DWORD PTR [rip+0x0],0x1        # 52 <main+0x52>;//equivalent to highlight (b) of author?

我的问题如上文所述。也就是说,我的机器(运行gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)(上的输出如何与作者报告的内容等效?

特别是,在作者的版本中,在高亮显示(b(中,似乎访问了ds:,而在我的版本中似乎有rip寄存器的一些偏移。它们的等效性如何?

您提到的书使用32位汇编,而编译器发出64位汇编。将-m32传递给gcc,将C代码编译为32位机器代码。还可以考虑对objdump使用-d而不是-D,因为前者只试图反汇编已知包含机器代码的部分。

最新更新