使用指令指针的偏移量反汇编目标文件
Disassembly of object file with offset from instruction pointer
this 书中提供了以下示例。
有两个 .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;
}
function.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);
function.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.o
到 add_and_multiply(,)
和 [=24= 中未解决的外部引用]ed nCompletionStatus
:
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
,因为前者仅尝试反汇编已知包含机器代码的部分。
this 书中提供了以下示例。
有两个 .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;
}
function.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);
function.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.o
到 add_and_multiply(,)
和 [=24= 中未解决的外部引用]ed nCompletionStatus
:
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
,因为前者仅尝试反汇编已知包含机器代码的部分。