Здравствуйте товарищи.Вот мне потребовалось дизассемблировать несколько o-файлов, и сразу наткнулся
на непонятную вещь.Дизассемблирование провожу через команду objdump -d ./file.o
И вот что вижу в коде
000012b8 <ProgInit>:
12b8: 55 push Кp
12b9: 89 e5 mov %esp,Кp
12bb: 83 ec 08 sub $0x8,%esp
12be: e8 fc ff ff ff call 12bf <ProgInit+0x7>
12c3: c7 05 00 00 00 00 01 movl $0x1,0x0
12ca: 00 00 00
12cd: c7 05 00 00 00 00 01 movl $0x1,0x0
12d4: 00 00 00
12d7: 83 ec 0c sub $0xc,%esp
12da: 6a 01 push $0x1
12dc: e8 fc ff ff ff call 12dd <ProgInit+0x25>
12e1: 83 c4 10 add $0x10,%esp
12e4: c7 05 00 00 00 00 00 movl $0x0,0x0
12eb: 00 00 00
12ee: c7 05 08 00 00 00 0d movl $0xd,0x8
12f5: 00 00 00
12f8: c7 05 0c 00 00 00 00 movl $0x0,0xc
12ff: 00 00 00
...Меня беспокоят конструкции "e8 fc ff ff ff". Какой-то странный call, который указывает
на середину этой же иструкции - по идее, после этой команды должен начать
выполняться код "fc ff ff ff ...". Какой в этом смысл? Что обозначают эти
странные call - вызовы?Сразу скажу, что исходный текст был написан на чистом C, без всяких
ухищрений в стиле анти-дебуггинга. Сейчас код утерян, а функции нужно
немного изменить, а я не могу начать из-за вот этой непонятки.
Добавь ключик -r и сразу всё станет ясно.
>Добавь ключик -r и сразу всё станет ясно.Мда, теперь понятнее, я заодно написал тестову маленьку программку и
посмотрел как она компилится. В o-файле конструкции e8 fc ff ff ff - это
затычки для вызовов функции. В скопилированном бинарнике она преобразуется
в e8 xxxx с реальным адресом подпрограммы.Теперь ещо есть вопрос - реально ли получить код, который можно
тупо в ассемблер пихать? При опции -r там такое форматирование
появляеся, что все места вызовов фоункций и обращений к переменным,
надо ручками исправлять.Еще вопрос - нигде пока не нашел ответа. Понимают ли последние
версии IDA формат gcc o-файлов? ELF-бинарники IDA давно умела понимать,
а как обстоит дело с ошниками - непонятно. На сайте вооще инфы
о поддерживаемых форматах файлов не нашел, только поддерживаемые
платформы.(Я конечно могу скомпилить ELF бинарник и скормить IDA, но в *.o файлах больше
инфы лежит, хотя бы есть имена переменных, которые отсутствуют в бинарнике.)
>Еще вопрос - нигде пока не нашел ответа. Понимают ли последние
>версии IDA формат gcc o-файлов? ELF-бинарники IDA давно умела понимать,
>а как обстоит дело с ошниками - непонятно.Должна понимать. o-файлы это тоже ELF.
Кстати, народ, нашел одну весч, она вам понравица!Называется obj2asm. Декомпилит линуховые o-шники
в формат MASM, классическая Intel-нотация, никаких
AT&T извратов. Можно сразу засунуть полученый код
в ассемблер и скомпилить!Описание здесь
http://www.digitalmars.com/ctg/obj2asm.htmlСкачать здесь
http://ftp.digitalmars.com/dmd.zip (~4Mb).НО! Есть одно НО которое портит все...
Эта штука вылетает с Segmentation Fault на середине
дизассемблирования крупных o-файлов. А крупные o-файлы
это файлы больше ~10Kb... Маленькие файлы 3-5Kb декомпилятся без
нареканий, а вот чуть больше - имеем сегфолт. Причем
запустив под gdb, вижу, что вылетает на функции strlen(),
библиотеки /lib/libc.so.6Что теперь делать - незнаю.. Почему-то в комплекте нет
исходников для obj2asm, излазил весь сайт. Попробовал
под разными линухами AltMaster2.4, RedHat9 - та же песня.Вот уткнулся в такую бяку. Кто чем может помоч?
Можеь есть у кого более старая версия этой проги, которая
не глючит?