2023-2024-1 20232809《Linux内核原理与分析》第八周作业

目录

一、实验楼 实验七

二、GPT辅助学习


一、实验楼 实验七

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),并开始执行程序。

二、GPT辅助学习

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值