首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

万字图文 | 你写代码是如何跑起来

对于每一个,输出了 Offset、VirtAddr 等描述当前段信息。Offset 表示当前段在二进制文件开始位置,FileSiz 表示当前段大小。...回忆前面我们在 ELF 文件头中看到 Entry point address 显示入口地址 0x401040。这说明,程序入口地址就是 .text 地址。...4.4 执行 Segment 加载 接下来,加载器会将 ELF 文件 LOAD 类型 Segment 都加载到内存里来。使用 elf_map 在虚拟地址空间中其分配虚拟内存。...这个参数有这么几种可能 值 0,就是直接按照 ELF 文件地址在内存中进行映射 值对齐到整数页开始,物理文件可能为了可执行文件大小足够紧凑,而不考虑对齐问题。...对于 ELF 文件来说,它加载器在内核定义 elf_format,其二进制加载入口是 load_elf_binary 函数。

54430

万字连载(上):如何 Bringup SoC 芯片

我们先从镜像结构开始,后面逐一介绍 ROM->SPL->UBoot->Kernel 全过程。 ELF 文件 在介绍加载镜像之前,需要先了解下 ELF 文件格式定义。...有 3 种类型 ELF 文件: 目标文件:被链接器读取,用来产生一个可执行文件或者共享库文件; 可执行文件:被操作系统加载器从硬盘上读取,载入到内存中去执行; 共享库文件:在动态链接时候,由 ld-linux.so...data 数据,通常是指用来存放程序已初始化全局变量一块内存区域。数据属于静态内存分配。 bss 通常是指用来存放程序未初始化全局变量和静态变量一块内存区域。...文件 vmlinux 分布: 镜像生成 ELF 文件格式是 Linux 环境下可执行文件格式,在 Linux 环境下,加载器根据 ELF 文件地址信息,就可以把它加载到内存指定地址运行,...但是系统启动过程并没有 ELF 文件执行环境,需要将 ELF 文件转换为二进制纯指令文件,即 Image。

1.7K31
您找到你想要的搜索结果了吗?
是的
没有找到

扒一扒ELF文件

例如lib*.o文件。 2.2 可执行目标文件(a.out文件)   包含二进制代码和数据,可直接被加载加载执行。例如编译好可执行文件a.out。...2.如果用于加载执行(可执行文件),则加载器则将把ELF文件看作是程序头表描述集合,一个可能包含多个节,节头表可选。 4....从程序执行角度看ELF文件   与可重定位目标文件不同:   1.ELF头中,字段 e_entry给出执行程序时第一条指令地址,而在可重定位文件,此字段0。   ...第二可装入:第0xe10 ~0x104f长度0x240字节.data节和磁盘不占存储空间.bss节,映射到虚拟地址0x600e10开始长度0x248字节存储区域,在0x248=584B存储区...从编译链接角度看,可重定位目标文件包含ELF头、各个节以及节头表。可执行目标文件包含ELF头、程序头表(头表)以及各种节组成

70120

编译、链接到载入、运行大致过程----2.链接

编译完成之后,需要步骤就是 链接.编译仅仅转换源代码到二进制机器码,但是并没有把程序运行需要所有资源整合到一起,所以编译后"目标文件"是没办法直接运行;在实际项目中,通常是由多个源代码文件,...这些目标文件 和需要其他资源被整合到一起,最终才生成我们常见程序(典型比如windows下各种exe文件,linux 下elf LSB executable 文件,linux 下elf LSB...链接后文件既有segment head ,也有section head信息;以/usr/bin/cat 这个程序例,着重了解下segment地址怎么计算: [root@www ~]# readelf...上述结果中有一个叫做: VirtAddr值,这个字段表示 segment对应“程序虚拟地址”, 也有叫做“文件虚拟地址”觉得都是一个意思:就是说 这个segment 是从这个 虚拟地址开始...链接后文件有segment描述,也有section描述,而编译后文件只有section. 2. 只有type “LOAD”segment 会在程序加载时候被载入内存 3.

80130

从Go二进制文件获取其依赖模块信息

大家好,是张晋涛。 我们用 Go 构建二进制文件默认包含了很多有用信息。...其实 Linux 系统中二进制文件包含额外信息并非 Go 所特有的,下面将具体介绍其内部原理和实现。当然,用 Go 构建二进制文件仍是本文主角。...64 位可执行文件使用 ELF 文件格式结构和 Linux 内核源码对它定义。...具体实现 在前面的内容,关于如何使用 readelf 和 objdump 命令获取二进制文件 Go 版本和 Module 信息就已经涉及到了其具体原理。这里来介绍下 Go 代码实现。...mod = mod[16 : len(mod)-16] } else { mod = "" } 总结 在这篇文章中分享了如何从 Go 二进制文件获取构建它时所用 Go 版本及它依赖模块信息

2.5K10

深入了解 Go ELF 信息

大家好,是张晋涛。 我们用 Go 构建二进制文件默认包含了很多有用信息。...其实 Linux 系统中二进制文件包含额外信息并非 Go 所特有的,下面将具体介绍其内部原理和实现。当然,用 Go 构建二进制文件仍是本文主角。...64 位可执行文件使用 ELF 文件格式结构和 Linux 内核源码对它定义。...具体实现 在前面的内容,关于如何使用 readelf 和 objdump 命令获取二进制文件 Go 版本和 Module 信息就已经涉及到了其具体原理。这里来介绍下 Go 代码实现。...mod = mod[16 : len(mod)-16] } else { mod = "" } 总结 在这篇文章中分享了如何从 Go 二进制文件获取构建它时所用 Go 版本及它依赖模块信息

65120

elf格式分析

近期研究了一下elf文件格式,发现好多资料写都比較繁琐,可能会严重打击学习者热情,把自己研究结果和大家分享,希望描写叙述可以简洁一些。...进程创建和执行进程创建和执行: 大致经历了下面步骤 1.用户请求执行程序时,操作系统会读取存储在磁盘上可执行文件,在linux系统上这个文件就是我们elf格式文件用户分配...依据文件信息指示,把不同文件内容放到你分配这3G虚拟内存 3....是0,FileSiz是0x0,MemSiz是0xbc, VirtAddr是0x400000,Flags是R E,表示载入起将把elf文件里从0字节開始直到oxbc处内容载入到虚拟内存0x400000...设置该内存权限是RE(可读,可运行) 为什么数据事实上地址是0x6000bc,而不是0x6000000呢,这是由Align决定,Align决定内存和磁盘以1M单位进行映射,在文件

78321

详解共享库动态加载

在本文中,将尝试解释在Linux系统动态加载共享库内部工作原理。 这边文章不是一个如何引导,尽管它确实展示了如何编译和调试共享库和可执行文件。为了解动态加载内部工作方式进行了优化。...可以静态地执行此操作-并将random库所有符号直接加载到main可执行文件。 我们告诉编译器我们要使用librandom文件。由于它是动态加载为什么我们在编译时需要它?...总之,ELF文件包含: ELF Header 文件数据,可能包含: 程序header表(头列表) 头表(列表章节标题) 以上两个标题指向数据 ELF标头指定程序标头表中段大小和数量,以及节标头表中段大小和数量...每个这样表都由固定大小条目组成(使用该条目在适当描述标题或节标题)。条目是标题,并且包含指向该段或节实际主体位置指针(文件偏移量)。该主体存在于文件数据部分。...在他们:因为我们感兴趣是这个文件特定部分,解释这个程序头表,ELF文件可以有(和共享特别库必须具有)头一个描述PT_DYNAMIC。

3K20

一文搞懂 | 内核启动

vmlinux 属于 ELF 文件,要想了解如何启动 vmlinux,首先需要知道 ELF 格式。 ELF text 代码,通常是指用来存放程序执行代码一块内存区域。...bss 通常是指用来存放程序未初始化全局变量和静态变量一块内存区域。BSS属于静态内存分配。...init linux定义一种初始化过程才会用到,一旦初始化完成,那么这些所占用内存会被释放掉,后续会继续说明。...aarch64 架构平台 ELF 可执行文件,其程序入口地址 0xffff800010000000,此段对应 section .head.text .text .got.plt.........接下来代码是: 上图中宏 HEAD_TEXT 定义在文件 include/asm-generic/vmlinux.lds.S ,其定义 .head.text 文本段。

1.5K11

合法修改只读数据

但是可能大多数人并不清楚为什么会发生错误,那么本篇文章就来说说:从只读数据被映射到进程虚拟地址空间到写访问发生错误整个过程,力求让大家搞清楚这里面的底层内核原理,讲完整个过程之后我们来通过一个示例代码让修改只读数据变得合法...也可以发现编译器将.text和.rodata 放在一个,然后用一个程序头表项来描述,类型load(需要加载到进程地址空间), Flags只读可执行。...elf_prot, elf_flags, total_size); //通过mmap映射vma 在load_elf_binary中会解析可执行文件文件头,找到程序头表,然后解析程序头表每一个表项,...对每一个可加载进行映射,这里有两个(上面通过readelf -l工具可以看到), 分配映射只读可执行和可读可写不可执行,然后我们就可以通过cat /proc/1727/maps 看到我们映射...写只读数据试试 映射好了vma只能说明我们有一虚拟内存关联了可执行文件一个,并没有分配物理内存,实际上这个过程发生在第一次访问只读数据或者访问.text时候发生预读等操作时候。

1.2K20

ELF文件格式简介

大家好,又见面了,是你们朋友全栈君。   简单了解下ELF文件格式。...x e_phnum,如果文件没有程序头表该项0; e_shentsize:节表单项大小,表每一项大小相同; e_shnum:节表数量; e_shstrndx:节表节名索引,如果文件没有该表则该项...(5):保留; PT_PHDR(6):保存程序头表本身位置和大小,当前段不能在文件中出现一次以上,且仅仅当程序表头内存映像一部分时起作用,它必须在所有加载项目之前; [PT_LPROC(0x70000000...可加载进程p_vaddr和- p_offset取值必须合适,相对于对页面大小取模而言; 0和1表示不需要对齐; 其他值必须2幂次方,且必须 p _ a d d r ∣ p _ a l i...如果文件具有包含重定位加载,则这些部分属性将包括 SHF_ALLOC 位;否则,该位将关闭。通常,名称由 重定位适用部分。

2K30

MIT 6.S081 (BOOK-RISCV-REV1)教材第三章内容 -- 页表

,因此当内核elf可执行文件加载时,.rodata,.data和.bss节都会被合并为一个data。...表是ELF文件除了文件头以外最重要结构,它描述了ELF各个信息,比如每个段名、长度、在文件偏移、读写权限及其他属性。...ELF文件权限往往只有为数不多几种组合,基本上是三种: 以代码代表权限为可读可执行。 以数据和BSS代表权限为可读可写。 以只读数据代表权限为只读。...ELF二进制文件以四个字节“幻数”0x7F、“E”、“L”、“F”或ELF_MAGIC开始(*kernel/elf.h*:3)。如果ELF头有正确幻数,exec假设二进制文件格式良好。...exec将ELF文件字节加载ELF文件指定地址内存。用户或进程可以将他们想要任何地址放入ELF文件。因此exec是有风险,因为ELF文件地址可能会意外或故意引用内核。

77940

【linux命令讲解大全】054.readelf:展示ELF格式文件信息工具

如果用于加载执行(可执行文件),则加载器则将把elf文件看作是程序头表描述集合,一个可能包含多个节,节头表可选。 如果是共享文件,则两者都含有。...-t 或 --section-details:显示详细信息(-S)。 -s 或 --syms 或 --symbols:显示符号表项(如果有的话)。...-u 或 --unwind:显示unwind信息。当前只支持IA64 ELFunwind信息。 -d 或 --dynamic:显示动态信息。...-D 或 --use-dynamic:使用动态符号表显示符号,而不是使用符号。...-x 或 --hex-dump=:以16进制方式显示指定内内容。number指定表中段索引,或字符串指定文件段名。

43510

【译】如何使用 eBPF 检测分析用户态程序

之前系列文章介绍了eBPF 生态系统基本构建模块,简要介绍了XDP,并展示了它与 eBPF 基础设施如何密切合作,以便在网络堆栈引入一个快速处理数据路径。...只要符号表可用,就可以对二进制文本段中出现任何符号应用动态跟踪。在运行二进制文件上检测 Go 或 Rust stdlib 函数调用就是通过这种方式完成。...两个宏都接受两个强制参数,如提供者/探测名称,后面跟着你希望从跟踪点查询任何值。编译器将把USDT 跟踪点塞进目标二进制文件 ELF 。...编译器和跟踪工具之间规定了 USDT 元数据所在位置必须存在 .note.stapstd 。 USDT 跟踪工具检查 ELF ,并在被转为 int3 中断跟踪点位置上放置一个断点。...Java语言 现代 JVM 版本自带对 USDT 内置支持。所有探针都是用 libjvm 共享对象带来。我们可以在 ELF 到可用追踪点。

1.3K20

【参赛经验分享】实现一个世界上最小程序来输出自身MD5 388解法分享

elf header相关比较挫,求其他大神思路。 FPU优化k计算 普通md5一般使用预计算K实现,而64个uint32_t就导致了,额外256字节空间。...这些完全可以省掉,由于进程执行时,已经完全将自身镜像加载到内存地址。因此可以直接从汇编基址读取内存,即为文件内容。 避免memcpy 正常md5流程,需要对message进行padding。...因此需要按64字节一块,一块一块拷贝到临时buffer单独处理。...这里可以通过将program headerflags设置可写,并将memsize设置比filesize大一些,方便直接在内存中原地做padding。...在代码include这个额外生成汇编文件,最后直接赋值就可以了。

60820

原创 Paper | glibc 提权漏洞(CVE-2023-4911)分析

漏洞点 参考资料 我们先通过详情来看漏洞点,根据漏洞详情介绍,该漏洞位于 glibc elf/dl-tunables.c文件parse_tunables函数: static void parse_tunables...= '\0') p += len + 1; } } 调用该函数代码位于该文件__tunables_init函数: void __tunables_init (char **envp...对这种利用方式深感好奇,认为这一利用思路非常巧妙,仅需覆盖一个栈地址即可替换 libc 加载路径。 4.接下来花一些时间去一步步调试,最后理解清楚该利用思路。...而漏洞发现者找到利用链,利用到了link_map->l_info[DT_RPATH]成员变量,相关代码位于elf/dl-load.c文件_dl_init_paths函数: void _dl_init_paths...,我们构造link_map结构是没问题,但是怎么让link_map申请内存我们设置好这段呢?

50610

gcc编译时,链接器安排【虚拟地址】是如何计算出来

这个时候,使用readelf工具来查看这个可执行文件信息(segment): 上图中红色矩形框,第二个地址为什么是 0x080e_9f5c?...这里就不再赘述了,只要记住2点: 从编译器角度看,ELF 文件是由很多节(Section)组成; 从程序加载角度看,ELF 文件是又很多(Segment)组成; 其实它俩没有本质区别,只不过是链接器在链接阶段...从内存映射角度来看: 操作系统在把一个可执行程序加载到系统时,把ELF文件每个内容读取到物理内存,然后把这个物理内存映射到该段对应虚拟地址上(VirtAddr)。...由于操作系统在把test文件读取到物理内存时候,从文件开始代码0x00000地址开始读取,按照4KB一个单位存放到一个物理页。...readelf工具读所显示:数据加载到虚拟地址空间中开始地址,如下所示: 至此,就解释了文章开头提出问题!

1.2K41

Linux系统编译、链接基石-ELF文件:扒开它层层外衣,从字节码粒度来探索

可以看出来:这个 Section 在 ELF 文件偏移地址是 0x0016ed,长度是 0x00010a 个字节。 下面,我们从 ELF header 二进制数据,来推断这信息。...p_type: 类型,1: 表示这个需要加载到内存; p_offset: ELF 文件偏移地址,这里值 0,表示这个ELF 文件头部开始; p_vaddr:加载到内存虚拟地址...0x08048000; p_paddr:加载物理地址,与虚拟地址相同; p_filesz: 这个ELF 文件,占据字节数,0x0744 = 1860 个字节; p_memsz:这个加载到内存...注意:有些是不需要加载到内存; 经过上述分析,我们就知道:从 ELF 文件第 1 到 第 1860 个字节,都是属于这个 LOAD 内容。...在被执行时,这个需要被加载到内存虚拟地址 0x08048000 这个地方,从这里开始,又是一个全新故事了。

77420
领券