目录
一、实验楼 实验七
1. test.c新增exec函数
cd LinuxKernel
rm -rf menu
git clone https://github.com/mengning/menu.git
cd menu
mv test_exec.c test.c
vi test.c
2. 编译运行,查看函数实现
int Exec(int argc, char *argv[])
{
int pid;
/* fork another process */
pid = fork();
if (pid < 0)
{
/* error occurred */
fprintf(stderr,"Fork Failed!");
exit(-1);
}
else if (pid == 0)
{
/* child process */
printf("This is Child Process!\n");
execlp("/hello","hello",NULL);
}
else
{
/* parent process */
printf("This is Parent Process!\n");
/* parent will wait for the child to complete*/
wait(NULL);
printf("Child Complete!\n");
}
}
3. gbp跟踪分析
4. 设置断点,单步跟踪
5. 总结
静态链接的可执行程序和动态链接的可执行程序在执行 execve 系统调用返回时有一些不同之处。
静态链接的可执行程序:在静态链接时,所有程序运行所需的库函数和其他依赖项都被编译进可执行文件中。因此,当执行 execve 系统调用时,操作系统加载整个可执行文件到内存中,并开始执行程序。这意味着可执行文件本身包含了所有运行所需的代码和数据,不需要额外的库文件来支持程序的执行。
动态链接的可执行程序:在动态链接时,程序的依赖项(如库函数)并不被编译进可执行文件中,而是作为独立的共享库文件存在。因此,当执行 execve 系统调用时,操作系统加载可执行文件到内存中,但并不立即执行程序。相反,操作系统会解析可执行文件中的动态链接信息,并加载所需的共享库文件。然后,操作系统将程序的控制权转移到入口点(entry point),并开始执行程序。