linux下so动态库一些不为人知的秘密(转)

简介: linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲动态库方面知识。基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看 # ldd /bin/ls   使用 ldd -u /bin/ls 查看不需要链接的so 大家知不知道linux从程序(program或对象)变成进程(process或进程),要经过哪些步骤呢,这里如果详细的说,估计要另开一篇文章。

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

 

相关文章
|
1月前
|
Unix Linux vr&ar
【详解】静态库和动态库的认识和使用【Linux】
【详解】静态库和动态库的认识和使用【Linux】
|
3月前
|
Linux 编译器 Shell
深入理解Linux中的动态库与静态库
深入理解Linux中的动态库与静态库
|
6月前
|
Linux 编译器 C语言
【Hello Linux】动态库和静态库(上)
【Hello Linux】动态库和静态库
30 0
|
10月前
|
IDE 编译器 Linux
linux 编译 c或cpp 文件为动态库 so 文件(最简单直观的模板)
linux 编译 c或cpp 文件为动态库 so 文件(最简单直观的模板)
|
1月前
|
缓存 算法 Linux
深入理解Linux动态库加载:路径、问题与解决方案
深入理解Linux动态库加载:路径、问题与解决方案
66 0
|
5月前
|
Linux 编译器 vr&ar
|
1月前
|
Linux 编译器 vr&ar
【Linux】—— 详解动态库和静态库
【Linux】—— 详解动态库和静态库
|
3月前
|
Linux 编译器 vr&ar
Linux之静态库和动态库
Linux之静态库和动态库
26 0
|
4月前
|
自然语言处理 Linux 编译器
【Linux学习】动态库和静态库
【Linux学习】动态库和静态库
54 1
|
6月前
|
Linux 编译器 vr&ar
【Hello Linux】动态库和静态库(下)
【Hello Linux】动态库和静态库(下)
28 0