【问题标题】:Cygwin: Compatibility IssueCygwin:兼容性问题
【发布时间】:2016-08-28 21:57:42
【问题描述】:

你好 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

非常感谢任何和所有建议!

编辑:

Test.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

【问题讨论】:

  • 它创建了test.exe,但是当我尝试通过单击文件夹中的exe来运行它时,它给出了testing.exe has stopped working的错误,当我尝试使用./通过cygwin运行它时testing.exe,它给出了分段错误。有什么想法@MichaelPetch?
  • @MichaelPetch 已添加,顺便感谢您的努力。我很迷茫
  • 我不小心删除了我的第一个建议,我正在重新发布它:我不相信 Cygwin 上的 LD 的预编译版本能够理解除 i386pep 和 i386pe 目标文件之外的任何内容。这可以通过告诉 nasm 生成 win32 对象来工作。 nasm -f win32 test.asm -o test.obj 然后ld -mi386pe -o test.exe test.obj
  • 话虽如此,int 0x80 将无法在 Windows/Cygwin 下工作。这是一个 Linux 中断,可能会导致段错误。
  • 我不确定我是否理解,你所说的int 0x80 在哪里,还有什么可以与之抗争的吗?其次,归根结底,我只是想确保test.asm 具有在其中运行的有效代码,我可以以某种方式一起避免这些问题吗?抱歉所有问题,我对整个 linux 完全陌生,我离我的 java 家很远

标签: linux windows x86 cygwin nasm


【解决方案1】:

从您的问题和 cmets 看来,您可能已经相信 Cygwin 与 Linux 相同。事实并非如此。 Cygwin 是一个在 Windows 上本地运行的 类 unix posix 兼容环境:

Cygwin 是一个类 Unix 环境和 Microsoft Windows 的命令行界面。 Cygwin 提供基于 Windows 的应用程序、数据和其他系统资源与类 Unix 环境的应用程序、软件工具和数据的本地集成。因此,可以从 Cygwin 环境启动 Windows 应用程序,也可以在 Windows 操作环境中使用 Cygwin 工具和应用程序。

特别是所有使用int 80h 系统调用的 Linux 特定代码在 Windows 上运行时都会失败,因为它不适用于 Windows 环境。

如果您想创建在 Linux 上运行的代码,那么您需要安装 Linux。您可以通过在 Windows 上运行虚拟机软件并在其中安装 Linux 风格来做到这一点(Ubuntu 是很多人的选择)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 2011-10-04
    • 2013-03-28
    • 2019-10-03
    • 2018-06-02
    相关资源
    最近更新 更多