精华内容
下载资源
问答
  • 共享库与静态库的区别在于,共享库只是在调用模块中嵌入调用代码的在库的相对位置的地址,当执行程序时,共享库会和程序一起加载到内存中...共享库以.so结尾,Linux下需要以lib开头 下面将以libmath.so来说明如何创...

    共享库与静态库的区别在于,共享库只是在调用模块中嵌入调用代码的在库的相对位置的地址,当执行程序时,共享库会和程序一起加载到内存中,当执行到调用共享库中代码的指令时跳转到共享库中执行,执行完毕后在跳转回来。
    相比于静态库占用空间小,方便更新(共享库发生变化后,程序不需要再次编译),但相比于静态库执行效率略低。
    共享库以.so结尾,Linux下需要以lib开头
    下面将以libmath.so来说明如何创建和使用共享库。

    1、创建共享库

    编译出位置无关目标文件(也就是在编译时加上-fpic):
    	gcc -c -fpic x1.c x2.c-> x1.o x2.o
    链接生成共享库:
    	gcc -shared x1.o x2.o -o libmath.so
    

    2、调用共享库

    可以直接调用共享库:需要调用者要和共享库库在同一路径下
    	gcc main.c libmath.so
    设置环境变量:
    	1.打开 vim ~/.bashrc 文件
       	2.在文件末尾添加一行
        		export LIBRARY_PATH=$LIBRARY_PATH:库文件的路径(如果需要删除环境变量,需要在~/.bashrc中删除环境变量后,关掉终端,重新启动终端才能生效)
       	3.重新加载配置文件 source ~/.bashrc
       	4.编译时要指定库名
        		gcc main.c -lmath(-l是在编译时加库,math是libmath.so去掉lib和.so)
    设置编译参数:-L共享库的路径
    	gcc main.c -L共享库的路径 -lmath 
    

    3、运行

    在使用共享库时,调用者只是记录了被代码在库的位置,因此在执行时需要共享库同时被加载。操作系统会根据LD_LIBRARY_PATH环境变量的设置来加载共享库。

    展开全文
  • linux下共享库(.so文件)的调用

    千次阅读 2018-01-23 15:38:36
    记住 复制文件的时候千万不要用ROOT权限,不然编译时会找不到这个共享库。最好时把库放到/usr/lib chmod 777  chown username CMakeLists.txt写法: link_directories(/home/yanlei/catkin_new/src/motordriver...

    需要的文件 libxxxx.so 、xxxx.h

    记住 复制文件的时候千万不要用ROOT权限,不然编译时会找不到这个共享库。最好时把库放到/usr/lib

    chmod 777 

    chown username

    CMakeLists.txt写法:

    link_directories(/home/yanlei/catkin_new/src/motordriver/include/motordriver)
    #这个放在add_excutable前面
    ## Specify libraries to link a library or executable target against
    target_link_libraries(${PROJECT_NAME}_node libEposCmd.so)
    #这个放在add_excutable后面

     
    


    展开全文
  • CSDN上竟然没有搜到这个PPT,我就把这个共享上来吧。 好像linux共享库注入的技术已经比较成熟了,但是没有很多人讨论。。。 相当于windows的hook技术一样。等我再仔细研究研究
  • linux下共享库注入技术代码库。
  • Linux下共享库的创建和使用示例

    千次阅读 2015-07-08 16:35:42
    动态链接库是一种代码共享形式,便于模块化的开发与扩展。作为开发人员有必要详细了解其过程。...ldconfig负责维护soname到实际共享库的链接的高速缓冲文件 高速缓冲文件中维护的链接关系被ld.so在加载时进行使用。

    动态链接库是一种代码共享形式,便于模块化的开发与扩展。作为开发人员有必要详细了解其过程。


    动态链接库的使用过程主要涉及到两个部分:

    1.动态链接器 ld.so

    2.ldconfig

    其中:

    ld.so负责加载应用程序所需的soname对应的共享库

    ldconfig负责维护soname到实际共享库的链接的高速缓冲文件

    高速缓冲文件中维护的链接关系被ld.so在加载时进行使用。


    动态库的创建过程如下:

    先描述一下创建过程中用到的几个名字:

    动态库实际名字:

    形如:

    libexample.so.1.2.3

    其中example是用于辨识库的主要部分,用于gcc的-l选项之后:gcc -lexample。

    1为major number,主版本号,不同的主版本号之间不要求兼容性。

    2为minor number,次版本号,较大的次版本号需要保证向后兼容,因此一般用于追加新接口。

    3为patch number,又称发行号,release number,用于bugfix。

    soname:

    形如:

    libexample.so.1

    包括主版本号,主要用于写入共享库头中以供链接器写入应用程序,并用于在ld.so加载动态库时查找高速缓冲文件。

    动态库链接名字:

    libexample.so

    用于链接器在链接过程中查找动态库。


    示例:

    示例过程简要描述:

    创建一个简单的共享库libcalc.so

    创建一个应用程序调用libcalc.so


    libcalc.so的源码如下:

    calc.h头文件(包含函数声明):

    int add(int,int);
    int minus(int,int);

    calc.c 源文件(函数的实现):

    int add(int a,int b) {
        return a+b;
    }
    
    int minus(int a,int b) {
        return a-b;
    }

    应用程序源码如下:

    main.c:

    #include <stdio.h>
    #include "calc.h"
    
    int main() {
        printf("%d %d\n",add(5,3),minus(5,3));
        return 0;
    }

    创建共享库:

    1.文件列表:


    2.编译可加载到任何地址的代码,注意选项-fPIC


    3.链接生成共享库,注意-shared与-Wl,-Wl负责把-soname libcalc.so.1传递给实际完成工作的链接器。


    4.生成两个符号链接,libcalc.so.1用于ld.so查找动态链接库并加载,libcalc.so用于链接器编译应用程序时查找符号。


    5.链接生成应用程序,注意各选项。


    6.尝试执行生成的应用程序,应该是无法找到共享库的,注意这里报的名字是libcalc.so.1,是libcalc.so.1.0.0的soname,并非链接时使用的libcalc.so,也不是libcalc.so指向的库文件名。


    7.用根用户权限修改一下ld.so查找时的路径配置,默认情况下在/etc/ld.so.conf,此处可以修改ld.so.conf.d目录下的内容,为了便利就直接修改该配置文件了。


    8.修改后的配置文件


    9.使用ldconfig更新高速缓存文件,注意由于之前写的当前文件,则需在共享库所在目录下执行ldconfig,退出根用户,执行应用程序,结果成功。


    10.最后不要忘了将ld.so.conf还原。

    展开全文
  • Linux下共享库的查找顺序

    千次阅读 2017-02-21 00:07:01
    在接手一个很古老的程序时,发现其所使用的动态都实在是太陈旧了,正式运行环境中部署的都是相适应的,而目前的开发测试环境中均是部署的新的升级版本...因此在这里复习一下linux中程序对动态链接的搜索顺序,如

    http://www.cnblogs.com/lovevivi/archive/2013/01/15/2861211.html

    在接手一个很古老的程序时,发现其所使用的动态库都实在是太陈旧了,正式运行环境中部署的库都是相适应的,而目前的开发测试环境中均是部署的新的升级版本。为了能在这些环境下开发测试,程序得能在自定义的路径里来搜索。因此在这里复习一下linux中程序对动态链接库的搜索顺序,如下所述:

    1.首先查看程序文件的.dynamic 段是否包含了一个叫DT_RPATH的项(它是一个以冒号分隔的库文件搜索目录列表)。

       怎么设置这个选项?

       需要在编译连接程序的时候使用-Wl,-rpath选项,假设一个程序test需要使用liblib.so库,如下所示进行编译连接:



    g++ -o test -L. -llib -Wl,rpath=./ test.cpp


    这样在执行test程序时,test便会先到./即当前目录下查找所需要的动态库liblib.so

    2.查找是否存在环境变量 LD_LIBRARY_PATH(它是一个以冒号分隔的库文件搜索目录列表)。

       怎么设置这个选项?当然是设置linux下的环境变量就可以了。

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./


    当然,这种方法是对当前登录生效的。如果想开机即有效,跟其它环境变量的设置也是一样,需要修改一些配置文件。

    3.查看库高速缓存文件 /etc/ld.so.conf ,它包含了库名和路径的一个对应列表,如果库名存在,连接器就使用它对应的路径,用这个查找方法能够找到大部分的库。

       怎么设置这个选项?可以直接编辑ld.so.conf加入需要查找的路径,也可以在/etc/ld.so.conf.d目录下的己有文件中加入路径,或者在该目录下新建一个文件(名字为*.conf即可),再把需要的路径加入到该文件中。最后执行ldconfig即可生效。

    4.查找默认路径/lib和/usr/lib,

    如果经过了以上的步骤仍然查找失败,则将报错并退出相关程序。

    对于前三个步骤来说,我们均是可以进行设置调整的,其中第三个步骤中的设置需要root权限才能进行,且会影响所有的程序。当使用第一、第二中的方法进行了设置调整后,我们便可以使多种版本的库共存在同一环境下进行测试,同名也无所谓。
    *********************************************************************

    环境变量LD_LIBRARY_PATH用来指定查找共享库时除了默认路径之外的其他路径。(该路径在默认路径之前查找)
    移植程序时的经常碰到需要使用一些特定的动态库,而这些编译好的动态库放在我们自己建立的目录里,这时我们可以设置LD_LIBRARY_PATH。
    例:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/work/lib/
    这样就可以使用/work/lib/下的库文件了,运行程序后系统会自动到环境变量LD_LIBRARY_PATH指定的路径中查找其所需的库。
    系统查找动态库的顺序
    系统先找LD_LIBRARY_PATH下的库再找/lib and /usr/lib等路径下的库,还有/etc/ld.so.conf里指定的路径(如果ld.so.conf存在),man ldconfig for more information
    [url=http://infomax/bbs/misc.php?action=viewratings&tid=111&pid=228][/url]
    使Linux启动之后就加载LD_LIBRARY_PATH的路径
    /etc/rc.d/rc.local文件中加入export LD_LIBRARY_PATH="xxxxx" 即可
    如果在链接时使用了"-R"和"-L"选项,则相关动态库的路径将保存在ELF文件中,于
    是以后的运行中不再需要设置环境变量去定位动态库。比如,有一个
    /usr/local/lib/libfoo.so,而你的bar程序需要这个libfoo.so,编译、链接时最好
    这样 :gcc -Wall -pipe -O3 -o bar -R/usr/local/lib -L/usr/local/lib bar.c -lfoo

    展开全文
  • 测试代码:Linux共享库(动态库)与进程之间全局变量是无法共享
  • 随着程序写的逐渐变多,或多或少的我们都会使用别人写好的库;...共享库是在Linux下的称呼,在Windows被称为动态库。这块大家需要了解的是程序在编译时使用的库和程序在运行时使用的库需要...
  • Linux下静态库、共享库的创建与应用

    千次阅读 多人点赞 2019-02-15 09:53:56
    1 什么是静态库和共享库 1.1 为什么要有静态库和共享库 1.2 静态库和共享库的区别 2 用例子说明两种库的创建与应用 2.1 静态库的创建与应用 2.1.1 静态库的创建 2.1.2 静态库的应用 2.1.3 静态库搜索路径 ...
  • 当有多个程序使用同一个共享库的时候,我们都知道,多个程序有多个进程,但是共享库在内存中只有一份。所以问题来了:如果我在共享库中定义了全局变量,那 么全局变量是不是也只有一份?如果是这样,那么当多个进程...
  • 运行 linux 程序时出现 ./XXX: error while loading shared libraries:XXX: cannot open shared object file: No such file or directory 1.查看这个程序执行什么哪些动态链接 输入 ldd 目标程序 发现有一...
  • linux下共享库的系统路径和查找

    千次阅读 2012-11-11 10:53:54
    在使用qvfb做framebuffer模拟的时候,发现几个问题:... 由于在ubuntu编译qvfb缺少了很多文件,而在没有网络的情况,补齐这些和头文件是非常麻烦的,所以准备在fedora中编译好后再放到ubuntu中使用.由于ubuntu和fed
  • Linux共享库路径配置

    千次阅读 2018-08-01 10:04:33
    Linux共享库路径配置  Linux找不到共享库文件的典型现象为明明已经安装某个软包(如libnet,mysql),编译链接可以正常进行,但是在运行时出现如“error while loading shared libraries: libnet.so.1:...
  • Linux共享内存类库

    2015-08-07 08:55:34
    封装好的共享内存类库。 static SHSTATUS CreateShareBlock(int key, long blockSize, void **blockAddress); static SHSTATUS DestroyShareBlock(int key, long blockSize, void **blockAddress);
  • Linux共享库概述

    千次阅读 2017-10-12 22:17:25
    Linux共享库概述共享库是一种将库函数打包成一个单元使之能够在运行时被多个进程共享的技术。这种技术能够节省磁盘空间和RAM。在继续阐述共享库之前,先来说说静态库,它是比共享库更早的存在。静态库也称为归档文件...
  • Linux下创建自己的共享库

    千次阅读 2015-11-27 10:05:24
    Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库Linux系统有几个重要的目录存放相应的函数库,如/lib, /usr/lib。静态函数库、动态函数库A. 这类库的名字一般是libxxx.a;利用静态函数库编译成的...
  • Linux共享库版本化

    2012-09-28 08:53:22
    linux library version 向前兼容
  • 创建共享库和一般的共享对象.so基本一致,主要还是GCC的两个参数-shared –fPIC(意义不用多说,分别指明共享和PIC地址无关)在前面说过gcc指令其实对于与cl\ld等具体程序的调用封装,故而完全可以在gcc指令传输一...
  • Linux下共享库路径配置问题

    千次阅读 2012-03-02 18:19:18
    linux下,还提供了另外一种方式来完成同样的功能,你可以把要优先加载的共享库的文件名写在/etc/ld.so.preload里。当然,这是系统范围内全局有效的,而环境变量只对当前shell有效。 LD_ DEBUG 这个环境...
  • Linux下的动态共享库(so)开发调用

    千次阅读 2013-07-21 16:51:19
    翻译并根据实际情况进行了小小修改,仅关注Linux下动态共享库(Dynamic shared library .so)的开发. 1 简单的so实例 源文件 //test1.c int test1(){  return 1; } //test2.c int test2(){  ...
  • Linux下Qt创建和调用共享库文件.so

    千次阅读 2018-04-14 09:43:56
    Linux下Qt创建和调用共享库文件.so费了点功夫,总算get了编写共享库(Shared Library,Windows称为“动态链接库”,即Dynamic Link Library)和调用的这个新技能!动态链接库的好处是不言而喻的,一个稍微复杂一点...
  • linux下共享库的一个有用工具objdump

    千次阅读 2013-03-26 18:56:24
    objdump可以用来得到共享库的SONAME, RPATH, 依赖库等等重要信息,具体用法如下: 1. 获取共享库 objdump -x libfoo.so | grep NEEDED 输出结果如下:  NEEDED libinit-1.0.so.0  NEEDED libgui.so  ...
  • Linux下共享库的制作与使用

    千次阅读 2008-03-26 16:12:00
    Linux下共享库的制作与使用还是使用上面的例子程序: 生成共享库(动态链接库):#>gcc -fpic -shared -o libstr.so Strlen.c Strnlen.c-fpic 使输出的对象模块是按照可重定位地址方式生成的。-shared指定把对应的...
  • Linux下共享库路径配置问题[ZZ|FY]

    千次阅读 2008-11-05 15:55:00
    Linux下共享库路径配置问题 问题由来: 安装了程序,执行时报错: error while loading shared libraries: libmsg_queue.so.0: cannot open shared object file:  No such file or directory ...
  • ,还提供了另外一种方式来完成同样的功能,你可以把要优先加载的共享库的文件名写在 /etc/ld.so.preload 里。当然,这是系统范围内全局有效的,而环境变量只对当前 shell 有效。   LD_ DEBUG 这个环境...
  • linux 共享库.rar

    2011-07-21 22:27:08
    linux 共享库 so 初级介绍,linux 共享库 so 初级介绍
  • Linux 配置共享库目录

    千次阅读 2018-03-02 17:10:52
    安装共享库之后,需要对共享库进行配置路径,不然找不到调用的共享库中的函数执行程序时的错误信息:./redisAsync: error while loading shared libraries: libevent-2.1.so.6: cannot open shared object file: No ...
  • 编写一个程序使用我们上一节构建的共享库。 1,准备工作 请在/backup/cmake 目录建立 t4 目录,本节所有资源将存储在 t4 目录。 2,重复以前的步骤,建立 src 目录,编写源文件 main.c main.c的内容如下: #include ...
  • linux下有两种库:动态库和静态库(共享库)二者的不同点在于代码被载入的时刻不同。静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大。动态库(共享库)的代码在可执行程序运行时才载入内存,在编译过程中...
  • Linux找不到共享库问题解决

    千次阅读 2018-12-05 17:06:03
    我们需要将共享库所在目录加入到系统的扫面目录。 1、将共享库复制到系统默认目录 系统默认扫描目录为/lib、/usr/lib、/usr/local/lib,这三个目录加入效果都一样,只是因为规范问题所以有多个目录。将xxxx.so文件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 229,853
精华内容 91,941
关键字:

linux下共享库

linux 订阅