目录

linux中的ld命令及其搜索路径顺序

===================================

linux中的ld命令及其搜索路径顺序 (*****)

文章目录

    1.ld命令
        1.1.简介
        1.2.使用示例
    2.ld命令搜索路径顺序
        2.1.搜索路径顺序
        2.2.如何查看ld(链接器)的搜索顺序及编译时需要打开的库
            2.2.1.查看ld默认搜索路径
            2.2.2.查看编译时需要打开的库

1.ld命令

参考:
Linux 命令(65)—— ld 命令
使用 ld 命令链接目标文件生成可执行文件

1.1.简介

ld(Link eDitor)命令是二进制工具集 GNU Binutils 的一员,是 GNU 链接器,用于将目标文件与库链接为可执行文件库文件

ld 命令支持众多链接选项,但是大部分选项很少被使用,常用参数:

-o    指定输出文件名
-e    指定程序的入口符号

 

1.2.使用示例

(1)链接目标文件生成可执行文件。如给定 C++ 目标文件 test.o 与 main.o,生成可执行文件 test.out。

注意:这个过程中还需要链接很多系统库文件,因此写法非常复杂。这也是ld命令很少使用的原因。

ld /usr/lib64/crt1.o /usr/lib64/crti.o /usr/lib64/crtn.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib64 -L/usr/lib -lstdc++ -lm -lgcc_s -lc -lgcc  main.o test.o -o test.out

(2)因为生成一个C++可执行文件,需要依赖很多系统库和相关的目标文件,比如C语言库libc.a,所以使用ld进行链接时,需要注意添加较长的命令选项,不然会报链接错误

使用g++ -v命令可以查看生成可执行文所需的相关依赖。

g++ -v main.o test.o
...
usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib64/crt1.o /usr/lib64/crti.o /usr/lib64/crtn.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib64 -L/usr/lib -lstdc++ -lm -lgcc_s -lc -lgcc  main.o test.o

2.ld命令搜索路径顺序

2.1.搜索路径顺序

参考:Ubuntu之ld搜索路径顺序  Ubuntu之ld搜索路径顺序_土洋葱的博客-CSDN博客

注意:下面说的搜索顺序应该是对的,但是其他内容可能存在一些错误。比如LIBRARY_PATH和LD_LIBRARY_PATH就分别是静态库和动态库吗?另外库的默认搜索路径不止/lib /usr/lib /usr/local/lib这些。

静态库链接时搜索路径顺序

   1. ld会去找GCC命令中的参数-L

   2. 再找gcc的环境变量LIBRARY_PATH

   3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

动态链接时、执行时搜索路径顺序:

   1. 编译目标代码时指定的动态库搜索路径

                 

   2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径

   3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径

                 

   4. 默认的动态库搜索路径/lib

   5. 默认的动态库搜索路径/usr/lib  

有关环境变量

   LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径

   LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径

2.2.如何查看ld(链接器)的搜索顺序及编译时需要打开的库

参考:如何查看ld(连接器)的搜索顺序及编译时需要打开的库

https://blog.csdn.net/yygydjkthh/article/details/45419373

2.2.1.查看ld默认搜索路径

# 1. 把ld命令脚本的所有内容输入到ld_path文件中

ld --verbose | tee ~/ld_path.txt

# 2.仅仅过滤其中SEARCH有关的部分显示
ld --verbose | grep SEARCH

其中,ld --verbose | grep SEARCH显示结果如下,可以看到

不仅包括lib   /usr/lib   uar/local/lib等目录,

还有其他目录。

 


2.2.2.查看编译时需要打开的库

假设有一个文件dummy.cpp,内容如下:

#include <iostream>

int main()
{

}

使用

g++ dummy.cpp -Wl,--verbose | grep succeeded,

或者系统语言是中文的话,输入

g++ dummy.cpp -Wl,--verbose | grep

成功,查看编译过程中打开的库。结果如下:


————————————————
版权声明:本文为CSDN博主「Cc1924」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42731705/article/details/123934842

 linux动态库默认搜索路径设置的三种方法

https://www.cnblogs.com/matthew-2013/p/4669366.html

众所周知, Linux 动态库的默认搜索路径是 /lib 和 /usr/lib 。动态库被创建后,一般都复制到这两个目录中。

当程序执行时需要某动态库, 并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函 数,以及该动态库的其它资源了。

在 Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定。

方法一:

在配置文件 /etc/ld.so.conf 中指定动态库搜索路径。

每次编辑完该文件后,都必须运行命令 ldconfig 使修改后的配置生效 。我们通过例 1 来说明该方法。

例 1 :

我们通过以下命令用源程序 pos_conf.c (见程序 1 )来创建动态库 libpos.so ,

# gcc –fpic -shared -o libpos.so pos_conf.c

接着通过以下命令编译 main.c (见程序 2 )生成目标程序 pos 。

# gcc -o pos main.c -L. -lpos

方法二:

通过环境变量 LD_LIBRARY_PATH 指定动态库搜索路径。

方法三:

编译目标代码时指定该程序的动态库搜索路径。

还可以在编译目标代码时指定程序的动态库搜索路径。

-Wl, 表示后面的参数将传给 link 程序 ld (因为 gcc 可能会自动调用ld )。这里通过 gcc 的参数 "-Wl,-rpath," 指定(如例 3 所示)。

当指定多个动态库搜索路径时,路径之间用冒号 " : " 分隔。

例 3 :

我们通过以下命令用源程序 pos.c (见程序 4 )来创建动态库 libpos.so 。

# gcc -c pos.c
# gcc -shared -fic -o libpos.so pos.o
#

因为我们需要在编译目标代码时指定可执行文件的动态库搜索路径,所以需要用 gcc 命令重新编译源程序 main.c( 见程序 2) 来生成可执行文件 pos 。

# gcc -o pos main.c -L. -lpos -Wl,-rpath=.:..:lib

#

搜索动态库的先后顺序

编译目标代码时指定的动态库搜索路径

LD_LIBRARY_PATH
/etc/ld.so.cache
default path /lib, and then /usr/lib.

参考:

Linux之搜索路径PATH

https://blog.csdn.net/qq_43713303/article/details/121843596

linux下链接库文件默认搜索路径

https://blog.csdn.net/qq_34269988/article/details/103382912

静态库的搜索路径:

    优先级最高的就是直接在链接的时候添加路径

比如我们这里有一个静态库,叫“libtest.a”吧。你要通过gcc去链接的话就要写下面的指令:

gcc main.c -L. -ltest

就是说把main.c文件和libtest库链接起来,这里参数-Lpath,直接是连着一起写的,所以这里-L.就表示链接当前目录的xxx文件,当gcc看到-ltest的时候, 会自动去找去找libtest.a。

linux动态库默认搜索路径设置的三种方法

https://zhuanlan.zhihu.com/p/402426195


 

Logo

更多推荐