Linux最小负载地址与LD

时间:2015-02-18 01:16:49

标签: linux linux-kernel ld elf

在了解Linux中ELF程序加载的过程中,我试图尝试段的加载地址。

将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

我不明白的是:

  • 当满足aligment要求时,为什么一个小地址不起作用(被杀)?
  • 如果记录了最小化要求的地址?
  • 为什么它使用更高的基址,即0x16000?

我在64位计算机上使用Arch Linux内核3.17.1和ld 2.24

进行此测试

1 个答案:

答案 0 :(得分:3)

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

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