C 理解如何将程序加载到内存并执行的任何动手练习
我对调用main()之前发生的事情很好奇,比如将可执行文件加载到内存中,动态加载共享库。你对如何通过手上练习来理解这些东西有什么建议吗 据我所知,目前正在使用的工具和物品包括:C 理解如何将程序加载到内存并执行的任何动手练习,c,linux,mips,loader,elf,C,Linux,Mips,Loader,Elf,我对调用main()之前发生的事情很好奇,比如将可执行文件加载到内存中,动态加载共享库。你对如何通过手上练习来理解这些东西有什么建议吗 据我所知,目前正在使用的工具和物品包括: 斜射 拆开 雷德尔夫 /proc/pid/map 注:我知道这本好书,但实际操作可能比阅读这本书教我更好。如果你想检查二进制文件的打包方式和不同部分,我认为最好的程序是 选择任何可执行文件并执行以下操作: objdump -S <executable> > myfile.S objdump-S>myfi
- 斜射
- 拆开
- 雷德尔夫
- /proc/pid/map
注:我知道这本好书,但实际操作可能比阅读这本书教我更好。如果你想检查二进制文件的打包方式和不同部分,我认为最好的程序是 选择任何可执行文件并执行以下操作:
objdump -S <executable> > myfile.S
objdump-S>myfile.S
另一个好的做法是:
- 创建使用外部库的程序
- 使用静态链接编译程序
- 运行程序
- 重命名库文件并检查程序是否运行
- 使用共享库编译程序
- 重命名库并检查程序是否运行
这将回答你的一些问题,关于幕后发生了什么以及如何发生的。当我在大学上操作系统课时,我们使用了。它本身不是一个操作系统,而是一种在用户空间中运行的操作系统“模拟”。它是用C++编写的,可以跨编译可执行文件,然后NACHOS可以加载和运行。您可以玩系统调用接口,在一般情况下,您可以通过玩弄代码来进行任意实验
我们在Solaris实验室运行了它,我在我的个人机器上安装它并在Linux上运行时遇到了一些麻烦,但如果你愿意深入研究一些代码,它可能是一个有趣的玩具。我意识到它可能对你所寻找的东西有很大帮助,但编写自己的汇编程序和链接程序将非常有教育意义。我在大学的时候就做过,而且很喜欢。据我回忆,大概花了120个小时的时间才完成了我想要它完成的基本任务。我认为这个项目比其他任何东西都更能让我确信编程职业适合我。
- ld.so记录了几个环境变量,这些变量可以设置为调整动态链接过程或提供其他详细信息
LD_DEBUG=all cat我发现了两个有趣的相关链接(至少对于Linux是这样),比前面提到的书(linker和Loaders)要短一点
LD_DEBUG=all cat </dev/null