第七课 可执行程序的装载(3)

在课程中,老师讲解load_elf_binary函数的时候,elf文件加载位置总是内存中的位置为0x0804 0000的固定位置上。

动态链接

在load_elf_binary中如果是动态链接时:

if (elf_interpreter) {
        unsigned long interp_map_addr = 0;

        elf_entry = load_elf_interp(&loc->interp_elf_ex,
                        interpreter,
                        &interp_map_addr,
                        load_bias);
        reloc_func_desc = interp_load_addr;

        allow_write_access(interpreter);
        fput(interpreter);
        kfree(elf_interpreter);

如果执行动态链接库时会装载共享库的文件的入口地址。如果是静态的时候则执行如下代码:


    } else {
        elf_entry = loc->elf_ex.e_entry;
    }

静态的时候,入口地址在文件中定义。

start_kernel把我们返回时的下一条指令的值修改成了我们的入口地址,也就是说当我们返回execve的时候,依赖ret执行的值将会是我们的函数的入口地址值。

问题

函数的参数拷贝到堆栈中是何时拷贝的?
拷贝发生在解析文件之前。
start_kernel的ip值修改后一定是新的进程的入口地址吗?是,新的进程的入口地址,单不一定是新的程序的入口函数。因为如果是动态链接库的情况下,则是动态链接库的入口地址了。此时动态链接器将会解析文件,会找到文件到底依赖那些动态库,然后去加载到内存中。所有依赖的动态库将会形成一个树状结构,形成层层依赖关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值