linux指定动态运行库的位置
动态运行库在windows、linux下均广泛使用。windows下通常为dll文件,linux下为so文件。不过,对于部署程序,这两个系统查找依赖的运行库文件时却不一样。对于windows而言,优先查找当前目录下,然后再到系统库文件C:\windows\system32(记不太清楚,好像是这个位置)下查找。这个特性极大的方便了程序的部署,程序员只需要把相关的dll打包就OK,这也让很多程序可以制作成绿色版。而在linux下,默认只到/lib、/usr/lib和/usr/local/lib查找,找不到程序将无法启动。
对于windows的方式,好处显而易见,就是方便部署。缺点也有,安全性不高。想想有那么多dll是通用的,我随便写个同名的扔到程序当前目录下,不就把程序劫持了么。不过,这个缺点在日常应用中显得不是很重要。大部分人下软件安装时根本不会注意软件安装了什么文件,只要杀毒软件不报就OK。而相对于程序员而言,这种部署也极大的方便了调试。我不太方便去改/usr/lib里的东西。
要想linux下的程序在当前目录下查找动态运行库文件,如果是固定路径,则可以通过修改系统变量的方式,如LD_LIBRARY_PATH,LD_PRELOAD。而要实现程序copy到任何地方,都在当前目录下查找,则在编译程序时需要指定rpath。先编译一个动态运行库文件:
root@debian:/home/xzc/cpp/libtest# cat say.cpp
#include <iostream>
#include "say.h" void CSay::say_yes()
{
std::cout << "yes yes yes" << std::endl;
} root@debian:/home/xzc/cpp/libtest# cat say.h class CSay
{
public:
void say_yes();
}; root@debian:/home/xzc/cpp/libtest# g++ -fPIC -shared say.cpp -o libsay.so
然后再写一个程序:
root@debian:/home/xzc/cpp/libtest# cat main.cpp
#include <iostream> #include "say.h" int main()
{
CSay s;
s.say_yes();
} root@debian:/home/xzc/cpp/libtest# g++ main.cpp -lsay -L . -o main.o
root@debian:/home/xzc/cpp/libtest# ./main.o
./main.o: error while loading shared libraries: libsay.so: cannot open shared object file: No such file or directory
可见这个程序没有找到当前路径下的libsay.so文件。下面我们在编译时指定rpath:
root@debian:/home/xzc/cpp/libtest# g++ main.cpp -lsay -L . -Wl,--rpath=. -o main.o
root@debian:/home/xzc/cpp/libtest# ./main.o
yes yes yes
root@debian:/home/xzc/cpp/libtest# readelf -d main.o Dynamic section at offset 0x860 contains entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libsay.so]
0x00000001 (NEEDED) Shared library: [libstdc++.so.]
0x00000001 (NEEDED) Shared library: [libm.so.]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.]
0x00000001 (NEEDED) Shared library: [libc.so.]
0x0000000f (RPATH) Library rpath: [.]
0x0000000c (INIT) 0x8048508
0x0000000d (FINI) 0x804878c
0x00000004 (HASH) 0x804818c
0x6ffffef5 (GNU_HASH) 0x80481dc
0x00000005 (STRTAB) 0x8048310
0x00000006 (SYMTAB) 0x8048220
0x0000000a (STRSZ) (bytes)
0x0000000b (SYMENT) (bytes)
0x00000015 (DEBUG) 0x0
0x00000003 (PLTGOT) 0x804995c
0x00000002 (PLTRELSZ) (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0x80484d0
0x00000011 (REL) 0x80484c8
0x00000012 (RELSZ) (bytes)
0x00000013 (RELENT) (bytes)
0x6ffffffe (VERNEED) 0x8048468
0x6fffffff (VERNEEDNUM)
0x6ffffff0 (VERSYM) 0x8048448
0x00000000 (NULL) 0x0
可见程序已运行成功。readelf也可以看到其中的rpath为当前目录,如果没有指定,则在系统默认中找。现在,这个程序也可以随意copy到其他地方运行了,只要你连libsay.so一同拷贝。
linux指定动态运行库的位置的更多相关文章
- 【转载】Linux下动态共享库加载时的搜索路径详解
转载自:http://www.eefocus.com/article/09-04/71617s.html 对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while loading ...
- Linux下动态共享库加载及使用详解【转】
原文地址:http://blog.chinaunix.net/uid-29025972-id-3855500.html 对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while l ...
- Linux下动态共享库加载时的搜索路径详解
对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while loading shared libraries”这样的错误,这是典型的因为需要的动态库不在动态链接器ld.so的搜索路径 ...
- Linux下动态共享库加载及使用详解
转载;http://blog.chinaunix.net/uid-29025972-id-3855500.html 对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while loa ...
- <摘录>Linux下动态共享库加载时的搜索路径详解
对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while loading shared libraries”这样的错误,这是典型的因为需要的动态库不在动态链接器ld.so的搜索路径 ...
- linux addr2line 定位so库崩溃位置
在Linux下写C/C++程序的程序员,时常与Core Dump相见.在内存越界访问,收到不能处理的信号,除零等错误出现时,我们精心或不精心写就的程序就直接一命呜呼了,Core Dump是Linux仁 ...
- linux 缺少动态连接库.so--cannot open shared object file: No such file or directory
error while loading shared libraries的解決方法 执行行程式時,如此遇到像下列這種錯誤: ./tests: error while loading shared l ...
- Linux指定用户运行程序
参考:http://blog.useasp.net/archive/2015/07/29/run-command-as-different-user-on-linux.aspx 在实际中,我们有时候想 ...
- Linux缺少动态连接库.so--cannot open shared object file: No such file or directory
1 Liunx安装报错时,缺少动态链接库时,形式如下: /usr/local/libexec/gcc/x86_64-unknown-liunx-gnu/4.8.2/cc1: error while l ...
随机推荐
- zoj 3811 Untrusted Patrol(bfs或dfs)
Untrusted Patrol Time Limit: 3 Seconds Memory Limit: 65536 KB Edward is a rich man. He owns a l ...
- 设计模式--观察者(Observer)
GOF给出的定义: Define a one-to-many dependency between objects so that when one object changes state, all ...
- qt下面例子学习(部分功能)
from aa import Ui_Formfrom PyQt4.Qt import *from PyQt4.QtCore import *from PyQt4.QtGui import *from ...
- HTML5新增的一些属性和功能之一
大致可以分为10个方面: HTML5表单元素和属性 表单2.0 视音频处理 canvas绘图 SVG绘图 地理定位 拖放技术 web work web storage web socket 一.新的i ...
- 站点建设10个最好的响应的HTML5滑块插件
大多数的最佳响应的HTML5滑块插件能够使用移动应用程序,站点建设项目,以及Web开发项目提供一些令人兴奋的功能,如无限的动画效果,百分之中的一个百响应布局设计和很多其它. 1.别急!慢慢来 功能丰富 ...
- HDU 4907 Task schedule
对于询问q 假设q不存在直接输出q 否则输出后面第一个不存在的数 从2*10^5到1遍历一边ac #include<bits/stdc++.h> using namespace std; ...
- Android Action Bar 详解篇 .
作者原创,转载请标明出处:http://blog.csdn.net/yuxlong2010 作为Android 3.0之后引入的新的对象,ActionBar可以说是一个方便快捷的导航神器.它可以作为活 ...
- CSMA/CD协议
为了通信的简便,以太网采取了两种重要的措施: 第一:采用较为灵活的无连接的工作方式,即不必先建立连接就可以直接发送数据: 第二:以太网对发送的数据帧不进行编号,也不要求对方发回确认. 因此,以太网提供 ...
- Android Notification使用及取消
//发送通知 NotificationManager manger = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE ...
- Impala 源码分析-FE
By yhluo 2015年7月29日 Impala 3 Comments Impala 源代码目录结构 SQL 解析 Impala 的 SQL 解析与执行计划生成部分是由 impala-fronte ...