实时进程rtp依赖的库有哪些?

2019-03-19

VxWorks实时进程文章,皆依赖于辉姐和燕姐,两位大佬的公司培训,由me稍作整理。

RTP:实时进程,类似linux和windows下的进程。

rtp的整个一系列启动流程是怎样的?操作系统在中间作了什么?一个rtp运行起来又需要那些资源?带动态库的rtp又是怎么加载动态库的?这些我都非常想要去了解,带着这些疑问,我参加培训,并写下了这系列文章。而对于许多疑惑,则分文章一一记录了下来!

第一个问题:实时进程rtp依赖的库有哪些?

C库:提供常用的函数,任务管理,信号量,异步信号,字符串操作等,libc.so(动态库)/libc.a(静态库)

C++库:提供C++相关库函数,libstdc++.a等

动态加载库:提供加载动态库的功能,libdl.a

网络库:提供网络相关函数,socket等,仅提供特别基础的,常用的网络接口,网络协议栈核心部分仍在核心态,libnet.a,libdsi.a

vxe文件:RTP应用二进制文件,用户添加实现自己需求功能的程序文件,编译生成vxe文件,等同于windows的exe文件,linux下可执行文件

rtp在编译时,上诉提到的静态库(libc.a除外),都连接进入RTP中。

如果RTP配置为使用静态C库,编译时链接libc.a到vxe文件中。

如果RTP配置为使用动态C库,编译时只保存libc.so的相关信息,等到运行时再加载libc.so文件到内存中,libc.so加载成功后,vxe文件可正常调用其中的符号。

备注:me认为,链接动态库或者动态库完全取决于gcc的参数,如果使用–non-static,那么就会默认去找动态库。

FAQ:当出现调用动态库中的函数出现地址访问异常(X86为14,page fault)时,并且PC为零,需要首先关注动态库是否加载成功。

反汇编二进制时,如果发现函数后面跟着

@plt,那么该函数位于动态库中。如下:当RTP配置为使用动态C库时,调用semGive时,反汇编的表现形式如下:

链接动态库

那么,为什么叫@plt呢?其实plt是Procedure Linkage Table的简称,对应的还有got,涉及到的是函数定位的问题,这个东西我们后面再讲!