赞
踩
目录
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 命令链接目标文件生成可执行文件
ld(Link eDitor)命令是二进制工具集 GNU Binutils 的一员,是 GNU 链接器,用于将目标文件与库链接为可执行文件或库文件。
ld 命令支持众多链接选项,但是大部分选项很少被使用,常用参数:
-o 指定输出文件名
-e 指定程序的入口符号
(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
参考: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环境变量:指定程序动态链接库文件搜索路径
参考:如何查看ld(连接器)的搜索顺序及编译时需要打开的库
https://blog.csdn.net/yygydjkthh/article/details/45419373
# 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等目录,
还有其他目录。
假设有一个文件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
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。