【问题标题】:Bin execution errorbin 执行错误
【发布时间】:2013-06-09 00:49:50
【问题描述】:

我是汇编语言的新手,我完成了一个简单的程序,所以我运行了以下推荐

nasm -o learn.bin learn.asm

然后组装代码

 chmod +x learn.bin

然后最后运行它

 ./learn.bin

但最后一个返回错误

 bash: ./learn.bin: cannot execute binary file

我正在使用 atom intel CPU 运行 ubuntu

任何帮助都会很棒, 提前致谢

【问题讨论】:

    标签: linux bash ubuntu assembly nasm


    【解决方案1】:

    错误消息听起来好像您没有正确的 ELF 可执行标头。可以使用 Nasm 的 -f bin 输出格式(默认值,如果您不指定输出格式)来组装文件。但它需要一个 ELF 标头。

    通常的方式是nasm -f elf32 learn.asm(或者如果您有 64 位代码,则可能是 -f elf64)。如果一切顺利,这个“应该”会产生“learn.o”。然后,您必须使用ld -o learn learn.o 链接这个“可链接对象”文件(如果您使用的是 64 位 ld,请添加 -melf-i386... 您可能是这样)。或者,根据代码,gcc -o learn learn.o(对于 64 位 gcc,添加 -m32)。我看到 Jester 刚刚告诉过你(言简意赅)。

    这是一个“应该”按照您尝试的方式工作的文件示例:

    [map all hkhw.map] ; optional
    ;==========================
    bits 32
    ORIGIN equ 8048000h
    org ORIGIN
    section .text
        code_offset equ 0
        code_addr:
    ;--------------------------- ELF header----------------------
            dd $464c457f,$00010101,0,0,$00030002,1,main,$34,0,0,$00200034,2,0
            dd 1,code_offset,code_addr,code_addr,code_filez,code_memsz,5,4096
            dd 1,data_offset,data_addr,data_addr,data_filez,data_memsz,6,4096
    main:
    ;--------- your code goes here -------------------------------
    
        push byte 4
        pop eax
        xor ebx, ebx
        mov ecx, msg
        push byte msg_len
        pop edx
        int 80h
    
        push byte 1
        pop eax
        int 80h    
    
    
    ;------------ constant data -----------------------
    ; (note that we're in .text, not .rdata)
            align 4
    
    
    
    ;-------------------------------------------------------------
            align 4
            code_memsz equ $ - $$
            code_filez equ code_memsz
            data_addr equ (ORIGIN+code_memsz+4095)/4096*4096 + (code_filez % 4096)
            data_offset equ code_filez
    section .data vstart=data_addr
    ;------------ initialized data -------------
    
    msg db "Hello from Nasm, all by itself!", 10
    msg_len equ $ - msg
    
    ;---------------------------------------------------------------------------
        idat_memsz equ $ - $$
        bss_addr equ data_addr + ($ - $$)
    section .bss  vstart=bss_addr 
    ;------------- uninitialized data ----------------------
    
    
    
    ;-------------------------------------------------
        udat_memsz equ $ - $$
        data_memsz equ  idat_memsz + udat_memsz
        data_filez equ  idat_memsz
    ;========================
    

    嗯...格式不太好。应该是不可读。试试 Nasm 论坛。如果您发布代码,我们可以为您提供更多帮助

    【讨论】:

      【解决方案2】:

      您不能(通常)在 linux 下运行纯二进制文件。您必须首先要求nasm 生成一个目标文件,然后使用链接器来创建一个ELF 可执行文件。请注意,您的代码当然也应该为 linux 编写。网上有很多例子,比如this tutorial

      【讨论】:

      • 非常感谢,这解释了很多,现在一切正常,谢谢
      猜你喜欢
      • 2016-10-19
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 2015-03-20
      相关资源
      最近更新 更多