zoukankan      html  css  js  c++  java
  • linux下so动态库一些不为人知的秘密(转)

    linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲动态库方面知识。
    基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看

    # ldd /bin/ls

    使用 ldd -u /bin/ls 查看不需要链接的so

    大家知不知道linux从程序(program或对象)变成进程(process或进程),要经过哪些步骤呢,这里如果详细的说,估计要另开一篇文章。
    简单的说分三步:
        1、fork进程,在内核创建进程相关内核项,加载进程可执行文件;
        2、查找依赖的so,一一加载映射虚拟地址
        3、初始化程序变量。
    可以看到,第二步中dll依赖越多,进程启动越慢,并且发布程序的时候,这些链接但没有使用的so,同样要一起跟着发布,否则进程启动时候,会失败,找不到对应的so。
    所以我们不能像上面那样,把一些毫无意义的so链接进来,浪费资源。但是开发
    人员写makefile 一般有没有那么细心,图省事方便,那么有什么好的办法呢。继续看下去,下面会给你解决方法。

    运行程序的时候找不到依赖的so。一般人使用方法是修改LD_LIBRARY_PATH这个环境变量
    export LD_LIBRARY_PATH=/tmp

    这样就OK了, 不过这样export 只对当前shell有效,当另开一个shell时候,又要重新设置。
    可以把export LD_LIBRARY_PATH=/tmp 语句写到 ~/.bashrc中,这样就对当前用户有效了,
    写到/etc/bashrc中就对所有用户有效了。

    http://blog.chinaunix.net/uid-27105712-id-3313293.html

    http://blog.chinaunix.net/uid-27105712-id-3313327.html

  • 相关阅读:
    Extension Methods(扩展方法)
    linux面试题
    渗透测试 day4
    渗透测试 day3
    渗透测试 day2
    渗透测试 day1
    9.3 网络安全介绍
    9.2 Iptables
    8.30 进程管理
    8.29 linux的网络
  • 原文地址:https://www.cnblogs.com/softidea/p/3930912.html
Copyright © 2011-2022 走看看