gdb保留的地址范围?

时间:2018-11-25 08:44:33

标签: c linux gdb

我有一个程序,可以使用MAP_FIXED上的TASK_SIZE - PAGE_SIZE在更高地址处映射内存。

如果我执行该程序,它将运行良好,但是如果我使用gdb运行该程序,则它会在mmap之后出现段错误。同样在这一点上,gdb状态似乎已完全损坏,并且执行似乎到达了一个用0's填充的地址范围(可能来自刚刚创建的新映射)。

gdb是否在运行的进程中使用此地址范围?我是否已经清除了gdb的某些状态?该地址范围是否记录在某处?

以下是我给mmap的电话和地址计算-

#define TASK_SIZE64 (0x800000000000UL - 4096)
#define TASK_SIZE TASK_SIZE64
#define PAGE_OFFSET (void*)TASK_SIZE
...
char *load_address = PAGE_OFFSET - file_size_aligned;
if(load_address != mmap(load_address, file_size_aligned, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0)){
    err("Failed to allocate memory for raw_binary with: %d\n", errno);
    return -1;
}

file_size_aligned来到PAGE_SIZE。这是分配之一。还有一个从load_address开始,并向后分配了几个页面(仅使用PROT_READPROT_WRITE)。

1 个答案:

答案 0 :(得分:1)

  

gdb是否在运行的进程中使用该地址范围?

否。

  

我已经清除了gdb的某些状态吗?

否。

  

此地址范围是否记录在某处?

可能在内核源代码中。

您的程序对可用地址空间做出了无效假设,并且在关闭ASLR的情况下运行时会“自行崩溃”(默认情况下,GDB会这样做)。

您可以通过在GDB外部运行程序,但禁用ASLR来确认这一点。它也应该崩溃。尝试以下方法之一:

# echo 0 > /proc/sys/kernel/randomize_va_space

setarch $(uname -m) -R /path/to/exe

如果启用ASLR,您还可以确认程序将在GDB下运行:

gdb /path/to/exe
(gdb) set disable-randomization off
(gdb) run