我很好奇 main() 被调用之前发生的事情,比如将可执行文件加载到内存中,共享库的动态加载。你对如何通过动手练习来理解这些事情有什么建议吗?
我所知道和现在使用的工具包括:
- 跟踪
- 拆卸
- 自述
- /proc/pid/map
注意:我知道很棒的书籍链接器和加载器,但动手练习可能比阅读本书更能教会我。
如果您想检查二进制文件的打包方式及其不同部分,我认为最好的程序是objdump。
选择任何可执行文件并执行以下操作:
objdump -S <executable> > myfile.S
另一个很好的练习是:
这将回答您关于幕后发生的事情以及如何发生的一些问题。
例如
LD_DEBUG=all cat </dev/null
我发现了两个有趣的相关链接(至少对于 Linux),并且比上面提到的书(链接器和加载器)短一点
当我在大学上操作系统课时,我们使用了Nachos。它本身不是操作系统,而是一种在用户空间中运行的操作系统“模拟”。它是用 C++ 编写的,您可以交叉编译 Nachos 然后可以加载和运行的可执行文件。您可以玩系统调用接口,并且在一般情况下,您可以通过玩弄代码来进行尽可能多的实验。
我们在 Solaris 实验室中运行它,在我的个人机器上的 Linux 上启动和运行它时遇到了一些麻烦,但如果你愿意深入研究一些代码,它可能是一个有趣的玩具。
我意识到这对于您正在寻找的东西可能很多,但是编写自己的汇编器和链接器将非常有教育意义。我在大学的时候就做过,而且很喜欢。我记得大概需要 120 个小时的工作才能让它完成我想要它做的基本事情。我认为这个项目比其他任何事情都更让我确信编程职业适合我。