当前位置:  技术问答>linux和unix

kernel 加载动态链接库问题

    来源: 互联网  发布时间:2016-08-24

    本文导语:  一个动态链接库,及从它在文件系统一个文件夹下开始到真正加载到内存中,其它进程可以访问,再到其卸载移出内存的过程是怎样的。 要求用实际代码说明 首先,一个xxx.so是在应用层被什么处理的,哪个程序?...

一个动态链接库,及从它在文件系统一个文件夹下开始到真正加载到内存中,其它进程可以访问,再到其卸载移出内存的过程是怎样的。


要求用实际代码说明


首先,一个xxx.so是在应用层被什么处理的,哪个程序?

其次,这个xxx.so进一步如何加载到内核的?

再次,在内核中哪一部分是处理动态链接库的代码?

最后,内核中对动态链接库的卸载代码在哪里?



谢谢了,各位xdjm,  谢谢了。

|
1.首先是编译阶段,这就涉及到ELF文件的相关知识,如果某个可执行程序依赖一个动态库里面的函数,那么编译生成的ELF会记录这个动态库的名字以及这个程序调用的符号,这就区别于静态链接。也就是这个可执行程序并不存xxx的实际代码。
int xxx(int x, int y)
{
  printf("x is %d, y is %dn");
}

把这个编成一个.so的话,然后

int main()
{
  xxx(3,5);
}

2.执行这个程序,跟其他的ELF执行没什么两样,只是执行到这个函数的时候会有区别,这块有GOT和PLT等概念,对于普通函数的调用,编译器生成代码为call addr。其中addr是被调用函数的地址。调用来自动态链接库的函数时,其addr无法在link阶段确定,编译器只能生成call PLT[n]。PLT[n]指PLT表的第n个表项。 
PLT每个表项有三行代码: 
line1: jump GOT[n] 
line2: push "func name" 
line3: jump dl_runtime_resolve 
因此当程序执行到call PLT[n]时,就跳到line1了,初始情况下,GOT[n]的值就是line2的地址。因此这条语句相当于nop。后两个语句就是调用dl_runtime_resolve去一个叫link map的结构中查找真正要调用的函数地址。这个过程完成后,GOT[n]的内容就被修改成真正要调用的函数的地址。这样下次程序再次走到call PLT[n]时,line1就直接跳到真正的来自动态链接库的函数地址,而不需要走line2和line3了。 (这也是为什么程序刚加载的时候执行比较慢,而后来执行就快起来的原因了。)

3.这些东西在glibc中实现,跟kernel有关的就是执行ELF文件的过程以及相关的syscall。

    
 
 

您可能感兴趣的文章:

  • linux kernel启动中,网络加载问题
  • 关于制作只用ramdisk+kernel的linux系统,也可以不用ramdisk,只要加载后全部在内存中运行
  • 驱动加载时出现“couldn't find the kernel version the module was compiled for”
  • 求求大虾了,kernel加载提示 unable to mount devfs err -2
  • 紧急求救!!!请问怎样重新加载Linux的内核Kernel软件包,恢复grub从/dev/hda5的第一个扇区的启动?
  • 再加100分!吐血求救了!请问怎样重新加载Linux的内核Kernel软件包,恢复grub从/dev/hda5的第一个超级块扇区的启动?
  • 一个很怪的现象:同样的驱动代码,ko模块方式加载工作正常,直接编入内核却导致kernel panic崩溃
  • kernel链接文件问题
  • 求一个可用的kernel-devel下载链接,ubuntu-10.04.2-desktop-i386
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux Kernel module下如何动态分配内存
  • java命名空间java.awt.image类kernel的类成员方法: kernel定义及介绍
  • lock_kernel unlock_kernel编译不通过
  • java命名空间java.awt.image类kernel的类成员方法: getheight定义及介绍
  • linux-3ES-13.9.5安装oracle10g时更改/etc/sysctl.conf没有kernel.shmmax,kernel.shmmni
  • java命名空间java.awt.image类kernel的类成员方法: getwidth定义及介绍
  • ▲求助:kernel panic:No init found.try passing init=option to kernel.
  • java命名空间java.awt.image类kernel的类成员方法: getkerneldata定义及介绍
  • kernel too old , kernel panic原因
  • java命名空间java.awt.image类kernel的类成员方法: getyorigin定义及介绍
  • 区分uboot和kernel的宏
  • java命名空间java.awt.image类kernel的类成员方法: clone定义及介绍
  • kernel升级问题,初学,大家指教。
  • Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞
  • 关于www.kernel.org结构
  • CentOS 6.5 下载地址及如何升级内核(kernel)版本到 3.10.28
  • __kernel_vsyscall 是什么?
  • 急!怎么没有/usr/src/kernel目录啊?
  • Uncompressing Linux... done, booting the kernel
  • Come in please! About the kernel.3X
  • 一个Kernel panic的问题怎么解决?
  • [救命]安装Ubuntu 时的Kernel Panic - not syncing 错误~


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3