Cygwin: проблема с совместимостью

#c #assembly #makefile #cygwin #nasm

#linux #Windows #x86 #cygwin #nasm

Вопрос:

Привет, StackOverFlowers!

Я новичок во всем, что касается Linux, и я использую Cygwin, чтобы попытаться сделать следующее..

Пропустите тестовый файл через анализатор…

./parser < test.c > test.asm //Работает и генерирует ASM-код

Выполните эту строку, как описано в руководстве, но я не уверен, что именно она делает…

nasm -f elf test.asm //Работает

И, наконец, эта строка для создания исполняемого файла (если я правильно понимаю руководство)

ld -s -o test test.o

Я получаю сообщение об ошибке ld: i386 architecture of input file test.o' is incompatible with i386:x86-64 output в этой строке. Я знаю, это потому, что я пытаюсь перейти с 32-разрядной версии на 64-разрядную, но я не могу понять, как с этим бороться. Я пытался использовать elf_i386, но получаю ld: unrecognised emulation mode: elf_i386. Supported emulations: i386pep i386pe .

Мы высоко ценим любые предложения!!

Редактировать:

Тестовый asm-файл

 section .data
numbers db "0123456789", 0xA
inputchar db 0
section .text
global F_124565444
F_124565444:
push    ebp
mov ebp, esp
sub esp, 4
mov dword [ebp-4], 0
jmp G2
G1:
add dword [ebp-4], 1
push edx
G2:
mov edx, 0
mov eax, [ebp 8]
mov ebx, 10
div ebx
mov [ebp 8], eax
cmp eax, 0
jnz G1
push edx
add dword [ebp-4], 1
jmp G3
G4:
sub dword [ebp-4], 1
pop edx
mov eax, 4
mov ebx, 1
mov ecx, numbers
add ecx, edx
mov edx, 1
int 80h
G3:
cmp dword [ebp-4], 0
jnz G4
mov eax, 4
mov ebx, 1
lea ecx, [numbers 10]
mov edx, 1
int 80h
leave
ret
global F_7362500
F_7362500:
push    ebp
mov ebp, esp
sub esp, 4
mov dword [ebp-4], 0
mov byte [inputchar], 0
jmp G6
G5:
mov dword eax, [ebp-4]
mov ebx, 10
mul ebx
xor ecx, ecx
mov byte cl, [inputchar]
sub ecx, 48
add eax, ecx
mov dword [ebp-4], eax
G6:
mov eax, 03h
mov ebx, 00h
mov ecx, inputchar
mov edx, 01h
int 80h
cmp byte [inputchar], 0ah
jne G5
mov dword eax, [ebp-4]
leave
ret
global F_28052
F_28052:
push    ebp
mov ebp, esp
push    dword [ebp 8]
push    dword 0
pop ebx
pop eax
cmp eax, ebx
sete    al
movzx   eax, al
push    dword eax
pop eax
cmp eax, 0
je  L1
push    dword [ebp 12]
pop eax
leave
ret
jmp L2
L1:
push    dword [ebp 8]
push    dword [ebp 12]
push    dword [ebp 12]
push    dword [ebp 8]
pop ebx
pop eax
mov edx, eax
sar edx, 31
idiv    ebx
push    dword eax
push    dword [ebp 8]
pop ebx
pop eax
imul    eax, ebx
push    dword eax
pop ebx
pop eax
sub eax, ebx
push    dword eax
call    F_28052
add esp, 8
push    dword eax
pop eax
leave
ret
L2:
leave
ret
global _start
_start:
push    ebp
mov ebp, esp
sub esp, 4
sub esp, 4
call    F_7362500
add esp, 0
push    dword eax
lea ebx, [ebp-4]
pop eax
mov dword [ebx], eax
call    F_7362500
add esp, 0
push    dword eax
lea ebx, [ebp-8]
pop eax
mov dword [ebx], eax
push    dword [ebp-4]
push    dword [ebp-8]
call    F_28052
add esp, 8
push    dword eax
call    F_124565444
add esp, 8
push    dword 0
pop eax
leave
mov ebx, eax
mov eax,1
int 80h
leave
mov ebx, eax
mov eax,1
int 80h
  

Комментарии:

1. Он создал test.exe но когда я пытаюсь запустить его, нажав на exe-файл в папке, он выдает ошибку testing.exe has stopped working , и когда я пытаюсь запустить его через cygwin, используя ./testing.exe это приводит к ошибке сегментации. Есть идеи, @MichaelPetch?

2. @MichaelPetch это было добавлено, кстати, спасибо за ваши усилия. Я так потерян

3. Я случайно удалил свое первое предложение, перепостирую его: я не верю, что предварительно скомпилированные версии LD на Cygwin понимают что-либо, кроме объектных файлов i386pep и i386pe. Это может сработать, если указать nasm сгенерировать объект win32. nasm -f win32 test.asm -o test.obj затем ld -mi386pe -o test.exe test.obj

4. С учетом сказанного int 0x80 не будет работать под Windows / Cygwin. Это прерывание Linux, и это, вероятно, вызывает сбои в сегменте.

5. Я не уверен, что понимаю, о чем int 0x80 вы говорите, и есть ли какие-либо способы борьбы с этим? Во-вторых, в конце концов, я просто хочу убедиться, что test.asm в нем выполняется допустимый код, могу ли я каким-то образом избежать всех этих проблем вместе? Извините за все вопросы, я просто совершенно новичок во всем, что касается Linux, я далеко от своего дома на Java

Ответ №1:

Из вашего вопроса и комментариев следует, что вас, возможно, заставили поверить, что Cygwin был таким же, как Linux. Это не так. Cygwin — это unix-подобная среда, совместимая с posix, которая изначально запускается в Windows:

Cygwin — это Unix-подобная среда и интерфейс командной строки для Microsoft Windows. Cygwin обеспечивает встроенную интеграцию приложений, данных и других системных ресурсов на базе Windows с приложениями, программными средствами и данными Unix-подобной среды. Таким образом, можно запускать приложения Windows из среды Cygwin, а также использовать инструменты и приложения Cygwin в операционном контексте Windows.

В частности, весь специфичный для Linux код, который использует int 80h системный вызов, завершится ошибкой при запуске в Windows, поскольку это не относится к среде Windows.

Если вы хотите создать код, который работает на Linux, тогда вам нужно установить Linux. Вы можете сделать это, запустив программное обеспечение виртуальной машины в Windows и установив в нее разновидность Linux (Ubuntu — выбор для многих людей).