首页 > 其他分享 >不同操作系统可执行文件格式

不同操作系统可执行文件格式

时间:2023-05-26 18:13:42浏览次数:45  
标签:可执行文件 00 操作系统 ELF 000 格式 Mach

起因

在看 go 源码的时候,看到新包 debug/elf 包,手动进行尝试解析编译的二进制

写了一个demo

func TestElf2(t *testing.T) {
	f, err := os.Open("testdata/binary") // 一个在mac系统下编译成功的二进制
	if err != nil {
		t.Fatal(err)
	}
	ef, err := elf.NewFile(f)
	if err != nil {
		t.Fatal(err)
	}
	_ = ef
	t.Logf("%+v", ef)
}



执行结果失败,读取不到 elf 信息

=== RUN   TestElf2
    elf_test.go:20: bad magic number '[207 250 237 254]' in record at byte 0x0
--- FAIL: TestElf2 (0.00s)

在命令行使用 readelf 查看格式

$ readelf -h binary    
readelf: Error: Not an ELF file - it has the wrong magic bytes at the start

说明不是一个ELF格式的文件,为了探明原因就去查询了一番

ELF 魔法数字

报错信息提示 bad magic number :不是合法的魔法数字

那合法的数字应该是多少,查看源码

sr := io.NewSectionReader(r, 0, 1<<63-1)
// Read and decode ELF identifier
var ident [16]uint8
if _, err := r.ReadAt(ident[0:], 0); err != nil {
    return nil, err
}
if ident[0] != '\x7f' || ident[1] != 'E' || ident[2] != 'L' || ident[3] != 'F' {
    return nil, &FormatError{0, "bad magic number", ident[0:4]}
}

二进制文件前4个字节应该为 '\x7f' 'E' 'L' 'F' ,十六进制表示为: 7f 45 4c 46

使用 hexdump 查看该二进制的前几位

$ hexdump -Cb -n 16 binary
00000000  cf fa ed fe 0c 00 00 01  00 00 00 00 02 00 00 00  |................|

确实并不是源码中的信息,那我交叉编译下看看linux下是怎么样的呢

设置 GOOS 和 GOARCH 重新编译linux 64位二进制,并使用 hexdump再次查看

$ hexdump -Cb -n 16 binary
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
0000000 177 105 114 106 002 001 001 000 000 000 000 000 000 000 000 000

看来不同系统有不同的标识

常见可执行文件格式

这是chatgpt 的回答

Mach-O(Mach Object)和 ELF(Executable and Linkable Format)是两种不同的可执行文件格式。

Mach-O 是苹果公司开发的可执行文件格式,用于 macOS 和 iOS 系统。它是基于 Mach 内核的操作系统所使用的标准格式,支持多种架构(如 x86、x86_64、ARM 等)。Mach-O 文件包含了可执行代码、数据和符号表等信息,用于加载和执行程序。

ELF 是一种通用的可执行文件格式,广泛用于类 UNIX 系统,如 Linux 和 BSD。ELF 文件同样包含了可执行代码、数据和符号表等信息,以及其他一些用于动态链接和装载的信息。ELF 支持多种架构和操作系统,使得它成为跨平台开发的标准格式。

虽然 Mach-O 和 ELF 是不同的可执行文件格式,但它们都用于存储和执行程序。每个操作系统和体系结构通常都有自己的默认格式,例如 macOS 使用 Mach-O,而 Linux 使用 ELF。这些格式定义了可执行文件的结构、布局和标准,以便操作系统能够正确加载和执行程序。

标签:可执行文件,00,操作系统,ELF,000,格式,Mach
From: https://www.cnblogs.com/sooooooul/p/17435401.html

相关文章

  • JavaScript 格式化金额
    JavaScript格式化金额一、使用toLocaleString()要格式化金额,可以使用JavaScript的toLocaleString()方法。该方法可以将数字转换为本地化的字符串表示形式,并可以指定货币符号、小数点和千位分隔符等格式。代码如下:美元constamount=1234567.89;constformattedAmou......
  • windows server2016 操作系统修改默认远程端口
    一、需求   远程端口,windows默认的3389.linux的22,这种都是知名端口,如果IP地址暴露,很可能会被攻击,这时候就需要更改端口号。二、操作步骤2.1打开注册表   快捷键WIN+R,命令行窗口输入regedit2.2进入以下路径  这里是默认端口,修改为自己除1024以后,以及未被......
  • #yyds干货盘点#TCP的报文格式
    TCP的报文格式源端口号:本次TCP连接中,发起连接的主机使用的端口号;目的端口号:本次TCP连接主,接受连接的主机使用的端口号;序号:通过TCP传输的每一个数据段,都有一个序号,作用是为了确认此数据段的顺序。网络中允许传输的数据长度是有限制的,所以当我们要通过TCP传输一个较大的数据时,TCP会将......
  • 【操作系统】内存管理
    内存管理:OS负责内存空间的分配与回收OS需要提供某种技术从逻辑上对内存空间进行扩充OS需要提供地址转换功能,负责程序的逻辑地址与物理地址的转换绝对装入:编译时将逻辑地址转为物理地址(单道程序阶段)可重定位装入:装入时将逻辑地址转为物理地址(早期多道批处理阶段)动态运行时......
  • python 格式化代码
    安装pre-commitsudoaptinstallpre-commit-yrepos:-repo:https://github.com/python/blackrev:23.3.0hooks:-id:blacklanguage_version:python3exclude:src/ratel/potargs:["--line-length","18......
  • shell中设置文字输出的颜色及字体格式
    转载:(15条消息)shell中设置文字输出的颜色及字体格式_linux文字顏色_庚庚911的博客-CSDN博客ANSI控制码简介ANSI控制码用于在字符显示系统中控制光标移动和字符色彩等,常用于BBS系统中。ANSIESCAPESEQUENCES又称为VT100系列控制码,国内译为ANSI控制码。顾名思义,需要VT100系......
  • 跟着hsp学springmvc--数字格式化介绍
    基本数据类型和字符串类型的自动转换<%@taglibprefix="form"uri="http://www.springframework.org/tags/form"%><%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>Ti......
  • 转换视频格式|压缩视频|使用ffmpeg
    代码如下importos.pathimportsubprocessdefcompress_video(origin_file=None,target_file=None,quality=10):#压缩质量(值越小,视频越小)#如果文件存在就删除ifos.path.exists(target_file):os.remove(target_file)ifnotos.path.ex......
  • 基于Qt的音乐播放器(三)通过酷狗音乐的api接口,返回json格式歌曲信息(播放地址,歌词,图片)
    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票!我的投票地址:点击为我投票文章目录前言1.获取歌曲搜索列表api接口2.获取单个歌曲详细信息包括歌词3.总结前言首先说明,本教程仅供个人学习,研究使用,禁止用于任何的商业和非法用途。(手动狗头)之所以要研究这个,是因为我想......
  • Oracle中读取JSON格式数据实战指南(oracle中读json)
    Oracle中读取JSON格式数据实战指南 随着大数据、云计算等技术的快速发展,JSON(JavaScriptObjectNotation)格式的数据越来越广泛应用于数据交互和存储中。Oracle数据库支持JSON格式数据的存储和查询,本篇文章将介绍如何在Oracle中读取JSON格式数据,并提供相关代码示例。 1.创建......