6

我很好奇 main() 被调用之前发生的事情,比如将可执行文件加载到内存中,共享库的动态加载。你对如何通过动手练习来理解这些事情有什么建议吗?

我所知道和现在使用的工具包括:

  • 跟踪
  • 拆卸
  • 自述
  • /proc/pid/map

注意:我知道很棒的书籍链接器和加载器,但动手练习可能比阅读本书更能教会我。

4

5 回答 5

3

如果您想检查二进制文件的打包方式及其不同部分,我认为最好的程序是objdump

选择任何可执行文件并执行以下操作:


objdump -S <executable>  > myfile.S

另一个很好的练习是:

  • 创建一个使用外部库的程序
  • 使用静态链接编译程序
  • 运行程序
  • 重命名库文件并检查程序是否运行
  • 使用共享库编译程序
  • 重命名库并检查程序是否运行

这将回答您关于幕后发生的事情以及如何发生的一些问题。

于 2009-07-31T03:28:42.273 回答
3
  • ld.so手册页记录了几个可以设置为调整动态链接过程或提供其他详细信息的环境变量。

例如

LD_DEBUG=all cat </dev/null
  • 您可以轻松获取所涉及的每个部分的源代码 - Linux 内核、动态链接器、C 库、启动代码(crt0.o 或类似)。您可以从研究代码并进行实验性修改开始。
于 2009-07-31T06:02:57.863 回答
2

我发现了两个有趣的相关链接(至少对于 Linux),并且比上面提到的书(链接器和加载器)短一点

于 2011-05-16T07:46:29.403 回答
1

当我在大学上操作系统课时,我们使用了Nachos它本身不是操作系统,而是一种在用户空间中运行的操作系统“模拟”。它是用 C++ 编写的,您可以交叉编译 Nachos 然后可以加载和运行的可执行文件。您可以玩系统调用接口,并且在一般情况下,您可以通过玩弄代码来进行尽可能多的实验。

我们在 Solaris 实验室中运行它,在我的个人机器上的 Linux 上启动和运行它时遇到了一些麻烦,但如果你愿意深入研究一些代码,它可能是一个有趣的玩具。

于 2009-07-31T03:31:16.343 回答
1

我意识到这对于您正在寻找的东西可能很多,但是编写自己的汇编器和链接器将非常有教育意义。我在大学的时候就做过,而且很喜欢。我记得大概需要 120 个小时的工作才能让它完成我想要它做的基本事情。我认为这个项目比其他任何事情都更让我确信编程职业适合我。

于 2009-07-31T03:31:29.320 回答