Win32 to Lin портирование

Тема в разделе "WASM.BEGINNERS", создана пользователем Chipmunk, 22 янв 2011.

  1. Chipmunk

    Chipmunk New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2011
    Сообщения:
    4
    Есть файл с кодом на асм для win32, который использует программа на С. Это нужно собрать на linux x32.
    Минимальный нерабочий код:
    Код (Text):
    1. .686
    2. .XMM
    3.  
    4. MY_CODE SEGMENT PUBLIC USE32 'CODE'
    5.  
    6. PUBLIC _qsum0
    7. _qsum0 dq 0
    8.  
    9. MY_CODE ENDS
    10.  
    11. END
    используется в С:
    Код (Text):
    1. extern short _qsum0[4];
    2.  
    3. int main(void)
    4. {
    5.     _qsum0[0] = 100;
    6.     return 0;
    7. }
    Результат (дает segfault):
    Код (Text):
    1. .386
    2. option dotname
    3. .model flat
    4.  
    5. public _end
    6. public _edata
    7. public __bss_start
    8. public main
    9. public _qsum0
    10.  
    11. extern _start: byte
    12.  
    13. .note.gnu.build-id SEGMENT DWORD PUBLIC 'CONST'         ; section number 1
    14.         db 04H, 00H, 00H, 00H, 14H, 00H, 00H, 00H       ; 08048094 _ ........
    15.         db 03H, 00H, 00H, 00H, 47H, 4EH, 55H, 00H       ; 0804809C _ ....GNU.
    16.         db 70H, 3CH, 37H, 0C8H, 98H, 0BAH, 01H, 4FH     ; 080480A4 _ p<7....O
    17.         db 96H, 40H, 07H, 50H, 0FBH, 98H, 0C5H, 98H     ; 080480AC _ .@.P....
    18.         db 4CH, 8CH, 44H, 0D3H                          ; 080480B4 _ L.D.
    19. .note.gnu.build-id ENDS
    20.  
    21. _text   SEGMENT DWORD PUBLIC 'CODE'                     ; section number 2
    22.  
    23. main    PROC NEAR
    24.         push    ebp                                     ; 080480B8 _ 55
    25.         mov     ebp, esp                                ; 080480B9 _ 89. E5
    26. ; Note: Length-changing prefix causes delay on Intel processors
    27.         mov     word ptr [_qsum0], 100                  ; 080480BB _ 66: C7. 05, 080480D0(d), 0064
    28.         mov     eax, 0                                  ; 080480C4 _ B8, 00000000
    29.         pop     ebp                                     ; 080480C9 _ 5D
    30.         ret                                             ; 080480CA _ C3
    31. main    ENDP
    32.  
    33. _text   ENDS
    34.  
    35. MY_CODE SEGMENT PARA PUBLIC 'CODE'                      ; section number 3
    36.  
    37. _qsum0  PROC NEAR
    38. ; Error: This is unlikely to be code
    39. ;       add     byte ptr [eax], al                      ; 080480D0 _ 00. 00
    40.         db 00H, 00H
    41.  
    42. ?_001   label byte
    43.         db 00H, 00H, 00H, 00H, 00H, 00H                 ; 080480D2 _ ......
    44.  
    45. MY_CODE ENDS
    46.  
    47. END
    В чем ошибка?
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Может у секции стоит выставить флаги Readable/Writeable?
     
  3. Chipmunk

    Chipmunk New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2011
    Сообщения:
    4
    Пока определил, что с
    MY_CODE SEGMENT PUBLIC USE32 'DATA'
    работает правильно.
    Но в исходниках все в CODE, что дает проблемы с доступом. Как выставить флаги?
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Ну исправьте исходники на правильный вариант
     
  5. Chipmunk

    Chipmunk New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2011
    Сообщения:
    4
    Я нашел, что автор использовал VirtualProtect, чтобы отключить защиту. Применю аналог для линукс.
    Но еще обнаружил, что и на win не могу заставить это работать.