基础知识:LINUX下动态库加载相关知识

在LINUX 系统/etc 目录下有三个与动态库加载相关的文件,分别是ld.so.conf、ld.so.conf.d、ld.so.cache.

其中ld.so.conf中记录了程序在运行过程中需要加载的动态链接库(后缀名为.so的文件)的路径,默认情况下/lib路径和/usr/lib路径下的动态链接库会直接被包含到系统的搜索路径中,也就是说只要把动态库放到这两个目录中的任何一个,应用程序就可以直接调用,但是如果所有的动态库都放到这两个路径中,就会看起来很乱,而且后期升级动态库的时候也很难查找,因此需要将我们自己的动态库路径告诉系统,最简单的方法就是修改ld.so.conf文件,假如我的动态库文件放在/usr/local/lib路径下,只要我们在ld.so.conf的末尾加上一句/usr/local/lib即可,系统就会在运行应用程序时自动搜索该路径下有没有需要的库文件。

ld.so.cache是ld.so.conf的缓存文件,我们在修改完ld.so.conf文件后,要执行一下/sbin/ldconfig指令,该指令的需要在root用户下执行,作用是重新加载ld.so.conf的内容到ld.so.cache文件中供系统使用,如果不执行该命令,则新添加的动态路路径不会生效。

ld.so.conf.d 是一个文件夹,该文件夹里面是各种动态库路径的配置文件,这些文件里记载了动态库的搜索路径。我们打开ld.so.conf文件后可以看到里面只有一句内容:include /etc/ld.so.conf.d/*.conf  意思就是使用ld.so.conf.d文件夹下的所有配置文件中记录的路径作为动态库搜索路径。

使用ldconfig -p 可以查看系统中所有的动态链接库,如果要查看某个应用程序依赖于那个动态库,可以使用ldd指令,例如我们想要查看/home/hello 依赖于那个动态库可以输入 ldd /home/hello 进行查看。

添加动态库搜索路径除了修改ld.so.conf文件外还有以下方法,其加载优先级如下:LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib

使用LD_PRELOAD环境变量设置加载路径的优先级更高,应用程序在检索依赖的动态库时会优先使用LD_PRELOAD环境变量中设置的检索路径下的动态库文件。其次是环境变量LD_LIBRARY_PATH ,再其次是修改/etc/ld.so.conf,然后是/lib,最后是/usr/lib,利用这种优先级关系,可以在替换动态库文件时,使用高优先级配置方法进行设置,这样应用程序就会优先加载自己替换的动态库文件。使用方法如下: LD_PRELOAD=/usr/local/hello.so

现在我们来介绍下C库:

C库顾名思义就是运行C语言需要依赖的库文件,没有这个库文件,C语言就运行不起来。常用的C库有ANSI C库和GUN C 库两种,其中ANSI C 库使用C标准化组织定义的,特点是不依赖平台,在LINUX 下可以使用,在WINDOWS下也可以使用,GUNC 库是专门用于LINUX系统下的C运行库。

一般我们在编写应用程序时尽量使用ANSI C 库,否则一旦需要将应用程序进行跨平台移植,就会有很多麻烦。

以下时ANSI C 库包含的相关头文件:

<ctype.h>:包含用来测试某个特征字符的函数的函数原型,以及用来转换大小写字母的函数原型;
<errno.h>:定义用来报告错误条件的宏;
<float.h>:包含系统的浮点数大小限制;
<math.h>:包含数学库函数的函数原型;
<stddef.h>:包含执行某些计算 C 所用的常见的函数定义;
<stdio.h>:包含标准输入输出库函数的函数原型,以及他们所用的信息;
<stdlib.h>:包含数字转换到文本,以及文本转换到数字的函数原型,还有内存分配、随机数字以及其他实用函数的函数原型;
<string.h>:包含字符串处理函数的函数原型;
<time.h>:包含时间和日期操作的函数原型和类型;
<stdarg.h>:包含函数原型和宏,用于处理未知数值和类型的函数的参数列表;
<signal.h>:包含函数原型和宏,用于处理程序执行期间可能出现的各种条件;
<setjmp.h>:包含可以绕过一般函数调用并返回序列的函数的原型,即非局部跳转;
<locale.h>:包含函数原型和其他信息,使程序可以针对所运行的地区进行修改。
地区的表示方法可以使计算机系统处理不同的数据表达约定,如全世界的日期、时间、美元数和大数字;
<assert.h>:包含宏和信息,用于进行诊断,帮助程序调试。

在Linux平台上最广泛使用的C函数库是glibc,其中包括C标准库的实现,也包括本书第三部分介绍的所有系统函数。几乎所有C程序都要调用glibc的库函数,所以glibc是Linux平台C程序运行的基础。glibc提供一组头文件和一组库文件,最基本、最常用的C标准库函数和系统函数在libc.so库文件中,几乎所有C程序的运行都依赖于libc.so,有些做数学计算的C程序依赖于libm.so,以后我们还会看到多线程的C程序依赖于libpthread.so。以后我说libc时专指libc.so这个库文件,而说glibc时指的是glibc提供的所有库文件。

glibc 库作为LINUX系统最底层的库,几乎所有的C应用程序的运行都依赖这个库文件,我们在编译运行C应用程序时就不可避免的牵扯到版本的问题,比如当执行某一应用程序时,系统提示glibc版本过低,这时候就需要升级glibc库。

1. 下载解压

glibc库下载地址:https://ftp.gnu.org/gnu/glibc/

2. 执行configure 生成Makefile (注意执行configure的路径不能在glibc路径下,可以到其他路径下使用绝对路径命令执行)

/home/configure \

CC=arm-none-linux-gnueabi-gcc \

CXX=arm-none-linux-gnueabi-g++ \

--prefix=/home/glibc \

--target=arm-linux --host=arm-linux

3. make && make install

4. 修改环境变量,更新glibc 库搜索路径

//添加环境变量

vim /etc/profile

//在文件里加入这一行,保存退出

export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/home/glibc-2.17/lib

//使之生效 source /etc/profile

C语言标准库glibc相关推荐

  1. Linux中C语言标准库glibc源码下载

    在这篇文章理清gcc.libc.glibc.libc++.libstdc++的关系,我们大概理解了libc,glibc之间的一些关系. 下面我们就开了解一些Linux中C语言标准库glibc源码. 在 ...

  2. c运行库之 c语言标准库、glibc、 gcc库

    C语言标准库 即ANSI C ,非常轻量,仅包含,数学函数,字符/字符串处理,io 等基本方面,处理目前的版本是c99 glibc库 即GNU c library,也是目前linux 平台的c 标准库 ...

  3. C/C++——C语言标准、C语言标准库、 C标准库实现glibc, uClibc, Elibc

    C语言标准 C语言作为一种常用的计算机开发语言,被用于各种领域,尤其是单片机与嵌入式的开发,在现阶段更有着无可替代的作用,我也经常会使用C语言进行各种开发,使用过程中我们经常会听说 GUN C .AN ...

  4. 【C语言】标准库(头文件、静态库、动态库),windows与Linux平台下的常用C语言标准库

    一.Introduction 1.1 C语言标准库 1.2 历代C语言标准 1.3 主流C语言编译器 二.C语言标准库 2.1 常用标准头文件 2.2 常用标准静态库 三.windows平台 四.Li ...

  5. Linux C语言运行库 glibc

    C运行库 任何一个C 程序,它的背后都有一套庞大的代码来进行支撑,以使得该程序能够正常运行.这套代码至少包括入口函数,及其所依赖的函数所构成的函数集合.另外包括各种标准库函数的实现.          ...

  6. c语言标准库低通的qsort函数不适宜所有排序任务的原因

    c语言标准库低通的qsort函数不适宜所有排序任务的原因: 第一:它只能用于内存中的数组排序,不能对链表中的数据排序: 第二:因为它是参数化的函数,所以能对各种数据进行操作,也造成它的运行速度比针对单 ...

  7. C++语言标准库functional中的函数对象,绝对是装B神器~

    C++语言标准库<functional>中的函数对象,绝对是装B神器~用一下,感慨万千~~~ 基本上是C++ Primer上的,show一下代码: #include <iostrea ...

  8. Go 语言标准库中 atomic.Value

    在 Go 语言标准库中,sync/atomic包将底层硬件提供的原子操作封装成了 Go 的函数.但这些操作只支持几种基本数据类型,因此为了扩大原子操作的适用范围,Go 语言在 1.4 版本的时候向sy ...

  9. mysql c语言数字转字符串函数_C++_c语言标准库中字符转换函数和数字转换函数,字符转换为数字: #includest - phpStudy...

    c语言标准库中字符转换函数和数字转换函数 字符转换为数字: #include atoi();将字符转换为整型   例:char ch1;int i=atoi(ch1); atol();将字符转化为长整 ...

最新文章

  1. android离线宝,Android 离线安装宝典
  2. matlab 高分屏 变小,解决Ubuntu高分屏下matlab标题栏(菜单栏)字体过小问题
  3. jdbc获取一行字符串_JDBC基础
  4. C/C++ 交换两个数,不使用第三个变量, 函数模板来实现
  5. centos 6.9 +nginx 配置GIT HTTPS服务器(证书采用自签名)
  6. Airflow 中文文档:设置配置选项
  7. Android 应用开发---ViewPager---4自主实现滑动指示条
  8. 检验密码强度的JS类(from thin's blog)
  9. Openstack Fuel 9.0安装后网卡设置
  10. Android Studio 使用 Gradle 打包 Jar
  11. arcgis栅格数据绘制等值线_ArcGIS Help 10.2 - 绘制等值线的工作原理
  12. 软件工程保研成功率_软件工程专业保研还是工作?
  13. 团队的Kick off
  14. directory opus使用教程
  15. over()分析函数
  16. 在IPCAM上实现RTSP协议直播-live555
  17. 用谷歌按钮登录_使用非常简单的设置即可登录Google的按钮
  18. 64位win7下安装SQL Server 2008(图文解说版)----本人备注
  19. 和月薪5W的华为程序员聊过后,才知道自己一直在打杂...
  20. Excel Macros 的使用

热门文章

  1. Java抽象类和接口的区别
  2. C语言实现逆波兰法计算表达式
  3. 在java 使什么居中的代码_java 居中的代码
  4. 自动弹窗被拦截 html,用JavaScript检查弹出窗口是否被阻拦的方法
  5. 笔记1 第13课 动规2 ——买卖股票最佳时机,打家劫舍,零钱找兑——极客时间算法
  6. WebBuilder开发笔记
  7. ReadWriteWeb《2008十大国际化产品》 国内的Maxthon傲游浏览器上榜
  8. “互联网+教育”三大发展趋势
  9. [node] node
  10. nin神经网络_深度学习基础(三)NIN_Network In Network