动态库又叫动态共享文件(.so,Dynamic Shared Objects)和静态库(.a)都是将一些待重用的公共代码打包成一种特殊的重定位目标文件。

在使用时,连接器会将静态库中所有的代码,编译到可执行文件中。动态库有链接时动态库和运行时库之分。链接时,连接器会查找出使用的库中函数以及变量,在可执行文件中定向位置。可执行文件运行时,还需要根据文件中信息,在环境变量中去查找对应的库和对应的符号。

1、静态库和动态库度的区别?

静态库在使用的时侯会将所有代码直接拷贝到可执行文件中,在运行时可执行文件和静态库没有关联。但最后生成的执行文件较大,并且如果有多个执行文件使用了同一个静态库,在运行时内存中会有多份相同的代码。而且在链接时有较多度的处理,导致链接时的速度较慢。

动态库没有将代码编译进执行文件,只是在编译时向执行文件中添加了用到的符号的信息。生成的执行文件相对较小,在运行时,执行该文件首先会在内存中查找或者在文件系统加载用到的动态库。动态库的使用一般都是共享的,多个进程使用同一个动态库中的代码。使用动态库的优点是生成的执行文件较小,占用内存也较小,编译速度相对来说较快。缺点是部署时必须确认环境。

动态库还有一种dlopen(3)打开库的使用方式,通常成为显示调用,而链接方式通常称为隐式调用。首先通过dlopen(filename,flags) 打开动态库,返回动态库标识符,然后使用dlsym(3)[void *dlsym(void *handle, const char *symbol);]获得函数指针。关闭动态库调用使用dlclose();输出错误并清除errno使用dlerror();

2、linux下有哪些调试库信息的命令。

静态库本身被编译进执行文件,文件中包含所有运行时需要度符号和实现,不会报symbol缺失。

查看库文件本身信息可以用readelf。

查看当前执行文件依赖的动态库信息可以使用readelf -d。

查看执行文件的symbol信息使用nm命令。

查看执行文件依赖的共享文件的名称和位置使用ldd命令。

3、编译静态库和动态库的选项。

linux编译静态库命令为ar

gcc/g++编译动态库命令为-shared

4、一些问题。

a:如果动态库使用c++实现,那么使用dlopen打开动态库后,有可能无法根据函数名称获得其在内存中的偏移量。这是因为c++符号信息与c有很多不同,编译时g++会给符号添加许多信息来区别标识符重载、不同命名空间等,dlsym获取不到正确信息是正常的。解决办法是使用[extern "C"]方式将c++符号导出为c符号。

b:动态库编译时使用-fPIC的原因 见https://www.cnblogs.com/cswuyg/p/3830703.html

未完待续......

浅谈linux静态库、动态库。的更多相关文章

  1. linux静态与动态库创建及使用实例

    一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...

  2. Linux中的动态库和静态库(.a/.la/.so/.o)

    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...

  3. Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

    Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://b ...

  4. Linux系统中“动态库”和“静态库”那点事儿【转】

    转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻. ...

  5. Linux系统中“动态库”和“静态库”那点事儿

    摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在 ...

  6. Linux 静态库&动态库调用

    1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...

  7. Linux中创建和使用静态库&动态库

    库本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行 Linux下库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在 ...

  8. C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

    目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...

  9. 【转】分析Linux和windows动态库

    原文地址:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Lin ...

随机推荐

  1. SQL注入之Sqli-labs系列第一篇

    在开始接触渗透测试开始,最初玩的最多的就是Sql注入,注入神器阿D.明小子.穿山甲等一切工具风靡至今.当初都是以日站为乐趣,从安全法实施后在没有任何授权的情况下,要想练手只能本地环境进行练手,对于sq ...

  2. Web安全概述

    互联网刚开始是安全的,但是伴随着黑客(Hacker)的诞生,互联网变得越来越不安全.任何一个事情都有两面性,黑客也有好有坏,好的黑客叫白帽子,坏的黑客叫黑帽子.与此同时,随着Web技术发展越来越成熟, ...

  3. 移动前端的html5 head 头标签

    DOCTYPE DOCTYPE(Document Type),该声明位于文档中最前面的位置,处于 html 标签之前,此标签告知浏览器文档使用哪种 HTML 或者 XHTML 规范. 使用 HTML5 ...

  4. NVisionXRFBXConverter(Beta版)实践课程

    一.前言 NVisionXR引擎使用的模型格式为.mesh(具体请看NVisionXR引擎基本介绍:http://www.arvrschool.com/read-7381 ),为了能够将常见的格式转换 ...

  5. rtmp发布录制视频

    本文描述了rtmp发布本地视频的流程 一.简要介绍 RTMP协议规定,播放一个流媒体有两个前提步骤:第一步,建立一个网络连接(NetConnection):第二步,建立一个网络流(NetStream) ...

  6. C语言第二次博客作业

    一.PTA实验作业 题目1:计算分段函数[2] 本题目要求计算下列分段函数f(x)的值: 1.实验代码 int main (void) { double x,y; scanf("%lf&qu ...

  7. 第五次作业-需求&原型改进

    需求&原型改进 0. 团队介绍 团队名称:121ComeOn 项目名称:个人博客项目 团队组成: PM:黄金筱(107) 成员:王枫(031),刘烨(255),周明浩(277) github地 ...

  8. 弹幕视频播放app案例分析

    产品 哔哩哔哩动画 相对于其他视频播放软件来说,哔哩哔哩动画没有广告影响观看体验,而且内容更偏重于二次元,因此我更倾向于使用它. 第一部分 调研, 评测 #第一次上手体验 用起来还是比较方便,可以快速 ...

  9. python的迭代器、生成器、装饰器

    迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...

  10. 一个轻量级iOS安全框架:SSKeyChain

    摘要 SSKeyChains对苹果安全框架API进行了简单封装,支持对存储在钥匙串中密码.账户进行访问,包括读取.删除和设置.SSKeyChain的作者是大名鼎鼎的SSToolkit的作者samsof ...