在了解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
我的理解如下:
我不明白的是:
我在64位计算机上使用Arch Linux内核3.17.1和ld 2.24
进行此测试答案 0 :(得分:3)
您正在考虑用户空间应用程序可以映射页面的内核限制;这些限制旨在防止某些内核漏洞利用。最小可映射地址由vm.mmap_min_addr
sysctl值设置,通常至少为4096(即0x1000)。
有关详细信息,请参阅:https://wiki.debian.org/mmap_min_addr(这种情况并非Debian独有;他们的文档只是我找到的第一个。)