组成共享库的目标文件和一般的目标文件有所不同,在编译时要加-fPIC和-share选项,例如:

源码编译
695
linux
linux 举报
2022-02-16
动态编译

组成共享库的目标文件和一般的目标文件有所不同,在编译时要加-fPIC和-share选项,例如:

$gcc -fPIC -shared testa.c testb.c testc.c -o libtest.so  

 

-f后面跟一些编译选项,PIC是其中一种,表示生成位置无关代码(Position Independent Code)。

-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

最后编译demo时链接动态库,和静态库链接一样:

$gcc main.c -L. -lstack -Istack -o main

如果运行main找不到*.so时候,使用ldd命令查看链接库。

动态库目录搜索优先级:

   我们知道一个程序要想在内存中运行,除了编译之外还要经过链接和装入这两个步骤。当然linux中动态链接也是经过这三个过程。Linux 使用这个ld-linux.so*中的来装载(其实这只是一个链接)其他库。所以这个库必须放在linux中/lib下。对于其他,通常我们共享库放在/lib这个路径下,而且也是系统默认的搜索路径。Linux共享库的搜索路径先后顺序:1、编译目标代码时指定的动态库搜索路径:在编译的时候指定-Wl,-rpath=路径2、环境变量LD_LIBRARY_PATH指定的动态库搜索路径3、配置文件/etc/ld.so.conf中指定的动态库搜索路径4、默认的动态库搜索路径/lib5、默认的动态库搜索路径 /usr/lib

临时设置2的命令是:export LD_LIBRARY_PATH=. 


倒序看帖 只看楼主
热点关注
/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
服务停止、启动、重启一体化脚本,万能语言启动脚本
shell参数判断
在后台用进程名运行bash脚本
shell脚本每行后面多了一个^M的原因和解决办法
定时检测服务,检测down掉后重启。系统检测到DMSERVER运行正常
挂载磁盘的时候遇到一个问题,挂载完磁盘之后重启服务器挂载的盘丢失了.
中标麒麟系统Your trial is EXPIRED and no VALID licens
termux 开启ssh并用用户名和密码登陆
组成共享库的目标文件和一般的目标文件有所不同,在编译时要加-fPIC和-share选项,例如:
gcc指定链接库路径后还是找不到库文件
./configure -build,-host,-target设置
shell脚本每行后面多了一个^M的原因和解决办法
shell 中 if [ “x${var}“ == “x“ ] 中 x的作用
查看linux机器是32位还是64位的方法