Разборка объектного файла со смещением от указателя инструкции - PullRequest
0 голосов
/ 26 ноября 2018

Следующий пример представлен в этой книге.

Имеется два .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(,) и extern 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, кажется, имеет место.Как они эквивалентны?

1 Ответ

0 голосов
/ 26 ноября 2018

Книга, на которую вы ссылаетесь, использует 32-битную сборку, в то время как ваш компилятор генерирует 64-битную сборку.Передайте -m32 в gcc, чтобы вместо этого скомпилировать ваш C-код в 32-битный машинный код.Также рассмотрите возможность использования -d вместо -D для objdump, так как первый пытается разобрать только те секции, которые, как известно, содержат машинный код.

...