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

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

我正在试图把它画出来。 有人可以对整个事情进行一般性的讨论,并提供参考资料/文件/链接,以便我们可以一一研究。

提前致谢。

我想我的问题可以这样描述:

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

以及我可以使用多less工具来检查/操作Linux二进制文件(可执行文件和库)? 我知道一些“纳米”“readelf”。

Solutions Collecting From Web of "在Linux下,C ++源代码如何变成可执行文件或静态/dynamic库。 以及程序在运行时如何加载到内存中"

你可以阅读:

  • 大会如何
  • 从Powerup到Bash提示
  • 关于系统调用的 Wikipedia, Linux内核 , 虚拟内存 , 地址空间 , 进程 , 编译器 , 链接器 , 汇编语言 , GCC , ELF
  • Levine关于连接器和装载机的书
  • x86-84 ,特别是关于x86-64 ABI规范
  • 高级Linux编程书
  • 几个系统调用(2)手册页,特别是介绍(2) , execve(2) , mmap(2) , fork(2)
  • ELF病毒的写作方法
  • GCC文档 (特别是内部)
  • Binutils文档
  • 程序库Howto
  • Drepper的论文: 如何编写共享库

还有关于Linux内核和应用程序编程的好书。

作为一个开始:

手册页读取:ld.so,ld,ar,gcc

实用程序:readelf,nm,ldd,objdump,c ++ filt,gdb

32与64位注意:做一个readelf -a在同一个程序的32位和64位版本和diff输出。 请注意“请求程序解释器”/lib/ld-linux.so.2与/lib64/ld-linux-x86-64.so.2之间的区别。