我在

Linux上有一些关于ELF可执行文件的奇怪问题.

这是我的系统(uname -a):

Linux 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u2 (2016-01-02) x86_64 GNU/Linux

我有以下程序(test.asm),我使用NASM组装它:

; program just exits with code 0 using Linux INT 80H

SECTION .data

SECTION .text

GLOBAL _start

_start:

MOV EAX, 1

XOR EBX, EBX

INT 0x80

我创建三个不同的可执行文件:

nasm -f elf32 -o test32-i386.o test.asm

ld -m elf_i386 -o test32-i386 test32-i386.o

nasm -f elfx32 -o test32-x86_64.o test.asm

ld -m elf32_x86_64 -o test32-x86_64 test32-x86_64.o

nasm -f elf64 -o test64-x86_64.o test.asm

ld -m elf_x86_64 -o test64-x86_64 test64-x86_64.o

这是file命令的输出:

test32-i386: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped

test32-x86_64: ELF 32-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

test64-x86_64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

我感觉合理.但是,运行它们会带来麻烦.

> ./test32-i386:没问题,运行正常.

> ./test64-x86_64:同样,运行正常.

> ./test32-x86_64但是,给出了bash:./ test32-x86_64:无法执行二进制文件:exec格式错误

此外,Valgrind产生……有趣的结果.

> valgrind ./test32-i386:好的

> valgrind ./test64-x86_64:提出SIGILL(?!)

> valgrind ./test32-x86_64:给我./test32-x86_64:1:./ test32-x86_64:语法错误:单词意外(期待“)”)

所以,总结一下:

问题1:为什么Valgrind在运行./test64-x86_64时会引发SIGILL,即使程序在没有Valgrind的情况下似乎工作正常?

问题2:为什么我不能运行./test32-x86_64? Valgrind为该二进制文件提供的错误非常模糊……

对于问题1:有一个针对valgrind的错误,它不支持

int80 instruction in x86_64.我能够在我自己的valgrind(v3.11.0)下重现这一点,并且从浏览源看起来好像它不受支持.

对于问题2:ELF加载程序不支持文件类型.为了在Linux上提供32位二进制文​​件的兼容性,它必须在尝试执行二进制文件时对二进制文件进行一些检查.

当我们在test32-x86_64上使用readelf时,它会显示一个标题:

ELF Header:

Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00

Class: ELF32

Data: 2's complement, little endian

Version: 1 (current)

OS/ABI: UNIX - System V

ABI Version: 0

Type: EXEC (Executable file)

Machine: Advanced Micro Devices X86-64

Version: 0x1

Entry point address: 0x400060

Start of program headers: 52 (bytes into file)

Start of section headers: 288 (bytes into file)

Flags: 0x0

Size of this header: 52 (bytes)

Size of program headers: 32 (bytes)

Number of program headers: 1

Size of section headers: 40 (bytes)

Number of section headers: 5

Section header string table index: 2

即类为32位,机器类型为x86_64.即它是x32 ABI二进制文件

问题是这需要你的内核配置CONFIG_X86_X32_ABI,否则你将失败foul of the check:

#define compat_elf_check_arch(x) \

(elf_check_arch_ia32(x) || \

(IS_ENABLED(CONFIG_X86_X32_ABI) && (x)->e_machine == EM_X86_64))

它只支持没有配置选项的32位二进制文​​件.如果您有内核选项,则设置此选项:CONFIG_X86_X32 = y和CONFIG_X86_X32_DISABLED未设置(这是我正在查看的Linux内核4.3源代码).

因此,您需要使用此支持配置的内核来运行代码 – perror之所以没有看到问题是他的内核似乎是使用运行x32代码的正确选项进行编译的.

valgrind可能无法用二进制格式混淆 – 它不被认为特别常见.

linux 运行unix elf,在Linux中ELF可执行问题相关推荐

  1. linux运行xsnow,X Manage(linux图形访问终端)

    下载安装及配置() 下载地址: manager.com网站上查找该软件包. 程序大小为7.6MB,最好用支持断点续传的工具下载. 安装过程十分简单,直接点击运行安装,全部选择默认安装方式即可. 配置X ...

  2. linux运行前探秘之四,Linux运行前探秘之四_内核解压缩_三_

    操作系统 PROGRAMLANGUAGE 编程语言 Linux运行前探秘之四 ---内核解压缩(三) 徐 炜 摘要:分析了Linux内核解压过程和算法,并分析了关键的源代码. 关键词:inflate: ...

  3. linux运行欧陆风云,Arm linux启动分析(1)

    下周准备做linux启动的技术讲座,在这里我慢慢整理下自己的材料,这次我写的是Image的启动过程,也即使zImage解压缩结束后的启动代码,这时候的代码开始地址仍然是0x30008000,下面我结合 ...

  4. linux 运行iso镜像文件,linux可以加载iso镜像文件到启动项吗

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 楼主的需求描述不清,不作评述.只说下关于楼上一些吧友提到的grub loopback设备可mount iso并读取其中文件的功能 未读过grub1/2的源 ...

  5. 嵌入式linux运行dosbox,Ubuntu18.04/Linux下安装DosBox进行8086汇编

    在windowsXP等32位系统会自带有debug等汇编调试工具,但是到之后的win7等64位系统之后移除了这个功能,其他系统诸如linux,Mac OS等等则没有,学习汇编,需要用到一些工具及软件, ...

  6. Linux 基础篇 -- Linux介绍(怎么读、是什么、创始人、吉祥物、发版本、目前存在的操作系统) Linux和Unix的关系 linux和Windows比较

    文章目录 1. Linux介绍 1.1 Linux怎么读: 1.2 Linux是什么: 1.3 Linux创始人: 1.4 Linux 的吉祥物: 1.5 Linux的主要的发行版: 1.6 目前存在 ...

  7. linux 运行class文杰,Linux Shell基础知识,你想的到的都在这里

    小编提示:此篇文章阅读时间为15分钟左右,可先收藏后阅读. 01/Linux 的江湖地位 Linux 作为一个全球用户超过14亿的操作系统,它的强大与神奇就不必多说了,混在IT界 Linux是可以装B ...

  8. linux运行apktool签名,解决Linux中使用ApkTool遇到问题

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 遇到问题 在Linux中使用IntelliDroid工具时,按要求配置好环境之后,始终无法成功运行该工具内部的ApkTo ...

  9. linux运行getch吗,在linux中使用getch()函数

    http://blog.csdn.net/xiaoweige207/article/details/6206265 由于在Linux中没有conio.h文件,所以不能直接用getch()函数,下面介绍 ...

最新文章

  1. 前沿地带:从量子计算到量子互联网
  2. 144. Binary Tree Preorder Traversal(非递归实现二叉树的前序遍历)
  3. jq添加新节点赋予class属性并获取该对象
  4. 使用Mapreduce案例编写用于统计文本中单词出现的次数的案例、mapreduce本地运行等,Combiner使用及其相关的知识,流量统计案例和流量总和以及流量排序案例,自定义Partitioner
  5. 调用postman拿CSRF token的隐藏Cookie处理
  6. Android开发编码规范pdf文件下载
  7. 【渝粤教育】国家开放大学2018年春季 0014-21T秘书学(一) 参考试题
  8. java用数组实现随机不重复抽奖
  9. 零基础学python难吗-零基础入门学习Python技术难不难?
  10. XP侧边栏(XP桌面秀)
  11. 四川大学计算机学院博士复试分数线,四川大学2021年博士合格分数线和参加外语考核考生名单...
  12. requests使用案例 爬取信用中国
  13. 资治通鉴-6 听的智慧
  14. 计算机科学的主要研究领域是,斯坦福大学计算机科学专业研究领域有哪些?
  15. leetcode-Algorithms-22|括号生成
  16. 矩阵变换器MATLAB仿真,其他仿真模型也可 图中为三相矩阵 变换器仿真模型及其输入输出电流波形
  17. CentOS7 从零安装NVIDA、CUDA、cuDNN
  18. ehshig蒙文歌曲_ehshig蒙文歌曲下载
  19. Android电源管理介绍
  20. 数字化时代-6:从经济体所有制看赚钱的规模

热门文章

  1. 阿里巴巴右侧6滑块VS雅虎右侧6滑块VS自定义6滑块
  2. netty发送数据_看完这篇还不清楚Netty的内存管理,那我就哭了
  3. virtualbox 命令
  4. Mybatis配置文件resultMap映射啥时候可写可不写?
  5. [转载] 纯函数和函数柯里化
  6. 数据库数据规范化看不懂_数据库管理系统中的规范化
  7. Java File类boolean delete()方法(带示例)
  8. linux检查防火墙是否阻挡端口,浅析linux查看防火墙状态和对外开放的端口状态...
  9. html页面foot,HTML tfoot用法及代码示例
  10. python不合法的布尔表达式_python测试题