Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 理解如何将程序加载到内存并执行的任何动手练习_C_Linux_Mips_Loader_Elf - Fatal编程技术网

C 理解如何将程序加载到内存并执行的任何动手练习

C 理解如何将程序加载到内存并执行的任何动手练习,c,linux,mips,loader,elf,C,Linux,Mips,Loader,Elf,我对调用main()之前发生的事情很好奇,比如将可执行文件加载到内存中,动态加载共享库。你对如何通过手上练习来理解这些东西有什么建议吗 据我所知,目前正在使用的工具和物品包括: 斜射 拆开 雷德尔夫 /proc/pid/map 注:我知道这本好书,但实际操作可能比阅读这本书教我更好。如果你想检查二进制文件的打包方式和不同部分,我认为最好的程序是 选择任何可执行文件并执行以下操作: objdump -S <executable> > myfile.S objdump-S>myfi

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

据我所知,目前正在使用的工具和物品包括:

  • 斜射
  • 拆开
  • 雷德尔夫
  • /proc/pid/map

注:我知道这本好书,但实际操作可能比阅读这本书教我更好。

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

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


objdump -S <executable>  > myfile.S

objdump-S>myfile.S
另一个好的做法是:

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

这将回答你的一些问题,关于幕后发生了什么以及如何发生的。

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


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

我意识到它可能对你所寻找的东西有很大帮助,但编写自己的汇编程序和链接程序将非常有教育意义。我在大学的时候就做过,而且很喜欢。据我回忆,大概花了120个小时的时间才完成了我想要它完成的基本任务。我认为这个项目比其他任何东西都更能让我确信编程职业适合我。

  • ld.so记录了几个环境变量,这些变量可以设置为调整动态链接过程或提供其他详细信息
e、 g


LD_DEBUG=all cat我发现了两个有趣的相关链接(至少对于Linux是这样),比前面提到的书(linker和Loaders)要短一点

LD_DEBUG=all cat </dev/null