【问题标题】:Exec Format error of a 64-bit executable on a 64-bit machine64 位机器上 64 位可执行文件的 Exec Format 错误
【发布时间】:2021-11-12 23:28:49
【问题描述】:

我目前正在研究 MD5 的实现,只是因为我很好奇并想更好地了解散列的工作原理。我有 1 个包含所有代码的文件,名为 easy_md5.c,我正在使用以下 Makefile 编译它:

easy_md5: easy_md5.c
    gcc -c easy_md5.c -o easy_md5

clean:
    -rm -f easy_md5.o
    -rm -f easy_md5

我在可执行文件上运行chmod +x easy_md5 以授予它权限,但是当我尝试运行它时出现以下错误:

[gabe@void easy_md5]$ ./easy_md5 hello
bash: ./easy_md5: cannot execute binary file: Exec format error

运行file easy_md5 显示如下:

easy_md5: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

并运行 arch 确认我的机器具有 x86-64 架构。由于它是 64 位可执行文件,因此当我尝试在 64 位机器上运行它时,它没有理由抛出格式错误。出了什么问题?

【问题讨论】:

    标签: unix gcc compiler-errors x86-64


    【解决方案1】:

    您根本没有创建可执行文件。 -c 选项告诉 gcc 只编译,并输出一个可重定位的目标文件。您通常将该文件命名为 easy_md5.o 并在链接时使用它,但 -o 选项强制将其命名为 easy_md5,这看起来像一个可执行名称,即使它不是。

    要一步编译和链接,只需删除-cgcc easy_md5.c -o easy_md5

    还有其他一些提示:

    我在可执行文件上运行了chmod +x easy_md5

    当您实际创建可执行文件时,这不是必需的。 gcc 为你设置执行权限。

    运行文件easy_md5显示如下:

    easy_md5: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

    这表示一个目标文件。实际的可执行文件被报告为类似

    a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=7108d6b0e7767b20e8db974561938d3bfcbbe12a, for GNU/Linux 3.2.0, not stripped
    

    【讨论】:

    • 请注意,file 的更现代版本会将 PIE 报告为 /bin/ls: ELF 64-bit LSB pie executable, x86-64, ...,因为它是一种特殊类型的共享对象,在其元数据中有一个入口点。不仅仅是普通的.so。而一个实际 elf 类型的EXEC 传统位置相关的可执行文件被报告为只是“可执行文件”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2023-02-14
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多