LINUX.ORG.RU

Размер helloworld в gas

 , , ,


0

2

Сегодня я решыл поэкспериментировать с размером выходного файла от разных ассемблеров. У Fasm вышло 160 байт, а у GAS/NASM 344 байт. Можно ли сделать на Gas такой-же размер как у фасма, и как?



Последнее исправление: Klymedy (всего исправлений: 1)

А можно дизасм обоих бинарей? Интересно, что ещё туда gas положил. Может там какая дебаг-инфа прицепилась...

true_admin ★★★★★
()
Ответ на: комментарий от anonymous

нет, не про обьэктный модуль. Дизасм: GAS:

hello:     file format elf32-i386


Disassembly of section .text:

08048074 <.text>:
 8048074:	b8 04 00 00 00       	mov    $0x4,%eax
 8048079:	bb 01 00 00 00       	mov    $0x1,%ebx
 804807e:	b9 94 90 04 08       	mov    $0x8049094,%ecx
 8048083:	ba 0a 00 00 00       	mov    $0xa,%edx
 8048088:	cd 80                	int    $0x80
 804808a:	b8 01 00 00 00       	mov    $0x1,%eax
 804808f:	31 db                	xor    %ebx,%ebx
 8048091:	cd 80                	int    $0x80

Disassembly of section .data:

08049094 <.data>:
 8049094:	68 65 6c 6c 6f       	push   $0x6f6c6c65
 8049099:	2c 65                	sub    $0x65,%al
 804909b:	6c                   	insb   (%dx),%es:(%edi)
 804909c:	66                   	data16
 804909d:	0a                   	.byte 0xa
Фасм: Фасмовый файл objdump-ом не дизасемблерируеться, посоветуйте дизассемблер.

ilya08
() автор топика
Ответ на: комментарий от ilya08

К-стати после обрезки фасм helloworld-а strip-ом размер увеличиваеться до 203 байта и при запуске вылезает Segmentation Failed

ilya08
() автор топика
Ответ на: комментарий от true_admin

gas:


.data
msg: .ascii "Hello,world!\n"
len = . - msg
 
.text
.globl _start
_start:
movl $4,%eax
movl $1,%ebx
movl $msg,%ecx
movl $len,%edx
int $0x80
 
xorl %ebx,%ebx
movl $1,%eax
int $0x80
fasm:
format ELF executable 3
entry start
 
segment readable executable
 
start:
        mov     eax,4
        mov     ebx,1
        mov     ecx,msg
        mov     edx,msg_size
        int     0x80
 
        mov     eax,1
        xor     ebx,ebx
        int     0x80
 
segment readable writeable
 
msg db 'Hello world!',0xA
msg_size = $-msg

ilya08
() автор топика
Ответ на: комментарий от true_admin

Это не теория, оно генерит минимальный ELF. Такое же можно сделать кастомными скриптами линкера для гас/гцц. Ещё можно даже меньше NASM-а сделать колдунством с выравниванием.

anonymous
()
Ответ на: комментарий от ilya08

Затем что nasm линкует своим линкером, а ты ld. Пока не сделаешь для ld скрипты для минимального ELF будешь и дальше ламером с огромным экзешником, сынок.

anonymous
()
Ответ на: комментарий от true_admin

и да! Посмотрел hexeditor-ом фоасмовый файл, там нету разделений на секции. Возможно сделать такой же бинарник на ld/gas?

ilya08
() автор топика
Ответ на: комментарий от ilya08

Написать просто - берёшь стандартный и выкидываешь оттуда всё, кроме одной секции и указываешь что у тебя только _start и он в той секции. И строку перетаскиваешь в конец кода. Однако секция будет полная, её можно будет ещё обрезать, но это уже objcopy.

anonymous
()
Ответ на: комментарий от anonymous

А где взять стандартный скрипт? Исходник ld что-ли копать?

ilya08
() автор топика
Ответ на: комментарий от ilya08

Посмотрел hexeditor-ом фоасмовый файл

objcopy -x поможет :).

такой же бинарник на ld/gas?

Честно, не знаю :( Слушай анонимусов :).

true_admin ★★★★★
()

Вот есть замечательные ссылки

http://opennet.ru/base/dev/elf_sml.txt.html

http://www.insidepro.com/kk/137/137r.shtml

Кроме того, есть утилита sstrip из комплекта elfkickers. Если готовый бинарь пропустить через него, прога от этого не перестает корректно запускаться, но вот objdump работать с ней отказываеся. Если попробовать radare2 на таком файле, он глючит, valgrind при этом показывает какие-то ошибки с памятью, кастую XVilka по этому поводу. GDB не может определить там точку входа. Однако, readelf -h filename ее показывает правильно. Думаю, надо отдельный тред создать про реверсинг и ассемблер в операционных системах GNU/Linux

SZT ★★★★★
()
Ответ на: комментарий от ilya08

Советую GDB-ом ставить брейкпоинт на точку входа, типа break *0xdeadbeef, потом запускать и дизассемблировать, точка входа узнается чере readelf.

Есть еще http://sourceforge.net/projects/hte/ и http://www.radare.org/y/ я их пока пытаюсь осилить

В radare2 уже нашел баги, см. сообщение выше. В GDB тоже есть некоторые проблемы, мой багрепорт http://sourceware.org/bugzilla/show_bug.cgi?id=15299

SZT ★★★★★
()
Ответ на: комментарий от SZT

Какая версия radare2? Недавно вышел релиз 0.9.4 - его пробовали? Если ошибка все еще проявляется (и на git тоже) - то нужен тестовый бинарь для исправления ошибки.

Думаю, надо отдельный тред создать про реверсинг и ассемблер в операционных системах GNU/Linux

Поддерживаю

XVilka ★★★★★
()
Последнее исправление: XVilka (всего исправлений: 1)
Ответ на: комментарий от SZT

Ок, я баг создал, завтра посмотрю (или pancake его раньше посмотрит) (скомпилировал фасмовый файл, и открыл его свежим radare2)

XVilka ★★★★★
()
Последнее исправление: XVilka (всего исправлений: 1)
Ответ на: комментарий от XVilka

Какая версия radare2? Недавно вышел релиз 0.9.4 - его пробовали? Если ошибка все еще проявляется (и на git тоже) - то нужен тестовый бинарь для исправления ошибки.

dev-util/radare2-0.9 из pentoo оверлея стоит

Вот простейший пример на GAS http://dump.bitcheese.net/files/ivyxeni/gas_hello.tar.gz/preview

SZT ★★★★★
()
Ответ на: комментарий от SZT

Ох, я обновить его в pentoo забыл. Рекомендую эти два ebuild-а, сам пользуюсь git-ом https://github.com/XVilka/gentoo-overlay/tree/master/dev-util/valabind и https://github.com/XVilka/gentoo-overlay/tree/master/dev-util/radare2

А с самими неполными elf-файлами разберемся.

XVilka ★★★★★
()
Последнее исправление: XVilka (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.