【问题标题】:Position-independent executable: What is "main executable binary"?与位置无关的可执行文件:什么是“主要可执行二进制文件”?
【发布时间】:2020-05-03 09:25:10
【问题描述】:

在阅读https://en.wikipedia.org/wiki/Address_space_layout_randomization时,遇到一个名词:

位置无关的可执行文件 (PIE) 为 主可执行二进制文件 实现了一个随机基地址,并且自 2003 年以来一直存在。它为主可执行文件提供与用于共享库。

主要可执行二进制文件在这里是什么意思?它只是一个包含main函数的tu/source文件吗?

【问题讨论】:

  • 源文件被编写为人类可以理解的。可执行文件被编译为机器可理解的。可执行文件没有 main 函数,而是开始执行处理器命令的初始地址。
  • 不清楚这个问题是否有话题。然而,在上下文中,很明显我认为它指的是您启动的可执行文件,与它可能导致动态链接的任何 共享库 不同。例如,它在别处引用“库库和主要可执行文件”

标签: c terminology term aslr


【解决方案1】:

它意味着当你构建你的可执行文件时链接器的输出,在 *nix 世界中所谓的a.out 文件。编译器创建目标文件,链接器将所有依赖项解析为a.out 文件。其中一些依赖项将是外部的(动态链接库)。

主可执行文件将是操作系统(可能是链接器)在您执行它时最初加载的文件。后续加载将是动态链接库,它们是在构建过程中创建的外部依赖项。

【讨论】:

  • 在您提到 main() 函数之前,您做得很好。这是特定于语言的,并且是不必要的且可能令人困惑的添加,因为“主可执行文件”中的“主”一词与二进制可执行文件入口点的任意源级符号名称无关。问题是关于加载可执行文件,而不是链接它。
  • 可能隐含在文中讨论的平台中,ld 是生成 PIE 的主要链接工具,但“主要可执行文件”作为概念的含义并不依赖于此.这在任何具有动态链接的平台上都有意义。我可能有点迂腐,但我不希望 OP 坚持将main() 和“主要可执行文件”混为一谈——这些术语不相关,所以最好不要提及。此外,我很确定即使使用ld,您也可以通过命令开关指定替代入口点符号。
  • 实际上我收回了这一点 - 文章讨论了 Windows 上的 PIE - 其中ld 是一个不太常用的链接器。
  • 我只是查看了 GNU 的 ld 并没有看到任何入口点可变性(但我确实看到了更改 argv[0] 的余地)。但即便如此,你提到语言的可变性是对的。我很高兴你提到它。
  • @Clifford 对于入口点可变性,我现在看到您可能指的是可执行文件的创建。我的评论是关于在调用入口点之前加载可执行文件。当然,您可以在 ld 创建可执行文件时指定替代入口点是正确的。我敢打赌大多数其他链接器也可以做到。
【解决方案2】:

我假设它是带有main() 函数的二进制文件,所以是严格意义上的程序。

以前,程序是在特定的地址加载的,但是动态库已经在不同的地址加载了,所以我认为这里的 main 只是为了同情它是为程序二进制而不是为库二进制文件。

【讨论】:

  • main() 函数特定于编程语言。机器可执行文件没有,用于生成它的语言也可能没有。在整篇文章的上下文中意思很清楚,无论如何这个问题可能是题外话。
  • @Clifford:我们正在讨论 Linux。 main() 在 POSIX (-like) 世界中具有明确的角色。我认为你在非常迂腐的一面(入口点而不是主要点)。
  • 问题中没有提到 Linux,并且文章无论如何都讨论了 Windows 上的 PIE。也许是迂腐的,但符号main 与术语“主可执行文件”中的“主”一词无关——这只是巧合,所以最好不要提及,以防它被认为是“主可执行文件”因为它有一个入口点,在源代码中恰好被称为main
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 2021-07-25
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
相关资源
最近更新 更多