在Linux下,C++源代码如何成为可执行文件或静态/动态库。以及程序运行时如何加载到内存中

2024-04-16

我知道源代码可以编译并链接到共享/静态库或 ELF 可执行文件。当程序运行时,它会加载到内存中并根据ELF格式创建一个进程映像。但我不确定程序如何加载共享库。链接器如何在外部库中查找符号以及 .a 存档如何工作。如果程序在 64 位操作系统上运行,我还应该知道什么?

我试图画出它的全貌。有人可以对整个事情进行一般性的讨论,并提供参考文献/文档/链接,以便我可以一一研究它们。

提前致谢。

我想我的问题可以描述为:

在Linux下,C++源代码如何成为可执行文件或静态/动态库。以及程序运行时如何加载到内存中。详细信息!

我可以使用多少工具来检查/操作 Linux 二进制文件(可执行文件和库)?我知道有些是“nm”“readelf”。


您可以阅读:

  • the 组装方法 http://tldp.org/HOWTO/Assembly-HOWTO/
  • 从开机到 Bash 提示符 http://tldp.org/HOWTO/From-PowerUp-To-Bash-Prompt-HOWTO.html
  • 维基百科关于系统调用 http://en.wikipedia.org/wiki/System_call, Linux内核 http://en.wikipedia.org/wiki/Linux_kernel, 虚拟内存 http://en.wikipedia.org/wiki/Virtual_memory, 地址空间 http://en.wikipedia.org/wiki/Address_space, Process http://en.wikipedia.org/wiki/Process_%28computing%29, Compiler http://en.wikipedia.org/wiki/Compiler, Linker http://en.wikipedia.org/wiki/Linker_%28computing%29, 汇编语言 http://en.wikipedia.org/wiki/Assembly_language#Assembler, GCC http://en.wikipedia.org/wiki/GNU_Compiler_Collection, ELF http://en.wikipedia.org/wiki/Executable_and_Linkable_Format
  • 莱文的书关于链接器和加载器 http://www.iecc.com/linker/
  • x86-84 http://www.x86-64.org/documentation.html,特别是关于x86-64 ABI http://www.x86-64.org/documentation/abi.pdf%E2%80%8E规格
  • the 高级Linux编程 http://www.advancedlinuxprogramming.com/ book
  • several 系统调用(2) http://linux.die.net/man/2/syscalls手册页,特别是intro(2) http://linux.die.net/man/2/intro, 执行(2) http://linux.die.net/man/2/execve, mmap(2) http://linux.die.net/man/2/mmap, fork(2) http://linux.die.net/man/2/fork
  • ELF病毒编写指南 http://virus.bartolich.at/virus-writing-HOWTO/_html/index.html
  • 海湾合作委员会文档 http://gcc.gnu.org/onlinedocs/(特别是内部结构)
  • Binutils 文档 http://sourceware.org/binutils/docs-2.22/
  • 程序库指南 http://www.dwheeler.com/program-library/Program-Library-HOWTO/
  • 德雷珀的论文:如何编写共享库 http://www.akkadia.org/drepper/dsohowto.pdf

以及有关 Linux 内核和应用程序编程的好书。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Linux下,C++源代码如何成为可执行文件或静态/动态库。以及程序运行时如何加载到内存中 的相关文章

随机推荐

  • 如何检查日期时间段的交集[重复]

    这个问题在这里已经有答案了 我有四个 DateTime 对象 A1 A2 和 B1 B2 我需要知道 A1 A2 期间与 B1 B2 期间不相交 但我不想写脏代码 就像许多 if 块一样 if A1 lt B1 A2 gt B1 retur
  • 如何使用c++在运行时动态注册工厂类中的类

    现在 我实现了一个工厂类来动态创建带有标识字符串的类 请参见以下代码 void IOFactory registerIO Register NDAM9020 gt IOBase return new NDAM9020 Register BK
  • 如何更改 tkinter 树视图中选定单元格的前景色或背景色?

    我想更改 tkinter treeview 中选定单元格的前景色或背景色 我怎样才能做到这一点 This link https stackoverflow com a 18057449 5722359显示了更改树视图中所有单元格颜色的命令
  • 构建一个完整的在线支付网关,如 Paypal [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 所以这个问题不是关于将现有的支付网关集成到我的网站中 这更多的是一个架构问题 我想建立一个类似于Paypal 的系统 现在我知道 Pa
  • 如何使用 Firebase 函数向用户发送 FCM?

    Firebase 目前已推出Firebase 功能添加服务器端代码 Firebase 功能 https firebase google com docs functions 我想知道当数据库发生某些变化时是否可以通过这些函数调用 FCM 通
  • DB2 将 ISO 8601 时间戳字符串转换为 DB2 时间戳

    我有一个要求 我需要获取两个 ISO 8601 时间戳格式的字符串 并且必须比较它们并获取它们的最大时间戳 字符串采用以下格式 2014 06 11T16 45 45Z 为了进行比较 我需要将它们转换为 DB2 时间戳 然后进行比较 问题出
  • 获取 Roslyn 中类之间的依赖关系

    我使用 Roslyn 成功获取了项目之间的依赖关系 现在我想获取类之间的依赖关系 类似于 Visual Studio Enterprise 中的代码映射功能 这是我的代码 部分是我想象我能得到一些东西的地方 不过 我对 Roslyn API
  • VBA用于在文本溢出时缩小PowerPoint中的字体

    我正在尝试为 PowerPoint 文件找到一个宏 该文件是通过 CAT 工具进行语言转换后导出的 在某些语言对中 由于语言长度的差异 翻译的内容将无法放入源文件文本框中 因此 翻译和导出的 PowerPoint 文件包含多个形状 文本框
  • 检测是否安装了 SQL Server Compact Edition 3.5 SP2 x64?

    我正在构建一个安装程序 并且想要引导 SQL Server Compact Edition 3 5 SP2 问题是我正在寻找注册表项HKLM SOFTWARE Microsoft Microsoft SQL Server Compact E
  • 如何向文本框添加按钮?

    我正在尝试制作一个右侧带有按钮的文本框 我的代码 public partial class TextBoxButton TextBox Category Button Description Button in textbox public
  • SQL Server 中的 DECODE() 函数

    SELECT PC COMP CODE R PC RESUB REF DECODE PC SL LDGR CODE 02 DR CR PC DEPT NO DEPT PC DEPT NO PC SL LDGR CODE PC SL ACNO
  • Jquery mobile 中的选择选项出现问题

    我有一个表格 其中包含输入文本以及选择选项和按钮 单击按钮时将克隆表格行 除了选择选项之外 一切都工作正常 克隆表行后 选择选项不会显示我选择的内容 这是 JsFiddlehttp jsfiddle net aravinth Ad22d h
  • Android 中相机捕获图像的图像叠加

    我需要用相机拍照 同时在相机视图顶部显示叠加图像 拍照后 我需要保存用户在拍照时看到的内容 有人可以建议我吗 请 public void onPictureTaken byte data Camera camera Bitmap camer
  • 检查orientdb中是否存在类

    如何检查东方数据库中是否存在类 如果它不存在于数据库中 我需要创建它并插入一条记录 如果存在 我需要插入该记录 我需要使用 JAVA 做同样的事情 您可以使用以下语句通过 SQL 检索架构信息 select expand classes f
  • 如何读取 Windows 特定扩展名

    在 OpenGL superible 中 示例说我可以通过以下方式读取 Windows 特定扩展 Type defined in the book as char but that is not what glGetString retur
  • C# 在发布模式下运行时,调试语句会被编译出来吗?

    使用说似乎是理想的 就可读性而言 Debug WriteLine写入输出而不是大量 if DEBUG声明 当程序在发布模式下编译时 所有开销都用Debug WriteLine消失就好像它不存在一样 或者该函数仍然被调用 但内部没有执行任何操
  • 使用“xts”包中的“to.weekly”函数导致错误的周末结束日期

    我有一个非常奇怪的问题 我正在使用to weekly and to period函数来转换每日xts反对每周数据 在大多数情况下 我将周末结束日期设为星期五 day of week函数将返回 5 例如 2010 01 08 2011 02
  • 如何从网络共享调试 Visual Studio 2010 中的解决方案?

    我最近购买了一台新的 Mac 笔记本电脑 并在 Parallels 虚拟机中运行 VS2010 它对我来说基本上运行良好 但我在调试特定项目类型时遇到了一些问题 这与项目是通过网络共享访问的事实有关 测试项目无法运行 因为测试运行程序无法加
  • 使用 Access 2007 中窗体上的按钮打开外部文件

    我正在为我的部队创建一个数据库 我在陆军 我需要一个按钮 单击该按钮即可启动文件 该文件是一个 xfdl 文件 用于 PureEdge 程序中的军事表格 这是否可能以及我将如何去做 我已经尽我所能地搜索了它 但似乎我的 Google Fu
  • 在Linux下,C++源代码如何成为可执行文件或静态/动态库。以及程序运行时如何加载到内存中

    我知道源代码可以编译并链接到共享 静态库或 ELF 可执行文件 当程序运行时 它会加载到内存中并根据ELF格式创建一个进程映像 但我不确定程序如何加载共享库 链接器如何在外部库中查找符号以及 a 存档如何工作 如果程序在 64 位操作系统上