объясните плз, не совсем понятно: почему прога, написанная на Fasm'е получается намного меньше, чем аналогичная на GAS'е? может я в GAS'е опцию какую-нибудь пропускаю? хотя все делаю по книжке Зубкова.
Дазассемблируй фасмовский вариант - fasm так и наровит чего-нить оптимизировать. Сравни заголовки PE, может там разное выравнивание секций или даже gasm еще одну секцию прибавил.
Я в этом мало понимаю, но попробую угадать: дело в статической линковке libc при использовании GNU tools. PS Кстати, fasm port with libc тоже существует.
не похоже, что дело в libc, я ведь писал код без использования его библиотек. на первый взгляд GAS прибавил в конец программы какой-то код, который можно без проблем выкусить обычным редактором и все будет работать. щас посмотрю че там добавляется
все понятно, что ничего не понятно дизасмлю objdump'ом GAS'овский ELF (тот, который с доп. куском кода) - все нормально, но в листинге ни намека на этот лишний кусок. то же самое делаю с Fasm'овским ELF'ом - листинга нет, только написан тип файла. после этого вырезаю из первого ELF'а лишний код, прога исполняется нормально. пытаюсь дизассемблить - хрен там, пишет "file truncated" сдается мне, что эта лишняя бодяга описывает формат файла (наверно я ошибаюсь)
Сравнение нужно начинать со сравнения количества секций в обоих вариантах файлов, и вообще не было сказано насколько различаются запускные файлы.. Я честно говоря даже не знаю есть ли в elf файлах секции %)
дык, как я сравню кол-во секций в исполняемых файлах, когда из них могу дизассемблировать только 1 к тому же в листинге этой программы все нормально, 2 секции, как я и объявлял, но глазами-то я вижу, что там еще какая-то зараза притаилась! может там и есть какая-то доп. секция, но как мне получить ее код? В итоге у меня получается fasm-elf ок.150-160 байт, а gas-elf ок.450-500 байт. Не измененный код gas'a дизасмится нормально, а fasm'a - нет.
Код (Text): -bash.no_hist-2.05b$ objdump -x gas gas: file format elf32-i386 gas architecture: i386, flags 0x00000102: EXEC_P, D_PAGED start address 0x08048074 Program Header: LOAD off 0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12 filesz 0x0000008f memsz 0x0000008f flags r-x LOAD off 0x00000090 vaddr 0x08049090 paddr 0x08049090 align 2**12 filesz 0x00000009 memsz 0x0000000c flags rw- Sections: Idx Name Size VMA LMA File off Algn 0 .text 0000001b 08048074 08048074 00000074 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .got.plt 00000000 08049090 08049090 0000009c 2**0 CONTENTS 2 .data 00000009 08049090 08049090 00000090 2**2 CONTENTS, ALLOC, LOAD, DATA 3 .bss 00000000 0804909c 0804909c 0000009c 2**2 ALLOC и вот fasm -bash.no_hist-2.05b$ objdump -x fasm fasm: file format elf32-i386 fasm architecture: i386, flags 0x00000102: EXEC_P, D_PAGED start address 0x08048074 Program Header: LOAD off 0x00000074 vaddr 0x08048074 paddr 0x08048074 align 2**12 filesz 0x0000001b memsz 0x0000001b flags r-x LOAD off 0x0000008f vaddr 0x0804908f paddr 0x0804908f align 2**12 filesz 0x0000000a memsz 0x0000000a flags r--
readelf -e fasm просто "падает" Код (Text): Section to Segment mapping: Segment Sections... assertion "string_table != NULL" failed: file "/opt/usr/src/gnu/usr.bin/binutils/readelf/../../../../contrib/binutil s/binutils/readelf.c", line 2916 Abort trap (core dumped)
freeze_foton Просто ты не стандартно слепил файл, т.е. не так как это принято, видимо у fasm'ового файла получилась только одна секция, gas же всё сделал автоматом, раскидал все данные куда нужно, т.е. данные отдельно код отдельно. А так вот тебе дизассемблированный листинг, кстати действительно размер отличается из-за количества секций: Код (Text): LOAD:08048074 ; File Name : C:\Downloads\1408094176__tst_fasm LOAD:08048074 ; Format : ELF (Executable) LOAD:08048074 ; LOAD:08048074 LOAD:08048074 model flat LOAD:08048074 LOAD:08048074 ; ====================================================================== ===== LOAD:08048074 LOAD:08048074 ; Segment type: Pure code LOAD:08048074 ; Segment permissions: Read/Execute LOAD:08048074 LOAD segment mempage public 'CODE' use32 LOAD:08048074 assume cs:LOAD LOAD:08048074 ;org 8048074h LOAD:08048074 assume es:nothing, ss:nothing, ds:LOAD, fs:nothing, gs:nothing LOAD:08048074 LOAD:08048074 ; --------------- S U B R O U T I N E --------------------------------------- LOAD:08048074 LOAD:08048074 LOAD:08048074 public start LOAD:08048074 start proc near LOAD:08048074 BA 0A 00 00 00 mov edx, 0Ah LOAD:08048079 B9 8F 90 04 08 mov ecx, offset unk_804908F LOAD:0804807E 31 DB xor ebx, ebx LOAD:08048080 43 inc ebx LOAD:08048081 B8 04 00 00 00 mov eax, 4 LOAD:08048086 CD 80 int 80h ; LINUX - sys_write LOAD:08048088 31 DB xor ebx, ebx LOAD:0804808A 89 D8 mov eax, ebx LOAD:0804808C 40 inc eax LOAD:0804808D CD 80 int 80h ; LINUX - sys_exit LOAD:0804808D start endp LOAD:0804808D LOAD:0804808D LOAD ends LOAD:0804808D LOAD:0804908F ; ====================================================================== ===== LOAD:0804908F LOAD:0804908F ; Segment type: Pure data LOAD:0804908F ; Segment permissions: Read LOAD:0804908F LOAD segment mempage public 'DATA' use32 LOAD:0804908F assume cs:LOAD LOAD:0804908F ;org 804908Fh LOAD:0804908F 54 unk_804908F db 54h ; T ; DATA XREF: start+5o LOAD:08049090 65 db 65h ; e LOAD:08049091 73 db 73h ; s LOAD:08049092 74 db 74h ; t LOAD:08049093 5F db 5Fh ; _ LOAD:08049094 6D db 6Dh ; m LOAD:08049095 6F db 6Fh ; o LOAD:08049096 64 db 64h ; d LOAD:08049097 0A db 0Ah LOAD:08049098 0D db 0Dh LOAD:08049098 LOAD ends LOAD:08049098 LOAD:08049098 LOAD:08049098 end start
<font color="red]GAS:</font><!--color--> Код (Text): +- Num Name Type Flg VirtAddr Offset Size Link Info Algn-+ ¦ 0 NULL ... 00000000 00000000 00000000 0 0 0 ¦ ¦ 1 .text PROG XA. 08048074 00000074 0000001B 0 0 4 ¦ ¦ 2 .got.plt PROG ..W 08049090 0000009C 00000000 0 0 1 ¦ ¦ 3 .data PROG .AW 08049090 00000090 00000009 0 0 4 ¦ ¦ 4 .bss BSS .AW 0804909C 0000009C 00000000 0 0 4 ¦ ¦ 5 .shstrtab STR ... 00000000 0000009C 00000025 0 0 1 ¦ ¦ ¦ А у fasm'овского HiEW не показывает, видимо потому что одна секция а он такого не ожидал
Как одна секция??? Asterix, у тебя в листинге же видно, что секций две, как я и объявлял! секция кода и секция данных...
freeze_foton Нет, секция одна, LOAD, уж не знаю Ида ее так автоматом обозвала или она у тебя в реале так называется
Вот здесь действительно две: Код (Text): .text:08048074 ; File Name : C:\Distr\_1328689072__tst_gas .text:08048074 ; Format : ELF (Executable) .text:08048074 ; .text:08048074 .text:08048074 model flat .text:08048074 .text:08048074 ; ====================================================================== ===== .text:08048074 .text:08048074 ; Segment type: Pure code .text:08048074 ; Segment permissions: Read/Execute .text:08048074 _text segment dword public 'CODE' use32 .text:08048074 assume cs:_text .text:08048074 ;org 8048074h .text:08048074 assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing .text:08048074 .text:08048074 ; --------------- S U B R O U T I N E --------------------------------------- .text:08048074 .text:08048074 .text:08048074 public start .text:08048074 start proc near .text:08048074 BA 0A 00 00 00 mov edx, 0Ah .text:08048079 B9 90 90 04 08 mov ecx, offset unk_8049090 .text:0804807E 31 DB xor ebx, ebx .text:08048080 43 inc ebx .text:08048081 B8 04 00 00 00 mov eax, 4 .text:08048086 CD 80 int 80h ; LINUX - sys_write .text:08048088 31 DB xor ebx, ebx .text:0804808A 89 D8 mov eax, ebx .text:0804808C 40 inc eax .text:0804808D CD 80 int 80h ; LINUX - sys_exit .text:0804808D start endp .text:0804808D .text:0804808D _text ends .text:0804808D .data:08049090 ; ====================================================================== ===== .data:08049090 .data:08049090 ; Segment type: Pure data .data:08049090 ; Segment permissions: Read/Write .data:08049090 _data segment dword public 'DATA' use32 .data:08049090 assume cs:_data .data:08049090 ;org 8049090h .data:08049090 74 unk_8049090 db 74h ; t ; DATA XREF: start+5o .data:08049091 65 db 65h ; e .data:08049092 73 db 73h ; s .data:08049093 74 db 74h ; t .data:08049094 5F db 5Fh ; _ .data:08049095 6D db 6Dh ; m .data:08049096 6F db 6Fh ; o .data:08049097 64 db 64h ; d .data:08049098 0A db 0Ah .data:08049098 _data ends .data:08049098 .data:08049098 .data:08049098 end start
опа! вот, похоже, где собака порылась! я же по именам эти секции не объявлял! писал только: section readable executable ... section readable тогда другой вопрос: как мне можно обозвать секцию? пробовал так: section "code" readable executable но фасм ругался
> тогда другой вопрос: как мне можно обозвать секцию? пробовал так Попробуй порыться на форуме fasm'а, если не найдешь ответа задай там вопрос http://board.flatassembler.net/ я честно говоря не в курсе может ли fasm именовать секции в elf файлах, возможно для этого нужно отдельно использовать линкер.