1

我需要向我的应用程序 (.elf) 添加一个新部分。我有默认的链接器脚本。然后我阅读了 GNU Linker 手册。按照手册中的说明,我编辑了链接器脚本文件。.patchText但是,当为下面显示的部分保留 0x400 字节区域时,应用程序会给出分段错误错误。

这是我编辑的链接器脚本的相关部分:

.patchText :
{
   *patchObsw.o (.text .data .rodata)
   . = 0x400;
} > ram

在这种情况下,应用程序已成功编译和链接,但运行应用程序会出现分段错误。

如果我. = 0x400;从链接器脚本中删除该行,重做编译和链接过程,它仍然是成功的,没有分段错误。

根据 GNU 链接器手册,这一行是可以的。

我不明白这里有什么问题。

4

1 回答 1

0

我假设您正在尝试在 Linux 操作系统上运行它,因为您提到了 ELF 文件。

您可能需要降低mmap_min_addr

mmap_min_addr 是一个内核可调参数,它指定允许进程映射的最小虚拟地址。允许进程映射低值会增加被称为“内核 NULL 指针取消引用”缺陷的一类缺陷的安全隐患。如果恶意本地用户找到触发这些 NULL 指针缺陷之一的方法,他们可以利用它导致系统挂起、崩溃或以其他方式使系统的某些部分无法使用。如果此用户还能够映射低部分虚拟内存,他们通常可以进一步利用此问题来获得更高的权限。

阻止应用程序映射低虚拟内存地址的缺点是某些应用程序依赖于此功能。dosemu、qemu 和 wine 是 Debian 中存在的三个这样的应用程序。请参阅下面的应用程序特定信息。

示例用法:

$ cat /proc/sys/vm/mmap_min_addr
65536
$ echo 0x1000 > /proc/sys/mmap_min_addr
$ cat /proc/sys/vm/mmap_min_addr
4096
于 2019-09-04T13:55:49.217 回答