Fasm < GAS

Тема в разделе "WASM.UNIX", создана пользователем freeze_foton, 24 окт 2004.

  1. freeze_foton

    freeze_foton New Member

    Публикаций:
    0
    Регистрация:
    22 окт 2004
    Сообщения:
    20
    объясните плз, не совсем понятно: почему прога, написанная на Fasm'е получается намного меньше, чем аналогичная на GAS'е? может я в GAS'е опцию какую-нибудь пропускаю? хотя все делаю по книжке Зубкова. :dntknw:
     
  2. B_108

    B_108 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    62
    Дазассемблируй фасмовский вариант - fasm так и наровит чего-нить оптимизировать.

    Сравни заголовки PE, может там разное выравнивание секций или даже gasm еще одну секцию прибавил.
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Я в этом мало понимаю, но попробую угадать:

    дело в статической линковке libc при использовании GNU tools.



    PS

    Кстати, fasm port with libc тоже существует.
     
  4. freeze_foton

    freeze_foton New Member

    Публикаций:
    0
    Регистрация:
    22 окт 2004
    Сообщения:
    20
    не похоже, что дело в libc, я ведь писал код без использования его библиотек.

    на первый взгляд GAS прибавил в конец программы какой-то код, который можно без проблем выкусить обычным редактором и все будет работать. щас посмотрю че там добавляется ;)
     
  5. freeze_foton

    freeze_foton New Member

    Публикаций:
    0
    Регистрация:
    22 окт 2004
    Сообщения:
    20
    все понятно, что ничего не понятно

    дизасмлю objdump'ом GAS'овский ELF (тот, который с доп. куском кода) - все нормально, но в листинге ни намека на этот лишний кусок. то же самое делаю с Fasm'овским ELF'ом - листинга нет, только написан тип файла. после этого вырезаю из первого ELF'а лишний код, прога исполняется нормально. пытаюсь дизассемблить - хрен там, пишет "file truncated"

    сдается мне, что эта лишняя бодяга описывает формат файла (наверно я ошибаюсь)
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Сравнение нужно начинать со сравнения количества секций в обоих вариантах файлов, и вообще не было сказано насколько различаются запускные файлы..



    Я честно говоря даже не знаю есть ли в elf файлах секции %)
     
  7. freeze_foton

    freeze_foton New Member

    Публикаций:
    0
    Регистрация:
    22 окт 2004
    Сообщения:
    20
    дык, как я сравню кол-во секций в исполняемых файлах, когда из них могу дизассемблировать только 1 :dntknw:

    к тому же в листинге этой программы все нормально, 2 секции, как я и объявлял, но глазами-то я вижу, что там еще какая-то зараза притаилась! может там и есть какая-то доп. секция, но как мне получить ее код?

    В итоге у меня получается fasm-elf ок.150-160 байт, а gas-elf ок.450-500 байт. Не измененный код gas'a дизасмится нормально, а fasm'a - нет.
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    freeze_foton

    Приаттач что-ли файлы, посмотрим что там у тя не "дизасмится"
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    freeze_foton

    Кстати, количество секций можно посмотреть вьювером, например HiEW.
     
  10. freeze_foton

    freeze_foton New Member

    Публикаций:
    0
    Регистрация:
    22 окт 2004
    Сообщения:
    20
  11. freeze_foton

    freeze_foton New Member

    Публикаций:
    0
    Регистрация:
    22 окт 2004
    Сообщения:
    20
  12. B_108

    B_108 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    62
    Код (Text):
    1.  
    2. -bash.no_hist-2.05b$ objdump -x gas
    3.  
    4. gas:     file format elf32-i386
    5. gas
    6. architecture: i386, flags 0x00000102:
    7. EXEC_P, D_PAGED
    8. start address 0x08048074
    9.  
    10. Program Header:
    11.     LOAD off    0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12
    12.          filesz 0x0000008f memsz 0x0000008f flags r-x
    13.     LOAD off    0x00000090 vaddr 0x08049090 paddr 0x08049090 align 2**12
    14.          filesz 0x00000009 memsz 0x0000000c flags rw-
    15.  
    16. Sections:
    17. Idx Name          Size      VMA       LMA       File off  Algn
    18.   0 .text         0000001b  08048074  08048074  00000074  2**2
    19.                   CONTENTS, ALLOC, LOAD, READONLY, CODE
    20.   1 .got.plt      00000000  08049090  08049090  0000009c  2**0
    21.                   CONTENTS
    22.   2 .data         00000009  08049090  08049090  00000090  2**2
    23.                   CONTENTS, ALLOC, LOAD, DATA
    24.   3 .bss          00000000  0804909c  0804909c  0000009c  2**2
    25.                   ALLOC
    26.  
    27. и вот fasm
    28. -bash.no_hist-2.05b$ objdump -x fasm
    29.  
    30. fasm:     file format elf32-i386
    31. fasm
    32. architecture: i386, flags 0x00000102:
    33. EXEC_P, D_PAGED
    34. start address 0x08048074
    35.  
    36. Program Header:
    37.     LOAD off    0x00000074 vaddr 0x08048074 paddr 0x08048074 align 2**12
    38.          filesz 0x0000001b memsz 0x0000001b flags r-x
    39.     LOAD off    0x0000008f vaddr 0x0804908f paddr 0x0804908f align 2**12
    40.          filesz 0x0000000a memsz 0x0000000a flags r--
    41.  
    42.  
     
  13. B_108

    B_108 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    62
    readelf -e fasm



    просто "падает"
    Код (Text):
    1.  
    2.  Section to Segment mapping:
    3.   Segment Sections...
    4. assertion "string_table != NULL" failed: file "/opt/usr/src/gnu/usr.bin/binutils/readelf/../../../../contrib/binutil s/binutils/readelf.c", line 2916
    5. Abort trap (core dumped)
    6.  
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    freeze_foton

    Просто ты не стандартно слепил файл, т.е. не так как это принято, видимо у fasm'ового файла получилась только одна секция, gas же всё сделал автоматом, раскидал все данные куда нужно, т.е. данные отдельно код отдельно.

    А так вот тебе дизассемблированный листинг, кстати действительно размер отличается из-за количества секций:
    Код (Text):
    1. LOAD:08048074                               ; File Name   : C:\Downloads\1408094176__tst_fasm
    2. LOAD:08048074                               ; Format      : ELF (Executable)
    3. LOAD:08048074                               ;
    4. LOAD:08048074
    5. LOAD:08048074                                               model flat
    6. LOAD:08048074
    7. LOAD:08048074                               ; ====================================================================== =====
    8. LOAD:08048074
    9. LOAD:08048074                               ; Segment type: Pure code
    10. LOAD:08048074                               ; Segment permissions: Read/Execute
    11. LOAD:08048074                               LOAD            segment mempage public 'CODE' use32
    12. LOAD:08048074                                               assume cs:LOAD
    13. LOAD:08048074                                               ;org 8048074h
    14. LOAD:08048074                                               assume es:nothing, ss:nothing, ds:LOAD, fs:nothing, gs:nothing
    15. LOAD:08048074
    16. LOAD:08048074                               ; --------------- S U B R O U T I N E ---------------------------------------
    17. LOAD:08048074
    18. LOAD:08048074
    19. LOAD:08048074                                               public start
    20. LOAD:08048074                               start           proc near
    21. LOAD:08048074 BA 0A 00 00 00                                mov     edx, 0Ah
    22. LOAD:08048079 B9 8F 90 04 08                                mov     ecx, offset unk_804908F
    23. LOAD:0804807E 31 DB                                         xor     ebx, ebx
    24. LOAD:08048080 43                                            inc     ebx
    25. LOAD:08048081 B8 04 00 00 00                                mov     eax, 4
    26. LOAD:08048086 CD 80                                         int     80h             ; LINUX - sys_write
    27. LOAD:08048088 31 DB                                         xor     ebx, ebx
    28. LOAD:0804808A 89 D8                                         mov     eax, ebx
    29. LOAD:0804808C 40                                            inc     eax
    30. LOAD:0804808D CD 80                                         int     80h             ; LINUX - sys_exit
    31. LOAD:0804808D                               start           endp
    32. LOAD:0804808D
    33. LOAD:0804808D                               LOAD            ends
    34. LOAD:0804808D
    35. LOAD:0804908F                               ; ====================================================================== =====
    36. LOAD:0804908F
    37. LOAD:0804908F                               ; Segment type: Pure data
    38. LOAD:0804908F                               ; Segment permissions: Read
    39. LOAD:0804908F                               LOAD            segment mempage public 'DATA' use32
    40. LOAD:0804908F                                               assume cs:LOAD
    41. LOAD:0804908F                                               ;org 804908Fh
    42. LOAD:0804908F 54                            unk_804908F     db  54h ; T             ; DATA XREF: start+5o
    43. LOAD:08049090 65                                            db  65h ; e
    44. LOAD:08049091 73                                            db  73h ; s
    45. LOAD:08049092 74                                            db  74h ; t
    46. LOAD:08049093 5F                                            db  5Fh ; _
    47. LOAD:08049094 6D                                            db  6Dh ; m
    48. LOAD:08049095 6F                                            db  6Fh ; o
    49. LOAD:08049096 64                                            db  64h ; d
    50. LOAD:08049097 0A                                            db  0Ah
    51. LOAD:08049098 0D                                            db  0Dh
    52. LOAD:08049098                               LOAD            ends
    53. LOAD:08049098
    54. LOAD:08049098
    55. LOAD:08049098                                               end start
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    <font color="red]GAS:</font><!--color-->
    Код (Text):
    1. +- Num     Name     Type Flg VirtAddr  Offset    Size   Link Info Algn-+
    2. ¦    0              NULL ... 00000000 00000000 00000000    0    0    0 ¦
    3. ¦    1 .text        PROG XA. 08048074 00000074 0000001B    0    0    4 ¦
    4. ¦    2 .got.plt     PROG ..W 08049090 0000009C 00000000    0    0    1 ¦
    5. ¦    3 .data        PROG .AW 08049090 00000090 00000009    0    0    4 ¦
    6. ¦    4 .bss         BSS  .AW 0804909C 0000009C 00000000    0    0    4 ¦
    7. ¦    5 .shstrtab    STR  ... 00000000 0000009C 00000025    0    0    1 ¦
    8. ¦                                                                      ¦




    А у fasm'овского HiEW не показывает, видимо потому что одна секция а он

    такого не ожидал :derisive:
     
  16. freeze_foton

    freeze_foton New Member

    Публикаций:
    0
    Регистрация:
    22 окт 2004
    Сообщения:
    20
    Как одна секция???

    Asterix, у тебя в листинге же видно, что секций две, как я и объявлял! секция кода и секция данных...
     
  17. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    freeze_foton

    Нет, секция одна, LOAD, уж не знаю Ида ее так автоматом обозвала или она у тебя в реале так называется :derisive:
     
  18. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Вот здесь действительно две:
    Код (Text):
    1. .text:08048074                               ; File Name   : C:\Distr\_1328689072__tst_gas
    2. .text:08048074                               ; Format      : ELF (Executable)
    3. .text:08048074                               ;
    4. .text:08048074
    5. .text:08048074                                               model flat
    6. .text:08048074
    7. .text:08048074                               ; ====================================================================== =====
    8. .text:08048074
    9. .text:08048074                               ; Segment type: Pure code
    10. .text:08048074                               ; Segment permissions: Read/Execute
    11. .text:08048074                               _text           segment dword public 'CODE' use32
    12. .text:08048074                                               assume cs:_text
    13. .text:08048074                                               ;org 8048074h
    14. .text:08048074                                               assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing
    15. .text:08048074
    16. .text:08048074                               ; --------------- S U B R O U T I N E ---------------------------------------
    17. .text:08048074
    18. .text:08048074
    19. .text:08048074                                               public start
    20. .text:08048074                               start           proc near
    21. .text:08048074 BA 0A 00 00 00                                mov     edx, 0Ah
    22. .text:08048079 B9 90 90 04 08                                mov     ecx, offset unk_8049090
    23. .text:0804807E 31 DB                                         xor     ebx, ebx
    24. .text:08048080 43                                            inc     ebx
    25. .text:08048081 B8 04 00 00 00                                mov     eax, 4
    26. .text:08048086 CD 80                                         int     80h             ; LINUX - sys_write
    27. .text:08048088 31 DB                                         xor     ebx, ebx
    28. .text:0804808A 89 D8                                         mov     eax, ebx
    29. .text:0804808C 40                                            inc     eax
    30. .text:0804808D CD 80                                         int     80h             ; LINUX - sys_exit
    31. .text:0804808D                               start           endp
    32. .text:0804808D
    33. .text:0804808D                               _text           ends
    34. .text:0804808D
    35. .data:08049090                               ; ====================================================================== =====
    36. .data:08049090
    37. .data:08049090                               ; Segment type: Pure data
    38. .data:08049090                               ; Segment permissions: Read/Write
    39. .data:08049090                               _data           segment dword public 'DATA' use32
    40. .data:08049090                                               assume cs:_data
    41. .data:08049090                                               ;org 8049090h
    42. .data:08049090 74                            unk_8049090     db  74h ; t             ; DATA XREF: start+5o
    43. .data:08049091 65                                            db  65h ; e
    44. .data:08049092 73                                            db  73h ; s
    45. .data:08049093 74                                            db  74h ; t
    46. .data:08049094 5F                                            db  5Fh ; _
    47. .data:08049095 6D                                            db  6Dh ; m
    48. .data:08049096 6F                                            db  6Fh ; o
    49. .data:08049097 64                                            db  64h ; d
    50. .data:08049098 0A                                            db  0Ah
    51. .data:08049098                               _data           ends
    52. .data:08049098
    53. .data:08049098
    54. .data:08049098                                               end start
     
  19. freeze_foton

    freeze_foton New Member

    Публикаций:
    0
    Регистрация:
    22 окт 2004
    Сообщения:
    20
    опа! вот, похоже, где собака порылась!

    я же по именам эти секции не объявлял! писал только:

    section readable executable

    ...

    section readable



    тогда другой вопрос:

    как мне можно обозвать секцию? пробовал так:

    section "code" readable executable

    но фасм ругался :dntknw:
     
  20. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    > тогда другой вопрос:

    как мне можно обозвать секцию? пробовал так




    Попробуй порыться на форуме fasm'а, если не найдешь ответа задай там вопрос http://board.flatassembler.net/

    я честно говоря не в курсе может ли fasm именовать секции в elf файлах, возможно для этого нужно отдельно использовать линкер.