我知道源代码可以编译并链接到共享/静态库或 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(使用前将#替换为@)