相关疑难解决方法(0)

ELF文件格式中节和段的区别是什么

来自wiki 可执行文件和可链接格式:

这些段包含运行时执行文件所必需的信息,而段包含用于链接和重定位的重要数据.整个文件中的任何字节最多只能由一个部分拥有,并且可能存在不属于任何部分的孤立字节.

但是段和段之间有什么区别?在可执行的ELF文件中,段是否包含一个或多个部分?

linux debian gnu elf abi

60
推荐指数
3
解决办法
2万
查看次数

考虑到指令具有不同的长度,CPU 如何知道它应该为下一条指令读取多少字节?

所以我正在阅读一篇论文,其中他们说静态反汇编二进制代码是不可判定的,因为一系列字节可以用图片(其 x86 )所示的尽可能多的方式表示

拆卸

所以我的问题是:

  1. 那么CPU如何执行呢?例如在图中,当我们到达 C3 之后,它如何知道下一条指令应该读取多少字节?

  2. CPU如何知道在执行一条指令后PC应该增加多少?它是否以某种方式存储当前指令的大小并在它想要增加 PC 时添加它?

  3. 如果 CPU 能够以某种方式知道它应该为下一条指令读取多少字节或者基本上如何解释下一条指令,为什么我们不能静态地做到这一点?

cpu x86 assembly

5
推荐指数
1
解决办法
870
查看次数

指令解码器如何区分前缀和主要操作码之间的区别?

我正在尝试围绕 x86 指令编码格式。我阅读的所有资料仍然使这个主题变得混乱。我开始有点理解它,但我无法理解的一件事是 CPU 指令解码器如何区分操作码前缀和操作码。

我知道指令的整个格式基本上取决于操作码(当然在操作码中定义了额外的位字段)。有时指令没有前缀,操作码是第一个字节。解码器怎么知道?

我假设指令解码器能够分辨出差异,因为操作码字节和前缀字节不会共享相同的二进制值。因此解码器可以判断字节中唯一的二进制数是指令还是前缀。例如(在本例中,我们将坚持使用单字节操作码)REXLOCK前缀不会与架构指令集中的任何操作码共享相同的字节值。

x86 assembly cpu-architecture machine-code instruction-encoding

5
推荐指数
1
解决办法
104
查看次数

将EAX复制到RAX更高位?

我想知道是否有任何指令序列,而不使用任何其他寄存器将RAX的低32位复制到其高32位.当然,我也希望EAX完好无损.

先感谢您.

assembly x86-64

4
推荐指数
3
解决办法
537
查看次数

在.text部分中定义只读数据的原因是什么?

我正在学习汇编和低级编程,并阅读有关它.据说我们可以将任何数据放在elf文件的.text部分中,但当然我们不能因为页面/段的不同权限而改变它.但是没有告诉那里,因为在.text部分内部有数据的原因是什么.许多C++程序员也告诉我g ++编译器

static const char DATA[] = "SOME DATA";
Run Code Online (Sandbox Code Playgroud)

也在.text部分内.我想知道,为什么不将这些数据放在.rodata部分,目的是什么?如果使用.text,那么.rodata中应该存储什么?

主要问题是在长模式下的这种行为.

c++ assembly

4
推荐指数
1
解决办法
341
查看次数

完全理解.exe文件是如何执行的

目标

我想了解可执行文件的工作原理。我希望详细了解一个非常具体的示例将使我能够做到这一点。我的最终目标(可能过于雄心勃勃)是获取一个 hello-world .exe 文件(使用 C 编译器编译并链接)并详细了解它是如何加载到内存中并由 x86 处理器执行的。如果我成功了,我想写一篇文章和/或制作关于它的视频,因为我还没有在互联网上找到这样的东西。

我想问的具体问题用粗体标出。当然,非常欢迎任何进一步的建议和来源做类似的事情。非常感谢您的帮助!

我需要的

答案概述了 C 代码在作为程序进入物理内存之前所经历的过程。我还不确定我有多想研究 C 代码是如何编译的。有没有办法在汇编之前查看 C 编译器生成的汇编代码?我可能会认为了解加载和链接过程是值得的。与此同时,我需要了解的最重要的部分是

  • PA 可执行文件格式
  • 汇编代码与 x86 字节码的关系
  • 加载过程(即如何使用来自可执行文件的信息准备执行过程 RAM)。

我对 PA 格式有一个非常基本的了解(这种理解将在“到目前为止我学到的东西”一节中概述)并且我认为那里提供的资料应该足够了,我只需要再研究一下,直到我足够了解基本的 Hello-World 程序。当然,非常欢迎有关此主题的更多来源

对于 x86 来说,将字节码转换为汇编代码(反汇编)似乎相当困难。尽管如此,我很想了解更多关于它的信息。您将如何反汇编一个短字节代码段?

我仍在寻找一种查看进程内存(分配给它的虚拟内存)内容的方法。我已经研究过 windows-kernel32.dll 函数,例如ReadProcessMemory但还不能让它工作。我也很奇怪似乎没有(免费)工具可用于此目的。再加上对加载的理解,我也许就能理解进程是如何从 RAM 运行的。此外,我正在寻找允许查看整个进程虚拟内存内容的汇编程序员的调试工具。我目前搜索的起点是这个问题。您对我如何查看和理解从 RAM 加载和进程执行有进一步的建议吗?

到目前为止我学到了什么

这个 StackOverflow 问题的其余部分详细描述了我到目前为止所学到的知识并提供了各种来源。它旨在可复制并帮助任何试图理解这一点的人。但是,我对目前看到的示例仍然有一些疑问。

PA格式

在 Windows 中,可执行文件遵循PA 格式。在官方文件这篇文章给出的格式的一个很好的概述。该格式描述了 .exe 文件中各个字节的含义。开头是我不会担心的 DOS 程序(出于遗留原因包括在内)。然后是一堆标头,它们提供有关可执行文件的信息。实际的文件内容被分成具有名称的部分,例如“.rdata”。在文件头之后,还有段头,它告诉您文件的哪些部分是哪个段以及每个段的作用(例如,如果它包含可执行代码)。

可以使用诸如 dumpbin(用于查看二进制文件的微软工具)之类的工具来解析标题和部分。为了与 dumpbin 输出进行比较,可以使用十六进制编辑器甚至使用 Powershell(命令Format-Hex -Path <Path …

windows assembly executable disassembly

4
推荐指数
1
解决办法
1106
查看次数

TLB 是否包括在内?

TLB 层次结构是否包含在现代 x86 CPU(例如 Skylake 或其他 Lakes)上?

例如,prefetchtn将数据带到级别缓存n + 1以及 DTLB 中的相应 TLB 条目。它也会包含在 STLB 中吗?

x86 assembly cpu-architecture tlb

2
推荐指数
1
解决办法
318
查看次数