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