`
猫太的鱼
  • 浏览: 239226 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ld-linux.so查找共享库的顺序

 
阅读更多
Glibc安装的库中有一个为ld-linux.so.X,其中X为一个数字,在不同的平台上名字也会不同。可以用ldd查看:

引用
#ldd /bin/cat
linux-gate.so.1 => (0x00bfe000)
libc.so.6 => /lib/libc.so.6 (0x00a4a000)
/lib/ld-linux.so.2 (0x00a28000)


最后一个没有=>的就是。其中第一个不是实际的库文件,你是找不到的,它是一个虚拟库文件用于和kernel交互。

ld-linux.so是专门负责寻找库文件的库。以cat为例,cat首先告诉ld-linux.so它需要libc.so.6这个库文件,ld-linux.so将按一定顺序找到libc.so.6库再给cat调用。

那ld-linux.so又是怎么找到的呢?其实不用找,ld-linux.so的位置是写死在程序中的,gcc在编译程序时就写死在里面了。Gcc写到程序中ld-linux.so的位置是可以改变的,通过修改gcc的spec文件。
运行时,ld-linux.so查找共享库的顺序

(1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看
(2)ld-linux.so.6缺省在/usr/lib和lib中搜索;当glibc安装到/usr/local下时,它查找/usr/local/lib
(3)LD_LIBRARY_PATH环境变量中所设定的路径
(4)/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中所指定的路径,由ldconfig生成二进制的ld.so.cache中
编译时,ld-linux.so查找共享库的顺序

(1)ld-linux.so.6由gcc的spec文件中所设定
(2)gcc --print-search-dirs所打印出的路径,主要是libgcc_s.so等库。可以通过GCC_EXEC_PREFIX来设定
(3)LIBRARY_PATH环境变量中所设定的路径,或编译的命令行中指定的-L/usr/local/lib
(4)binutils中的ld所设定的缺省搜索路径顺序,编译binutils时指定。(可以通过“ld --verbose | grep SEARCH”来查看)
(5)二进制程序的搜索路径顺序为PATH环境变量中所设定。一般/usr/local/bin高于/usr/bin
(6)编译时的头文件的搜索路径顺序,与library的查找顺序类似。一般/usr/local/include高于/usr/include
分享到:
评论

相关推荐

    c之动态库与静态库

    当程序运行时,动态链接器(如`ld-linux.so`)会按照上述顺序查找并加载所需的共享库。 #### 八、安装新的库 如果想要在系统中安装一个新的动态库,需要确保动态链接器能够找到它。如果将库文件放置在`/lib`或`/...

    linux动态链接的基本知识

    5. **环境变量和缓存文件**:动态链接器会根据环境变量`LD_LIBRARY_PATH`以及缓存文件`/etc/ld.so.cache`来查找和加载共享库。 #### 四、动态链接器的搜索路径 动态链接器在搜索共享库时遵循一定的顺序: 1. **...

    linux gcc生成动态库和静态库

    在Linux系统中,对于ELF格式的可执行文件,动态链接器`ld-linux.so`会按照以下顺序查找库文件: - ELF文件中的`DT_RPATH`段 - 环境变量`LD_LIBRARY_PATH` - `/etc/ld.so.cache`文件列表 - 默认搜索路径`/lib/`和`/...

    linux_dongtai_lib.zip_linux 动态库

    在Linux系统中,动态库(Dynamic Link Libraries,也称为共享对象或.so文件)是程序运行时需要调用的代码库,它们被多个程序共享,节省了内存资源并方便了代码的更新与维护。本资料“linux_dongtai_lib.zip”专注于...

    Linux静态库和动态库

    当程序运行时,动态链接器(ld-linux.so*)负责查找并加载所需的动态库。查找顺序包括elf文件的DT_RPATH段、环境变量`LD_LIBRARY_PATH`、系统缓存文件`/etc/ld.so.cache`以及默认的`/lib`和`/usr/lib`目录。 #### ...

    linux静态库和动态库分析

    在运行时,系统通过动态链接器(如`ld-linux.so*`)查找并加载可执行程序依赖的库。动态链接器会按照一定的顺序搜索库文件,包括DT_RPATH段、`LD_LIBRARY_PATH`环境变量、`/etc/ld.so.cache`文件列表、`/lib/`和`/...

    为 Linux 应用程序编写 DLL.doc

    例如,`hello.c`程序在编译后生成的`a.out`文件,会依赖于`libc.so.6`和`ld-linux.so.2`这样的共享库。 Linux提供了一系列API来支持动态库的使用,这些API包括: 1. `dlopen`:打开共享库文件并将其映射到内存中,...

    Linux和Unix下的动态库和静态库编写方法

    当编译器遇到`-l`选项时,它会按照以下顺序查找库: 1. 在命令行指定的目录(通过`-L`选项)。 2. 环境变量`LD_LIBRARY_PATH`指定的目录。 3. 系统默认的库路径(如`/usr/lib`和`/usr/local/lib`)。 总的来说,...

    嵌入式系统/ARM技术中的Linux下动态共享库加载时的搜索路径详解

    动态链接器ld.so遵循一定的规则来查找动态共享库: 1. **ELF可执行文件中的DT_RPATH**:在编译目标代码时,通过`-Wl,-rpath`链接参数,可以在可执行文件的动态段中指定动态库的搜索路径。这种方法相对不常见,但当...

    libmysqlclientso20.rar

    - **动态链接库的搜索路径**:在Linux中,系统会按照`/etc/ld.so.conf`文件中指定的路径顺序,以及默认的一些标准路径(如/lib和/usr/lib*/)来查找动态链接库。 - **ldconfig命令**:ldconfig是Linux系统的一个...

    Linux C静态链接库与动态链接库编程简单介绍

    在编译和运行时,系统会按照一定的顺序查找链接库。默认情况下,会检查标准系统目录,如`/usr/lib`和`/lib`。如果库位于自定义路径,可以使用`-L`选项在编译时指定,或通过`LD_LIBRARY_PATH`环境变量在运行时指定。 ...

    库搜索路径 库搜索路径

    在Linux系统中,当一个程序启动时,系统会根据一系列预设的规则来查找所需的共享库文件。这些规则包括: 1. **硬编码路径**:开发者可以在编译时直接指定共享库的路径。 2. **环境变量LD_LIBRARY_PATH**:用户可以...

    详解Linux动态库生成与使用指南

    动态库的搜索顺序通常是:程序DT_RPATH段、`LD_LIBRARY_PATH`环境变量、`/etc/ld.so.cache`缓存(由`ldconfig`生成,包含了`/etc/ld.so.conf`配置文件中指定的路径)以及默认的系统路径`/lib`和`/usr/lib`。...

    Linux下动态链接库加载路径及搜索路径问题

    在Linux操作系统中,动态链接库(Dynamic Linker Libraries,简称DLL或.so文件)是程序运行时不可或缺的部分,它们提供了一些共享功能,使得多个应用程序可以共用同一份代码,节省内存资源。本文将深入探讨Linux下...

    ELF文件格式

    - 动态链接器(如`ld-linux.so`)负责加载程序所需的共享库,处理GOT和PLT中的重定位项。 - 动态链接可以延迟加载(lazy binding),即在实际引用时才进行重定位,除非环境变量`LD_BIND_NOW`设置为非空。 - 动态...

    浅谈Linux的库文件

    而动态库的查找顺序通常是:先查找`LD_LIBRARY_PATH`环境变量指定的目录,接着是`/etc/ld.so.conf`文件中定义的路径,最后是默认的`/lib`和`/usr/lib`目录。 如果在非标准路径下安装了新的库,需要让系统能够找到它...

    分析Windows和Linux动态库

    在Linux操作系统中,动态链接库通常被称为共享库(Shared Libraries),其文件扩展名为`.so`。Linux下的动态库与Windows下的DLL有着相似的功能和用途,但其实现机制有所不同。 **Linux动态库的特点:** - **动态...

Global site tag (gtag.js) - Google Analytics