linux动态库共享内存,linux 把动态库(libxxx.so)进行静态链接

在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的属性。

取消

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值