我的 Linux 可执行程序(64 位)中的段 00 是什么

2023-12-02

这是一个非常简单的汇编程序,只需返回12执行后。

$ cat a.asm
        global _start

        section .text
_start: mov rax, 60    ; system call for exit
        mov rdi, 12    ; exit code 12
        syscall

它可以正确构建并执行:

$ nasm -f elf64 a.asm && ld a.o && ./a.out || echo $?
12

但是a.out的大小很大,超过4k:

$ wc -c a.out
4664 a.out

我尝试通过阅读 elf 内容来理解它:

$ readelf -l a.out

Elf file type is EXEC (Executable file)
Entry point 0x401000
There are 2 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x00000000000000b0 0x00000000000000b0  R      0x1000
  LOAD           0x0000000000001000 0x0000000000401000 0x0000000000401000
                 0x000000000000000c 0x000000000000000c  R E    0x1000

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .text 

奇怪的是,段00是按0x1000对齐的,我认为这意味着这样的段至少会占用4096字节。

我的问题是这个段 00 是什么?

(nasm版本2.14.02,ld版本2.34,操作系统是Ubuntu 20.04.1)


由于它从文件偏移量零开始,因此它可能是一个“填充”段,旨在使 ELF 的加载更加高效。 这.text事实上,段已经在文件中对齐,因为它应该在内存中对齐。

你可以强制ldnot对齐内存中的部分和在文件中 with -n。您还可以使用删除符号-s.
这会将大小减少到大约 352 字节。

现在 ELF 包含:

  • ELF 标头(必需)
  • 程序头表(需要)
  • 代码(需要)
  • 字符串表(可能不需要)
  • 节表(可能不需要)

字符串表可以删除,但显然strips不能那样做。 我已经删除了.shstrtab手动删除节数据和所有节头,将大小缩小到 144 字节。 考虑 64 个字节来自 ELF 标头,60 个字节来自单个程序标头,12 个字节来自您的代码;总共 136 字节。
额外的 8 个字节是填充,其中 4 个字节位于代码部分的末尾(易于删除),还有一个位于程序头的末尾(需要进行一些修补)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的 Linux 可执行程序(64 位)中的段 00 是什么 的相关文章

随机推荐

  • 使用 javascript toDataURL 保存 HTML5 画布时如何插入 PNG 注释块?

    我有一个紧凑的canvas to png下载保护程序功能 参见下面的代码 这段代码运行得很好 我对它的输出很满意 主要是 第二次更换就够了吗 那个替代品会是什么样子 我唯一的其他选择是使用 imagemagick 对文件进行后处理 有任何想
  • SFENCE和LFENCE对相邻核心的缓存有什么影响?

    From the speech Herb Sutter in the figure of the slides on page 2 这里显示了单独的缓存 L1S和存储缓冲区 SB 1 在 Intel x86 处理器中cache L1 和 S
  • 传递变量时 SwiftUI 中的 .sheet 行为奇怪

    我在 SwiftUI 中使用 sheet 视图 并且在代码执行中观察到奇怪的行为 我正在查看 SignInView2 struct SignInView2 View Environment presentationMode var pres
  • 使用 AJAX 将数据从 HTML 表单提交到 WebMethod

    因此 我从 HTML 表单中获取数据 然后使用 AJAX 将数据发送到 Web 方法 然后发送到 sqlite 数据库 但我的 AJAX 调用失败 我搞砸了什么 我做得正确吗 HTML 表单
  • 相当于 Access 中的 SET IDENTITY_INSERT OFF

    正如标题所示 是否有任何方法可以关闭 Access 中的自动编号字段 以允许我插入具有我选择的 id 的行 就像在 SQL Server 中使用 SET IDENTITY INSERT OFF 所做的那样 您可以使用 SQL 插入 ID I
  • Laravel 5.5 中用户会话过期时自动重定向

    我想使用 Laravel 函数在用户会话过期时自动重定向到我的登录页面 当用户尝试访问另一个页面并且会话过期时 我会进行重定向 我设置了一个生命周期 这有助于由于用户不活动而自动注销 而我想要的是在会话超时时立即重定向 我尝试使用 Java
  • mysql数据库中的奇怪字符

    当我输入像 或 这样的奇怪字符并将其存储在 mysql 数据库中时 该字符将被转换为 它可能必须对我的字符集做一些事情 但我现在不知道从哪里开始 在页面顶部我插入了 该字段在dbase中的搭配是 utf8 unicode ci 在网页中显示
  • Android studio 在 KMP/KMM/KN 中添加了错误的 xcodeproj 位置

    我正在尝试运行全新的 KMM 应用程序和我之前创建的现有 KMM 应用程序 当我尝试从 Android Studio 运行 iOS 版本时 我没有 iOS 配置 当我创建 iOS 配置时 我收到一个必须首先修复的错误 当我按下 修复它 按钮
  • 检查 PHP 类中的会话变量

    在我的索引页面顶部 使用以下命令设置会话 SESSION language english 当我回显 SESSION language 时 它回显 english 但是会话值在 PHP 类中不可读 为什么呢 你必须打电话session st
  • iOS 7 用 UIPickerView 打开 UITableViewController 很慢

    据此这个问题和 KyleC 的友善回答我已经实现了UITableViewController其中有许多行依赖于从核心数据中获取 每行显示一个简单的NSString 获取的对象的名称 并且有一个UIPickerView hidden 问题是
  • cin 条件检查错误

    我是一名学习c 的初学者程序员 我在使用 cin 命令时遇到了一个棘手的问题 在下面的程序部分中 如果我在第一个 cin 命令处输入错误的类型 则程序将根本不会执行以下任何 cin 命令 但会执行程序的其余部分 start include
  • CSS:顶部与顶部边缘

    我不确定我是否完全理解这两者之间的区别 有人可以解释为什么我会使用其中一种而不是另一种以及它们有何不同吗 如果您想将一个 块 元素从文档流中的其他元素移开 您可以使用边距 这意味着它将把以下元素推开 进一步向下 请注意 相邻块元素的垂直边距
  • 如何返回数组中可能存在的一组连续数字?

    如果我有一个已排序的数组 如何找到连续的数字 顺便说一句 这是为了确定扑克牌是否是顺子 数组中的重复项已被删除 我可以做到这一点 但这将是一种多行方法 我认为可能有一个使用可枚举方法的快速单行方法 例如 FindSequence 9 8 7
  • 如何知道黑莓设备是否有 GPS?

    我想知道设备是否有 GPS 对于 5 0 以下的设备如何做到这一点 查看文档Location Provider 在不同情况下的一些设备上尝试此代码 我认为它应该有效 try LocationProvider lp LocationProvi
  • 如何获取 Spring 4.1 使用的 Jackson ObjectMapper?

    Spring 4 1实例化一个JacksonObjectMapper实例 我有理由想要 Autowire将该实例放入我的一个控制器中 该控制器使用 Jackson 对它自己进行一些小的 JSON 解析 但是ObjectMapper它使用的应
  • 将container_of宏应用于嵌入的char数组时报告警告

    当我申请时container of宏到包含 char 数组的 C 结构 我得到警告 从不兼容的指针类型进行初始化 这是代码 define container of ptr type member const typeof type 0 gt
  • 字符串文字中的转义序列 (Fortran)

    C 中有一个例子 string str str First n Second n Third n cout lt lt str lt lt endl 输出将是 First Second Third 我想尝试在 Fortran 中重复它 但没
  • 如何连接Python IMAP4_SSL和自签名服务器SSL证书?

    我正在使用 python3 和imaplib连接到 Exchange 服务器 Exchange 服务器使用为主机名 my server fqdn 创建的自签名证书 最近在我的工作站 Ubuntu 14 04 上升级操作系统后 我的 pyth
  • Cin.get() 与 C++ 的问题[重复]

    这个问题在这里已经有答案了 我仍然不知道 Visual Studio 是如何工作的 据说它会让我的控制台保持打开状态 但事实并非如此 它仍然闪烁并关闭 难道我做错了什么 include
  • 我的 Linux 可执行程序(64 位)中的段 00 是什么

    这是一个非常简单的汇编程序 只需返回12执行后 cat a asm global start section text start mov rax 60 system call for exit mov rdi 12 exit code 1