- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我参加了三星的面试。他们问了很多关于程序内存布局的问题。我对此几乎一无所知。
我用谷歌搜索了“可执行程序的内存布局”。 “进程的内存布局”。
我很惊讶地发现关于这些主题的信息并不多。大多数结果是论坛查询。我只是想知道为什么?
这些是我找到的几个链接:
我想从一本合适的书而不是一些网络链接中学习这一点。(兰迪海德的书也是一本书,但其他书)。我可以在哪本书中找到关于这个主题的清晰和更多信息?
我也想知道,为什么操作系统的书没有在他们的书中介绍这个?我读了stallings第6版。它只是讨论了过程控制 block 。
整个布局的创建是linker
的任务对吧?我在哪里可以阅读有关此过程的更多信息。我想要从磁盘上的程序到处理器上执行的COMPLETE信息。
编辑:
最初,即使在阅读了下面给出的答案后,我也不清楚。最近,我读了这些文章,我明白了。
帮助我理解的资源:
- www.tenouk.com/Bufferoverflowc/Bufferoverflow1b.html
- 5 part PE file format tutorial: http://win32assembly.online.fr/tutorials.html
- Excellent article : http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html
- PE Explorer: http://www.heaventools.com/
是的,“可执行程序的布局(PE/ELF)”!=“进程的内存布局”)。在第 3 个链接中自行查找。 :)
清除我的概念后,我的问题让我看起来很愚蠢。 :)
最佳答案
加载方式在很大程度上取决于操作系统和使用的二进制格式,而且细节可能会令人讨厌。二进制文件的布局有标准,但进程的内存布局实际上取决于操作系统。这可能是文档很难找到的原因。
回答您的问题:
可执行代码由编译器和链接器创建,但链接器将事物以操作系统所需的二进制格式放置。在 Linux 上,此格式通常为 ELF , 在 Windows 和更早的 Unix 上是 COFF , 在 Mac OS X 上是 Mach-O .不过,这不是一个固定的列表。一些操作系统可以并且确实支持多种二进制格式。链接器需要知道输出格式才能创建可执行文件。
进程的内存布局与二进制格式非常相似,因为很多二进制格式被设计为mmap'd
。让装载机的工作更轻松。
这并不是相当那么简单。二进制格式的某些部分(如静态数据)不直接存储在二进制文件中。相反,二进制文件只包含这些部分的大小。当进程加载到内存中时,加载器知道分配正确的内存量,但二进制文件不需要包含大的空白部分。
此外,进程的内存布局包括一些空间用于 stack和 heap ,进程的调用帧和动态分配的内存去哪里。它们通常位于大地址空间的两端。
这实际上只是触及了如何加载二进制文件的皮毛,并没有涉及任何关于动态库的内容。要详细了解动态链接和加载的工作原理,请阅读 How to Write Shared Libraries .
关于memory - 有关可执行程序(进程)的内存布局的更多信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1966920/
所以问题是:如何使用标准 C 库以跨平台方式实现简单的自检可执行文件? 在这里,我正在寻找技术,而不是特定的检查方法(如 CRC 或哈希码),但该技术可能包含更适合某些方法的元素(例如见下文)。 目的
我想构建一个 C++ 可执行文件,以便所有库也附加到可执行文件。构建这样一个可执行文件的方法是什么?因此,每当我在其他 PC(运行 Ubuntu)上使用 g++ 编译我的代码时,它不需要运行该可执行文
我在 Netbeans IDE 8.0.1 中编写了一个名为 SampleChat 的 Java GUI 程序,并使用“clean and build”功能创建了一个 jar 文件。 我进入 Netb
我有两个 DLL,一个用 native C++ 编写,另一个用 C++/CLI 编写。前者被注入(inject)到进程中,并在稍后的时间点加载后者。在调试时,我注意到 native DLL 的断点运行
如何访问可执行文件的机器代码(二进制文件)? 详情 我使用的是 Ubuntu (Linux) 我想访问 .exe 文件(文件遵循 PE 格式)的机器代码(二进制文件) 我正在使用 C 来实现 最佳答案
这个问题在这里已经有了答案: Run java jar file on a server as background process (4 个回答) 关闭1年前. 我正在使用命令提示符运行一个可执行
我的 jar 没有运行,我可以告诉它尝试运行,因为 log4j 文件设法创建日志文件夹,但没有任何 react 并且日志为空白。 我的问题是我在名为 bin 的文件夹中有 jar 文件,在名为 lib
我正在为我教育第一学期的编程考试创建一个程序。它应该向用户显示哥本哈根和其他 6 个城市(在其他时区)的时间。用户还应该能够将城市添加到列表中。我正在用 JAVA 编写程序(下面提供源代码)。当我从
我正在查看雅虎的 YUI 压缩器可执行 jar,他们有这个类,从 list 文件链接为“主类”: package com.yahoo.platform.yui.compressor; import j
问题是:从 Eclipse 导出时可执行 jar 中包含什么?我问这个问题是因为我想知道,例如,如果我在项目根目录中有一个图像,该图像是否会包含在导出中? 澄清:我说的是可运行的 jar 文件(已编辑
我知道这个问题已经被问了很多,并且我已经尝试了 eclipse(Kepler、Ganymede、Galileo)、fatJar、netbeans、blueJ、命令行和手册中的大约 20-30 种不同的
我从 IntelliJ 14.03 中的一个工件构建了一个 .jar。当我尝试在 JRE 中打开它时,没有任何反应。这只是一个简单的 GUI。 提前致谢。 最佳答案 在jar位置运行命令,例如 jav
我使用 eclipse 创建了一个可执行 JAR 文件。我在项目文件夹中有资源当框架打开时不会出现。我的意思是当我双击 JAR 文件时。更多的所以,在我尝试删除 JAR 文件后,我收到一条警告,表明该
我创建了一个尺寸相当大(125,000 kb)的可运行 Jar 文件。当我运行它时,该 jar 文件内的应用程序不会显示,但在任务管理器中 javaw.exe(应链接到该 jar 文件)进程正在运行。
我已经使用 Eclipse(文件->导出)为我的 java 程序创建了一个可执行 jar 文件。 当我双击 jar 时,它工作正常。将 jar 文件复制到另一台计算机(Windows)后,我收到错误“
我用 eclipse indigo 创建了一个可执行的 jar 文件,但是当我双击它时什么也没有发生。但是当我将 java -jar c:/dir/filename.jar 写入 cmd 时,它可以工
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
如何让该 Java 代码在 Eclipse 之外运行? import java.util.*; public class Calculations { public static void main(
今天我第一次启动 jar 文件时遇到问题。现在我知道(解压 jar 后)当我在 Eclipse 中导出并创建程序的 jar 包时,文本文件并没有出现。 为什么文本文件没有与类文件一起出现?我应该将它们
我不知道为什么,但是当我将项目导出到可执行 jar 文件时,有些东西并不像从 eclipse 运行程序一样。一帧不会打开,其中只包含文本。我有另一个内部框架,它是一个分割 Pane ,包含右侧面板上的
我是一名优秀的程序员,十分优秀!