OSDev http://osdev.su/ |
|
Неправильный адрес x86_64: GCC -m32 +LD > 32 bit binary. http://osdev.su/viewtopic.php?f=6&t=630 |
Страница 1 из 1 |
Автор: | 418ImATeapot [ 17 сен 2012, 20:58 ] |
Заголовок сообщения: | Неправильный адрес x86_64: GCC -m32 +LD > 32 bit binary. |
У меня есть код: Код: int i=0xABCDEF; void DoIt() { int a; a=100; } void kmain() { int j; j=i+1; DoIt(); } Я его компилирую: Код: gcc -m32 -c kmain.c -o obj/kernel.o ld -mi386linux --oformat=binary -Ttext=0x100000 -o bin/kernel -O binary -M -N obj/kmain.o > lst/kernel.mem И получаю: Код: push ebp mov ebp, esp sub esp, 0x4 mov eax, 0x64 mov [ebp-0x4], eax leave ret push ebp mov ebp, esp sub esp, 0x4 mov eax, [0x100060] add eax, 0x1 mov [ebp-0x4], eax call dword 0x0;КАКОГО??? leave ret add [eax], al add [eax], al add [eax], al add [eax], al add [eax], al add [eax], al add [eax], al add [eax], al add bh, ch int 0xab invalid Три дня на одном месте топчусь. Подскажите, пожалуйста, как быть. |
Автор: | Nable [ 22 сен 2012, 17:21 ] |
Заголовок сообщения: | Re: Неправильный адрес x86_64: GCC -m32 +LD > 32 bit binary. |
418ImATeapot писал(а): Я его компилирую: Код: gcc -m32 -c kmain.c -o obj/kernel.o ld -mi386linux --oformat=binary -Ttext=0x100000 -o bin/kernel -O binary -M -N obj/kmain.o > lst/kernel.mem Отличная идея: первая строчка генерит obj/kernel.o , а вторая берёт на вход obj/kmain.o . Где связь между строчками? Они же работают с разными файлами. |
Автор: | 418ImATeapot [ 23 сен 2012, 12:52 ] |
Заголовок сообщения: | Re: Неправильный адрес x86_64: GCC -m32 +LD > 32 bit binary. |
Nable писал(а): 418ImATeapot писал(а): Я его компилирую: Код: gcc -m32 -c kmain.c -o obj/kernel.o ld -mi386linux --oformat=binary -Ttext=0x100000 -o bin/kernel -O binary -M -N obj/kmain.o > lst/kernel.mem Отличная идея: первая строчка генерит obj/kernel.o , а вторая берёт на вход obj/kmain.o . Где связь между строчками? Они же работают с разными файлами. Спасибо, исправил. Все равно, call dword 0x0. |
Автор: | Nable [ 23 сен 2012, 20:24 ] |
Заголовок сообщения: | Re: Неправильный адрес x86_64: GCC -m32 +LD > 32 bit binary. |
А что не так? Разбираешь, поди, командой типа Код: objdump -b binary -m i386 -Mintel -D kernel.bin В бинарнике ни слова про базовый адрес, в параметрах ты его тоже не указал, так что objdump принимает его равным нулю. А в call'ах используются относительные адреса (смещения которые надо прибавить к указателю инструкций), вот и получается: Код: $ objdump -b binary -m i386 -Mintel -D kernel.bin kernel.bin: file format binary Disassembly of section .data: 00000000 <.data>: 0: 55 push ebp 1: 89 e5 mov ebp,esp 3: 83 ec 10 sub esp,0x10 6: c7 45 fc 64 00 00 00 mov DWORD PTR [ebp-0x4],0x64 d: c9 leave e: c3 ret f: 55 push ebp 10: 89 e5 mov ebp,esp 12: 83 ec 10 sub esp,0x10 15: a1 48 00 10 00 mov eax,ds:0x100048 1a: 83 c0 01 add eax,0x1 1d: 89 45 fc mov DWORD PTR [ebp-0x4],eax 20: e8 db ff ff ff call 0x0 25: c9 leave 26: c3 ret Ну вот я за тебя внимательно прочёл man objdump и вот чего получил: Код: $ objdump -b binary -m i386 -Mintel --adjust-vma=0x100000 -D kernel.bin kernel.bin: file format binary Disassembly of section .data: 00100000 <.data>: 100000: 55 push ebp 100001: 89 e5 mov ebp,esp 100003: 83 ec 10 sub esp,0x10 100006: c7 45 fc 64 00 00 00 mov DWORD PTR [ebp-0x4],0x64 10000d: c9 leave 10000e: c3 ret 10000f: 55 push ebp 100010: 89 e5 mov ebp,esp 100012: 83 ec 10 sub esp,0x10 100015: a1 48 00 10 00 mov eax,ds:0x100048 10001a: 83 c0 01 add eax,0x1 10001d: 89 45 fc mov DWORD PTR [ebp-0x4],eax 100020: e8 db ff ff ff call 0x100000 100025: c9 leave 100026: c3 ret Мысль ясна? |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |