linux下C/C++动态库在运行时是怎样加载进来的

 我来答
huanglenzhi
2015-05-29 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517174
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
在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的属性。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式