- 浏览: 268449 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (263)
- mysql (5)
- boost (6)
- 工具 (10)
- IT生活 (7)
- 多线程 (3)
- Ruby (15)
- php (2)
- MongoDB (39)
- 移动互联网 (2)
- 测试 (8)
- c++ (28)
- 书 (1)
- 网站 (3)
- 网络编程 (14)
- 开源软件 (1)
- 分布式计算 (1)
- 得得得 (1)
- php,wordpress (1)
- error (5)
- 编译 (2)
- 学习 (1)
- 杀毒软件 (1)
- dd (0)
- linux (21)
- 数据库 (1)
- STL (1)
- c++/c (5)
- 软件设计 (1)
- 操作系统 (4)
- 库 (2)
- win32 (1)
- s (0)
- openssl (1)
- perl (2)
- debug (1)
- windows (4)
- python (12)
- windows 防火墙 (1)
- vs (1)
- vim (2)
- vc (1)
- 浏览器插件的危害 (1)
- curl (0)
- 判断手机号码合法性的库 (0)
- 地址备注 (0)
- 安装 File::Slurp (1)
- cenos (2)
- shell (1)
- linunx (1)
- internet (1)
- software (1)
- widows (1)
- linux io (1)
- nginx (2)
- 算法 (2)
- google (1)
- protobuf (2)
- tengine (1)
- tools (1)
- lua (2)
- liunx (1)
- vcard (1)
- lua-iconv (1)
- 网络 (2)
- teat (0)
- ldconfig linux (0)
- awk (0)
- grep (0)
- windws (2)
- linux 命令 (1)
- tcp dump (1)
- vmware (1)
- question2answer (2)
- mongdb (1)
- 正则 (1)
- OCR (2)
- Windows Server (1)
最新评论
原文地址:/etc/ld.so.confhttp://blog.sina.com.cn/s/blog_4cce4f6a0100ms6f.html文件作者:方人也
Linux 共享库
Linux 系统上有两类根本不同的 Linux 可执行程序。第一类是静态链接的可执行程序。静态可执行程序包含执行所需的所有函数 — 换句话说,它们是“完整的”。因为这一原因,静态可执行程序不依赖任何外部库就可以运行。
第二类是动态链接的可执行程序。
静态可执行程序与动态可执行程序比较
我们可以用 ldd 命令来确定某一特定可执行程序是否为静态链接的:
# ldd /sbin/sln
not a dynamic executable
“not a dynamic executable”是 ldd 说明 sln 是静态链接的一种方式。现在,让我们比较 sln 与其非静态同类 ln 的大小:
# ls -l /bin/ln /sbin/sln
-rwxr-xr-x 1 root root 23000 Jan 14 00:36 /bin/ln
-rwxr-xr-x 1 root root 381072 Jan 14 00:31 /sbin/sln
如您所见,sln 的大小超过 ln 十倍。ln 比 sln 小这么多是因为它是动态可执行程序。动态可执行程序是不完整的程序,它依靠外部共享库来提供运行所需的许多函数。
动态链接相关性
要查看 ln 依赖的所有共享库的列表,可以使用 ldd 命令:
# ldd /bin/ln
libc.so.6 => /lib/libc.so.6 (0x40021000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
如您所见,ln 依赖外部共享库 libc.so.6 和 ld-linux.so.2。通常,动态链接的程序比其静态链接的等价程序小得多。不过,静态链接的程序可以在某些低级维护任务中发挥作用。例如,sln 是修改位于 /lib 中的不同库符号链接的极佳工具。但通常您会发现几乎所有 Linux 系统上的可执行程序都是某种动态链接的变体。
动态装入器
那么,如果动态可执行程序不包含运行所需的所有函数,Linux 的哪部分负责将这些程序和所有必需的共享库一起装入,以使它们能正确执行呢?答案是动态装入器(dynamic loader),它实际上是您在 ln 的 ldd 清单中看到的作为共享库相关性列出的 ld-linux.so.2 库。动态装入器负责装入动态链接的可执行程序运行所需的共享库。现在,让我们迅速查看一下动态装入器如何在系统上找到适当的共享库。
ld.so.conf
动态装入器找到共享库要依靠两个文件 — /etc/ld.so.conf 和 /etc/ld.so.cache。如果您对 /etc/ld.so.conf 文件进行 cat 操作,您可能会看到一个与下面类似的清单:
$ cat /etc/ld.so.conf
/usr/X11R6/lib
/usr/lib/gcc-lib/i686-pc-linux-gnu/2.95.3
/usr/lib/mozilla
/usr/lib/qt-x11-2.3.1/lib
/usr/local/lib
ld.so.conf 文件包含一个所有目录(/lib 和 /usr/lib 除外,它们会自动包含在其中)的清单,动态装入器将在其中查找共享库。
ld.so.cache
但是在动态装入器能“看到”这一信息之前,必须将它转换到 ld.so.cache 文件中。可以通过运行 ldconfig 命令做到这一点:
# ldconfig
当 ldconfig 操作结束时,您会有一个最新的 /etc/ld.so.cache 文件,它反映您对 /etc/ld.so.conf 所做的更改。从这一刻起,动态装入器在寻找共享库时会查看您在 /etc/ld.so.conf 中指定的所有新目录。
ldconfig 技巧
要查看 ldconfig 可以“看到”的所有共享库,请输入:
# ldconfig -p | less
还有另一个方便的技巧可以用来配置共享库路径。有时候您希望告诉动态装入器在尝试任何 /etc/ld.so.conf 路径以前先尝试使用特定目录中的共享库。在您运行的较旧的应用程序不能与当前安装的库版本一起工作的情况下,这会比较方便。
LD_LIBRARY_PATH
要指示动态装入器首先检查某个目录,请将 LD_LIBRARY_PATH 变量设置成您希望搜索的目录。多个路径之间用冒号分隔;例如:
# export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"
导出 LD_LIBRARY_PATH 后,如有可能,所有从当前 shell 启动的可执行程序都将使用 /usr/lib/old 或 /opt/lib 中的库,如果仍不能满足一些共享库相关性要求,则转回到 /etc/ld.so.conf 中指定的库。
http://blog.csdn.net/liuying_1001/article/details/6611106%5c
从静态库.a 转成动态库 .so的方式如下:
.a 是有一系列 .o 文件通过 ar 程序打包在一起的静态库,要把它转成动态库只需先解开,生成一堆 .o 文件,再通过编译器(比如 gcc 或 ifort,视具体情况而定)编成动态库即可。
ar -x libtest.a
gcc -shared *.o -o libtest.so
不过需要注意的是:
(1) 并非所有 .a 都能转成 .so,前提是 .a 解出的 .o 文件中含有“位置独立代码”,如果不含的话则无法生成 .so。而“位置独立代码”要求在编译生成 .a 时指定 -fpic 或 -fPIC 选项才行。所以,如果只有一个 .a 文件而没有相应源文件且这个 .a 中不含“位置独立代码”,那么它无法转成 .so 文件。
(2) 我觉得生成 .so 时应该用与生成 .a 时一样的编译器,如果不一样不知道是否会造成问题。
花下眠工作室: http://huaxiamian.cc
Linux 共享库
Linux 系统上有两类根本不同的 Linux 可执行程序。第一类是静态链接的可执行程序。静态可执行程序包含执行所需的所有函数 — 换句话说,它们是“完整的”。因为这一原因,静态可执行程序不依赖任何外部库就可以运行。
第二类是动态链接的可执行程序。
静态可执行程序与动态可执行程序比较
我们可以用 ldd 命令来确定某一特定可执行程序是否为静态链接的:
# ldd /sbin/sln
not a dynamic executable
“not a dynamic executable”是 ldd 说明 sln 是静态链接的一种方式。现在,让我们比较 sln 与其非静态同类 ln 的大小:
# ls -l /bin/ln /sbin/sln
-rwxr-xr-x 1 root root 23000 Jan 14 00:36 /bin/ln
-rwxr-xr-x 1 root root 381072 Jan 14 00:31 /sbin/sln
如您所见,sln 的大小超过 ln 十倍。ln 比 sln 小这么多是因为它是动态可执行程序。动态可执行程序是不完整的程序,它依靠外部共享库来提供运行所需的许多函数。
动态链接相关性
要查看 ln 依赖的所有共享库的列表,可以使用 ldd 命令:
# ldd /bin/ln
libc.so.6 => /lib/libc.so.6 (0x40021000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
如您所见,ln 依赖外部共享库 libc.so.6 和 ld-linux.so.2。通常,动态链接的程序比其静态链接的等价程序小得多。不过,静态链接的程序可以在某些低级维护任务中发挥作用。例如,sln 是修改位于 /lib 中的不同库符号链接的极佳工具。但通常您会发现几乎所有 Linux 系统上的可执行程序都是某种动态链接的变体。
动态装入器
那么,如果动态可执行程序不包含运行所需的所有函数,Linux 的哪部分负责将这些程序和所有必需的共享库一起装入,以使它们能正确执行呢?答案是动态装入器(dynamic loader),它实际上是您在 ln 的 ldd 清单中看到的作为共享库相关性列出的 ld-linux.so.2 库。动态装入器负责装入动态链接的可执行程序运行所需的共享库。现在,让我们迅速查看一下动态装入器如何在系统上找到适当的共享库。
ld.so.conf
动态装入器找到共享库要依靠两个文件 — /etc/ld.so.conf 和 /etc/ld.so.cache。如果您对 /etc/ld.so.conf 文件进行 cat 操作,您可能会看到一个与下面类似的清单:
$ cat /etc/ld.so.conf
/usr/X11R6/lib
/usr/lib/gcc-lib/i686-pc-linux-gnu/2.95.3
/usr/lib/mozilla
/usr/lib/qt-x11-2.3.1/lib
/usr/local/lib
ld.so.conf 文件包含一个所有目录(/lib 和 /usr/lib 除外,它们会自动包含在其中)的清单,动态装入器将在其中查找共享库。
ld.so.cache
但是在动态装入器能“看到”这一信息之前,必须将它转换到 ld.so.cache 文件中。可以通过运行 ldconfig 命令做到这一点:
# ldconfig
当 ldconfig 操作结束时,您会有一个最新的 /etc/ld.so.cache 文件,它反映您对 /etc/ld.so.conf 所做的更改。从这一刻起,动态装入器在寻找共享库时会查看您在 /etc/ld.so.conf 中指定的所有新目录。
ldconfig 技巧
要查看 ldconfig 可以“看到”的所有共享库,请输入:
# ldconfig -p | less
还有另一个方便的技巧可以用来配置共享库路径。有时候您希望告诉动态装入器在尝试任何 /etc/ld.so.conf 路径以前先尝试使用特定目录中的共享库。在您运行的较旧的应用程序不能与当前安装的库版本一起工作的情况下,这会比较方便。
LD_LIBRARY_PATH
要指示动态装入器首先检查某个目录,请将 LD_LIBRARY_PATH 变量设置成您希望搜索的目录。多个路径之间用冒号分隔;例如:
# export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"
导出 LD_LIBRARY_PATH 后,如有可能,所有从当前 shell 启动的可执行程序都将使用 /usr/lib/old 或 /opt/lib 中的库,如果仍不能满足一些共享库相关性要求,则转回到 /etc/ld.so.conf 中指定的库。
http://blog.csdn.net/liuying_1001/article/details/6611106%5c
从静态库.a 转成动态库 .so的方式如下:
.a 是有一系列 .o 文件通过 ar 程序打包在一起的静态库,要把它转成动态库只需先解开,生成一堆 .o 文件,再通过编译器(比如 gcc 或 ifort,视具体情况而定)编成动态库即可。
ar -x libtest.a
gcc -shared *.o -o libtest.so
不过需要注意的是:
(1) 并非所有 .a 都能转成 .so,前提是 .a 解出的 .o 文件中含有“位置独立代码”,如果不含的话则无法生成 .so。而“位置独立代码”要求在编译生成 .a 时指定 -fpic 或 -fPIC 选项才行。所以,如果只有一个 .a 文件而没有相应源文件且这个 .a 中不含“位置独立代码”,那么它无法转成 .so 文件。
(2) 我觉得生成 .so 时应该用与生成 .a 时一样的编译器,如果不一样不知道是否会造成问题。
花下眠工作室: http://huaxiamian.cc
发表评论
-
Linux的IO性能监控工具iostat详解
2016-09-20 14:37 315$iostat -d -k 1 10 #查看TPS和吞吐量信息 ... -
CentOS 7.0,启用iptables防火墙
2016-09-13 21:55 411http://www.open-open.com/lib/vi ... -
Linux下查看系统版本号信息的方法
2016-06-14 15:24 383一、查看Linux内核版本命令(两种方法): 1、cat / ... -
linux 发布系统
2016-04-13 11:03 0/etc/webshell.cfg /etc/rsyncd.c ... -
bash
2016-01-14 11:29 0#/bin/bash for d in {20151001. ... -
当安装了libiconv环境下安装lua-iconv 会出现报错 /usr/local/lib/lua/5.1/iconv.so: undefined symb
2016-01-13 11:47 2017转自: http://bbs.iresty.com/topic ... -
ldconfig
2016-01-13 11:15 0sudo ldconfig ldconfig -p | gre ... -
libconv--unicode -> utf-8
2016-01-02 17:30 476http://savannah.gnu.org/project ... -
配置iptables
2016-06-02 15:18 368cd /etc/sysconfig 备份iptables文件: ... -
linux下的unicode utf
2015-12-22 19:22 0example: http://www.gnu.org/sof ... -
Putty远程登录VMware虚拟机Linux(Ubuntu)
2015-12-10 10:23 916http://www.linuxidc.com/Linux/2 ... -
解决vmware安装centos,网络不通的问题
2015-11-23 11:03 581在终端输入: nmcli dev status查看网卡状态 我 ... -
linux 抓包
2015-11-10 18:52 343tcpdump port 80 -x -s 0 -nn -i ... -
linux socket
2015-08-06 17:58 485epoll_create, epoll_ctl和epoll_w ... -
取消私钥密码
2015-07-20 19:11 620http://www.au92.com/archives/re ... -
liinux操作记录
2015-07-20 15:49 01. 远程连接ssh 私钥保存地址.ssh 2. 查看文件ls ... -
secureCRT 下载上传文件
2015-07-16 18:06 461sz用法: 下载一个文件 sz filename ... -
iptables
2015-07-13 16:17 505转自: http://www.cnblogs.com/jemb ... -
awk
2015-02-11 09:53 628http://coolshell.cn/articles/90 ... -
linux 命令
2015-01-14 10:49 455① 查看物理CPU的个数 #cat /proc/cpuinfo ...
相关推荐
GCC 编译动态和静态链接库 GCC 编译动态和静态链接库是 Linux 应用开发中的一个重要组件,对于嵌入式 Linux 应用开发来说尤为重要。本文将详细介绍如何在 Linux 中创建静态库和动态库,以及使用它们。 静态库 ...
### Linux 创建和使用动态链接库 .so 文件 在 Linux 系统中,动态链接库(Dynamic Link Library,简称 DLL)通常以 `.so` 文件的形式存在,即 Shared Object 文件。动态链接库可以被多个程序共享使用,有助于减少...
我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成与使用方式是不同的...
本资源提供的"libmupdf.so"是MuPDF的核心动态链接库,主要服务于Android平台,适用于开发者集成到自己的应用中,实现PDF文档的查看和处理功能。 在Android开发中,NDK(Native Development Kit)允许开发者使用C和...
在C++编程中,动态链接库(.so文件)是一种重要的技术,允许代码在运行时被加载和使用,而不是在编译时静态链接。这使得应用程序可以更灵活地使用库,便于更新和优化,同时也降低了内存占用。以下将详细介绍如何使用...
针对Android平台编译好的FFmpeg 3.4.5的动态链接库.so文件,包括armeabi-v7a arm64-v8a两个版本,包含头文件,包含x264,支持mediacodec硬解码h264,h265。可直接集成到工程中用于视频编辑、转码等。
本文将探讨如何在UNIX环境下,特别是Ubuntu系统中,使用GCC编译器创建和使用动态链接库。 首先,理解动态链接库(.so文件)的基本概念。在UNIX系统中,动态链接库是一种在程序运行时被加载到内存中的共享代码库。...
首先,我们来看如何编译生成动态链接库。以一个简单的示例为例,假设我们有头文件`so_test.h`和三个C源文件`test_a.c`、`test_b.c`、`test_c.c`。`so_test.h`包含了三个函数声明:`test_a()`、`test_b()`和`test_c()...
`ar`用于创建静态库,`gcc`的`-shared`选项用于生成动态库,`-Wl,-rpath=.`让链接器在当前目录查找动态库。 注意,`LDFLAGS`通常包含链接器的附加选项,如库搜索路径和链接器标志。`CFLAGS`则用于编译时的选项,...
在 Linux 中,可以使用 gcc 命令生成动态链接库。例如,要生成一个名为 libh.so 的动态链接库,需要先编译 h.c 文件生成目标文件 h.o,然后使用 gcc 命令将 h.o 文件链接到 libh.so 中。 gcc -c h.c -o h.o gcc -...
3. 在使用动态库的程序中,除了指定库路径(`-L`)和库名(`-l`),还需要确保运行环境能找到动态库,通常通过设置`LD_LIBRARY_PATH`环境变量或安装到系统默认的动态链接库路径。 4. 运行程序,如`./main`,如果...
在嵌入式开发领域,了解如何使用gcc工具链来构建和管理静态库(`.a`文件)与动态库(`.so`文件)是非常重要的。本文将详细介绍如何通过gcc创建这两种类型的库,并讨论它们各自的用途、优缺点以及在实际项目中的应用...
对于C/C++编程,我们还需要生成动态链接库`.so`文件。在上面的构建过程中,`make`命令已经生成了`.so`文件,它们位于`build/lib`目录下。例如,`libopencv_java455.so`就是Java使用的OpenCV动态链接库。在C/C++程序...
在Linux环境下编译.so库文件是一项关键技能,尤其对于软件开发者而言。本文将深入解析Linux下编译.so库文件的过程,以及与之相关的静态库和动态库的基本概念,旨在为读者提供一个全面的理解。 ### 一、理解库文件...
### Linux下Gcc生成和使用静态库和动态库详解 #### 一、基本概念 **1.1 什么是库** 库本质上是一种可执行代码的二进制形式,它可以被操作系统载入内存执行。无论是Windows还是Linux平台,都广泛地使用着库。然而...
标题"libssh2的ubuntu下编译so"指出,这是一个关于在Ubuntu 16.04操作系统环境下编译libssh2库的动态链接库(.so文件)的过程。libssh2是一个开源项目,提供SSH2协议的C语言实现,用于安全的远程连接和文件传输。它...
共享库又称为动态链接库,在程序运行时,库文件被映射到进程的地址空间并被动态链接。共享库的生成和使用过程如下: 2.1 生成目标文件(.o):与静态库不同,生成共享库的目标文件时必须添加编译选项“-fpic”,这样...
例如,使用 `c++` 编译器和 `gcc` 编译器来编译和链接生成动态链接库。 下面是一个简单的例子,用于生成一个 .so 文件并使用它: 首先,创建以下文件: * ConfigMap.cpp 和 ConfigMap.h(读取配置文件类) * ...
本示例涉及到的是使用C语言创建动态链接库,并在不同的操作系统环境下——Linux(生成`.so`文件)和Windows(生成`.dll`文件)——进行实现。之后,我们还将讨论如何通过Python语言调用这些C语言编写的接口。这一...