【问题标题】:segfault when printing memory打印内存时出现段错误
【发布时间】:2016-08-06 20:10:30
【问题描述】:

我写了一些代码来从地址读取数据。该地址属于代码段(我反汇编我的二进制文件并查找 main 所在的位置,因此地址来自那里)。主要目标是改变内容。当我打印它时,它会导致段错误。是某种保护吗?

void at(){


    char *p = 0x0000000100000f47;
    printf("%c", p[0]);

}

int main(){

    at();

    return 0;
}

【问题讨论】:

  • 也许你在一个操作系统上运行你的代码,而那个操作系统没有让你的程序访问物理内存,也没有给你的程序/进程分配虚拟地址 0x0000000100000f47。
  • 为什么不char *p = (char *)main;。这样您就不必担心绝对地址和重定位。

标签: c memory disassembly


【解决方案1】:

这是某种保护吗?

是的。分割!这就是你得到分段错误的原因。

我反汇编我的二进制文件并查找 main 所在的位置,所以地址来自那里

这没什么好说的;当一个可执行文件被加载时,它的一部分会被重新定位,所以它们最终会出现在不同的位置。

这是一个相当复杂的过程(而且容易出错),它涉及到 libc/rtloader/your OS/black magic;这里甚至可能会发生内存布局随机化(不过,对于您的代码,可能不会),因此运行时有意确保您无法“猜测”某些事物的内存位置。

【讨论】:

  • 好的,我明白了。这确实是一个愚蠢的问题。计算机可能无法始终将我的二进制文件定位在相同的内存空间中。谢谢
  • 有可能,但这不是可执行加载器所做的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多