избыточные операции в разобранном коде c - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть файл .c, содержащий следующий код:

void func(){
    char* string = "hello";
}

, который я компилирую и связываю, используя

i386-elf-gcc -ffreestanding -c pointers.c -o pointers.o
i386-elf-ld -o pointers.bin -Ttext 0x0 --oformat binary pointers.o

, а затем разбираю, используя ndisasm -b 32 pointers.bin.Это дает:

00000000  55                push ebp
00000001  89E5              mov ebp,esp
00000003  83EC10            sub esp,byte +0x10
00000006  C745FC0F000000    mov dword [ebp-0x4],0xf
0000000D  C9                leave
0000000E  C3                ret
0000000F  68656C6C6F        push dword 0x6f6c6c65
00000014  0000              add [eax],al
00000016  0000              add [eax],al
00000018  1400              adc al,0x0
0000001A  0000              add [eax],al
0000001C  0000              add [eax],al
0000001E  0000              add [eax],al
00000020  017A52            add [edx+0x52],edi
00000023  0001              add [ecx],al
00000025  7C08              jl 0x2f
00000027  011B              add [ebx],ebx
00000029  0C04              or al,0x4
0000002B  0488              add al,0x88
0000002D  0100              add [eax],eax
0000002F  001C00            add [eax+eax],bl
00000032  0000              add [eax],al
00000034  1C00              sbb al,0x0
00000036  0000              add [eax],al
00000038  C8FFFFFF          enter 0xffff,0xff
0000003C  0F0000            sldt [eax]
0000003F  0000              add [eax],al
00000041  41                inc ecx
00000042  0E                push cs
00000043  088502420D05      or [ebp+0x50d4202],al
00000049  4B                dec ebx
0000004A  C50C04            lds ecx,[esp+eax]
0000004D  0400              add al,0x0
0000004F  00                db 0x00

Верхние 7 строк четко соответствуют коду c, показанному выше.Однако какая польза от всего этого после строки 7?Изучение корзины с использованием xxd не показывает понятный текст, поэтому они не кажутся комментариями.Это связано с моими параметрами компилятора / компоновщика?

1 Ответ

0 голосов
/ 13 декабря 2018
0000000F  68656C6C6F        push dword 0x6f6c6c65

68 65 6c 6c 6f - это строка "hello" из раздела .rodata объектного файла.Разборка бессмысленна.

Остальные данные, которые вы просматриваете, - это содержимое раздела .eh_frame. Эти данные используются для обработки исключений , хотя в этом случае они не используются.Как и в разделе .rodata, разборка этих данных является бессмысленной.

Вы можете просмотреть содержимое этих разделов, а также несколько других разделов, которые не были скопированы в выходной файл -запустив objdump -D pointers.o.

Чтобы лучше контролировать формат двоичного вывода, вы можете написать скрипт компоновщика .

...