gpt4 book ai didi

带 LD 的 Linux 最小加载地址

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:52:08 24 4
gpt4 key购买 nike

在理解 ELF 程序在 Linux 中加载的过程中,我试图用段的加载地址进行实验。

将 ld 与以下链接器脚本一起使用:

SECTIONS
{
. = 0x2000;
.text :
{
*(.text)
}
}

使用以下链接命令:

ld -o elftest -z max-page-size=4096 -Telftest.l elftest.o

请假设 elftest.o 是一个普通的非重要 asm 代码的编译结果。

程序正确链接到 0x2000 处的入口点。发生的事情是程序被内核杀死,并在 shell 中输出 KILLED。

我想弄清楚一件事:

这不是段错误或任何其他异常,程序甚至没有到达入口点

--segments 的 readelf 输出是

Type           Offset             VirtAddr           PhysAddr
FileSiz MemSiz Flags Align

LOAD 0x0000000000001000 0x0000000000002000 0x0000000000002000
0x0000000000000009 0x0000000000000009 R E 1000

我的理解是这样的:

  • 使用 max-page-size=4096 可以让我打破 ld https://lkml.org/lkml/2012/7/9/46 的 2MiB 对齐要求
  • 该段必须与内存页对齐,即 4KiB,因此设置为 4096 是正确的
  • 基地址是任意的,通常x86_64是0x400000

我不明白的是:

  • 当满足对齐要求时,为什么小地址不起作用(被杀死)?
  • 如果有最低要求的地址,记录在哪里?
  • 为什么它使用更高的基地址,即 0x16000?

我正在一台装有 Arch Linux 的 64 位计算机上做这个测试,内核为 3.17.1 和 ld 2.24

最佳答案

您遇到了用户空间应用程序可以将页面映射到何处的内核限制;这些限制旨在防止某些内核漏洞发挥作用。最小可映射地址由 vm.mmap_min_addr sysctl 值设置,通常至少为 4096(即 0x1000)。

详情请见:https://wiki.debian.org/mmap_min_addr (这种情况并非 Debian 独有;他们的文档只是我找到的第一个文档。)

关于带 LD 的 Linux 最小加载地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28574286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com