linux动态库的加载原理

在linux上,你在ps中说的那"将动态库一个参数传到程序"的使用方式,是通过dlopen函.so加载到当前进程中,并且通过ld.so将.so"链接"进当前进程。这个"链接"过程包括:查找未定义符号在当前进程中的地址、分配数据/代码/bss段内存(数据初始化全局变量、代码段重定位)、执行constructor函数等。之后,可以使用dlsym在已知符号名的情况下通过符号名查找符号对应的地址。这个符号可以是一个全局变量、全局函数等。在你说的C++中,重载的函数也可以理解为全局函数,会有一个属性为weak的符号。该符号的符号名如果不做修改,默认按照System V的C++ API命名规范命名(以保证linux下不同编译器编译出来的.so和.o可以通用)。但如果使用extern "C"修饰之后,变成C的函数名,则无名称修饰,便于使用。

作者:yin jie
链接:https://www.zhihu.com/question/29988788/answer/46352593
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。linux调用的方式种:1.静态链接库2.动态链接库3.动态库其中1,2都是在编程接调用,在链接时加参数-l进行链接第三种需要在编程时使用dlopen等函数来获取库里面函数的定义,然后进行调用.不过对于没有提供头文件的动态库,只能dlopen等函数来调用在linux上在ps中说的那种"动态库作为参数传到程序"的使用方式,是通过dlopen函数将.so加载到当前进程中,并且通过ld.so将.so"链接"进当前进程。这个"链接"过程包括:查找未定义符号在当前进程中的地址、分配数据/代码/bss段内存(数据初始化全局变量、代码段重定位)、执行constructor函数等。之后,可以使用dlsym在已知符号名的情况下通过符号名查找符号对应的地址。这个符号可以是一个全局变量、全局函数等。在你说的c++中,重载的函数也可以理解为全局函数,会有一个属性为weak的符号。该符号的符号名如果不做修改,默认按照system
v的c++
api命名规范命名(以保证linux下不同编译器编译出来的.so和.o可以通用)。但如果使用extern
"c"修饰之后,变成c的函数名,则无名称修饰,便于使用。
它怎样实例化我实现的继承类?
实例化的方式和正常链接一样。例如你在之类derived中重载了基类base中函数virtual
void
foo();那么你需要在你的.so中导出一个可以new
derived()的函数,并且返回结果为base
*,这样别人可以在没有derived定义的情况下获得运行时类型为derived的对象。此时别人虽然只有base
*的类型,但是仍然可以和正常链接一样通过虚表查virtual
void
foo()的地址,从而调用你定义的foo()。
此外,如果你定义了继承类的全局变量,在加载.so的时候该全局变量会自动初始化,你也可以将这个初始化的类通过指向base
*的指针传出去。
如果有大神能解释一下windows下动态库和静态库的原理,小弟感激不尽!
和linux差不多,不过在实现细节上有些出入。例如windows链接时要直接链接.dll需要通过链接生成这个.dll时生成的.lib,而linux上直接链接.so即可。不过运行时链接无需这个.lib。静态库都是目标文件的压缩包。都是elf格式。至于共享内存之类的,仅仅取决于section的属性。在linux上,你在ps中说的"将动态库作个参数传到里"的使用方式,是通过dlopen函.so加载到当前进程中,并且通过ld.so将.so"链接"进当前进程。这个"链接"过程包括:查找未定义符号在当前进程中的地址、分配数据/代码/bss段内存(数据初始化全局变量、代码段重定位)、执行constructor函数等。之后,可以使用dlsym在已知符号名的情况下通过符号名查找符号对应的地址。这个符号可以是一个全局变量、全局函数等。在你说的C++中,重载的函数也可以理解为全局函数,会有一个属性为weak的符号。该符号的符号名如果不做修改,默认按照System
V的C++
API命名规范命名(以保证linux下不同编译器编译出来的.so和.o可以通用)。但如果使用extern
"C"修饰之后,变成C的函数名,则无名称修饰,便于使用。
它怎样实例化我实现的继承类?
实例化的方式和正常链接一样。例如你在之类Derived中重载了基类Base中函数virtual
void
foo();那么你需要在你的.so中导出一个可以new
Derived()的函数,并且返回结果为Base
*,这样别人可以在没有Derived定义的情况下获得运行时类型为Derived的对象。此时别人虽然只有Base
*的类型,但是仍然可以和正常链接一样通过虚表查virtual
void
foo()的地址,从而调用你定义的foo()。
此外,如果你定义了继承类的全局变量,在加载.so的时候该全局变量会自动初始化,你也可以将这个初始化的类通过指向Base
*的指针传出去。
如果有大神能解释一下windows下动态库和静态库的原理,小弟感激不尽!
和Linux差不多,不过在实现细节上有些出入。例如windows链接时要直接链接.dll需要通过链接生成这个.dll时生成的.lib,而Linux上直接链接.so即可。不过运行时链接无需这个.lib。静态库都是目标文件的压缩包。都是ELF格式。至于共享内存之类的,仅仅取决于section的属性。在linux上,你在ps中说的那种"态库作为一个参数程序里"用方式,是通过dlopen函数将.so加载到当前进程中,通过ld.so将.so"链接"进当前进程。这个"链接"过程包括:查找未定义符号在当前进程中的地址、分配数据/代码/bss段内存(数据初始化全局变量、代码段重定位)、执行constructor函数等。之后,可以使用dlsym在已知符号名的情况下通过符号名查找符号对应的地址。这个符号可以是一个全局变量、全局函数等。在你说的C++中,重载的函数也可以理解为全局函数,会有一个属性为weak的符号。该符号的符号名如果不做修改,默认按照System V的C++ API命名规范命名(以保证linux下不同编译器编译出来的.so和.o可以通用)。但如果使用extern "C"修饰之后,变成C的函数名,则无名称修饰,便于使用。
喜欢阅读
  • 天生妖孽泡美男

    天生妖孽泡美男

    她,一朝穿越为凰,一人之下,万人之上!绝世六夫,先订好娃娃亲!她,只要八岁,烟火未央,与你一起欣赏脑残女主与绝世六夫的攻受大争斗。

  • 残情走进你的心

    残情走进你的心

    秦悦歆被人骂的时候,是陆晨安牵着她的手帮她一字一句地反唇相讥;秦悦歆被人打的时候,是陆晨安按着轮椅出来将她护在身后;秦悦歆说疼的时候,陆晨安二话不说拿着一把牙签就往自己的手上扎说:“我陪你一起疼!”人人都说陆晨安爱秦悦歆爱到走火入魔,就连秦悦歆也觉得陆晨安爱她爱得没有底线。她只是没想到,没有底线,只是因为从来不在他的心上停过,所以才会纵容一切。秦悦歆以为自己爱上的是一头披着狼皮的羊,却没想到陆晨安是一头披着狼皮的豹。男欢女爱是套路,可是为什么,陆晨安你不把路修到最后。

  • 佳妻难为

    佳妻难为

    结婚两年,他们却一直貌合神离……

  • 都市逆战尊王

    都市逆战尊王

    一剑斩天,睥睨天下,唯我纵横人世间。n一朝归来,杀尽天下王侯将相,冲破仙凡鬼魔,我乃无敌战神!

  • 阴婚绵绵:夫君夜夜来

    阴婚绵绵:夫君夜夜来

    午夜时分我被逼迫去墓室背尸体,被一只冰冷刺骨的手攥住了,说要娶我……

  • 墨爷宠妻三十六计

    墨爷宠妻三十六计

    安有如逃婚了!作为安家养女且刚大学毕业有男朋友的安有雪,在养母的逼迫下,迫于无奈嫁给所谓的“老头姐夫”,却不想婚后,彻底被宠上了天!新婚之夜。“外界传闻,墨家二叔墨经历年过五旬,你又是谁?帅哥!你走错洞房啦?”看着眼前年轻又俊美的男子,她疑惑道。“墨家掌权人!墨景礼!”

  • 万古剑尊

    万古剑尊

    一代剑神楚云被手足兄弟背叛,意外重生在灵武大陆少年身上。大道有轮回,苍天饶过谁?战仇敌,灭魔族。这一世,我要铸造属于我的传奇…

  • 山君:你家娘子掉了

    山君:你家娘子掉了

    墨鋆是一块青黑色的石头,而他则是掌管一方的山君。他给了她修炼成人的机会,让她知晓情为何物,也让她知道了心碎是什么感觉。历尽波折,她终于等到了他的深情告白,可……

  • 猜你喜欢
  • linux动态库
  • linux动态库和静态库
  • linux动态库加载
  • linux动态库路径问题
  • linux动态库编译
  • linux 动态库lib配置
  • linux动态库的使用
  • linux 动态库调用
  • linux 动态链接库
  • linux查看动态库函数
  • 热门推荐
  • zeiss猎鹰 50
  • tcl kf25gwn3
  • shanhai metro
  • elona银铃用内裤
  • visio2013 pro激活码
  • step7 v5.6 新特性
  • running man到底停播吗
  • 手机怎样制作海报
  • openwrt中继 双网
  • venus lux and girl
  • 高尔夫7.5最新消息
  • [黑子的篮球]迟早
  • android 心跳机制
  • jinjidejurendierji
  • ems el026059811hk
  • www.damao.cn
  • 地狱老司机连不上
  • fc2 475621 hd
  • 速龙ii x4 651k超频
  • 183.221.247.147 8280
  • All Right Reserved 强大网