专栏首页蓝天Linux下共享库(SO)有关的几个环境变量

Linux下共享库(SO)有关的几个环境变量

Linux支持共享库已经有悠久的历史了,不再是什么新概念了。大家都知道如何编译、连接以及动态加载(dlopen/dlsym/dlclose) 共享库。但是,可能很多人,甚至包括一些高手,对共享库相关的一些环境变量认识模糊。当然,不知道这些环境变量,也可以用共享库,但是,若知道它们,可能就会用得更好。下面介绍一些常用的环境变量,希望对家有所帮助:

LD_LIBRARY_PATH 这个环境变量是大家最为熟悉的,它告诉loader:在哪些目录中可以找到共享库。可以设置多个搜索目录,这些目录之间用冒号分隔开。在linux下,还提供了另外一种方式来完成同样的功能,你可以把这些目录加到/etc/ld.so.conf中,或则在/etc/ld.so.conf.d里创建一个文件,把目录加到这个文件里。当然,这是系统范围内全局有效的,而环境变量只对当前shell有效。按照惯例,除非你用上述方式指明,loader是不会在当前目录下去找共享库的,正如shell不会在当前目前找可执行文件一样。

LD_PRELOAD 这个环境变量对于程序员来说,也是特别有用的。它告诉loader:在解析函数地址时,优先使用LD_PRELOAD里指定的共享库中的函数。这为调试提供了方便,比如,对于C/C++程序来说,内存错误最难解决了。常见的做法就是重载malloc系列函数,但那样做要求重新编译程序,比较麻烦。使用LD_PRELOAD机制,就不用重新编译了,把包装函数库编译成共享库,并在LD_PRELOAD加入该共享库的名称,这些包装函数就会自动被调用了。在linux下,还提供了另外一种方式来完成同样的功能,你可以把要优先加载的共享库的文件名写在/etc/ld.so.preload里。当然,这是系统范围内全局有效的,而环境变量只对当前shell有效。

LD_ DEBUG 这个环境变量比较好玩,有时使用它,可以帮助你查找出一些共享库的疑难杂症(比如同名函数引起的问题)。同时,利用它,你也可以学到一些共享库加载过程的知识。它的参数如下:

libs display library search paths

reloc display relocation processing

files display progress for input file

symbols display symbol table processing

bindings display information about symbol binding

versions display version dependencies

all all previous options combined

statistics display relocation statistics

unused determined unused DSOs

help display this help message and exit

BIND_NOW 这个环境变量与dlopen中的flag的意义是一致,只是dlopen中的flag适用于显示加载的情况,而BIND_NOW/BIND_NOT适用于隐式加载。

LD_PROFILE/LD_PROFILE_OUTPUT:为指定的共享库产生profile数据,LD_PROFILE指定共享库的名称,LD_PROFILE_OUTPUT指定输出profile文件的位置,是一个目录,且必须存在,默认的目录为/var/tmp/或/var/profile。通过profile数据,你可以得到一些该共享库中函数的使用统计信息。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • awk给外部变量赋值

    假设将值存在文件t中,文件t内容如下,只有一行:a b c 需要将a、b和c分别赋给外部变量x、y和z,则脚本可写成如下: eval $(awk '{ pr...

    一见
  • limits.conf

    SuSE上的一些问题,可能需要另参考:http://blog.chinaunix.net/u2/64804/showart.php?id=2026903

    一见
  • 服务网格代理Envoy入门

    Envoy入门并不简单,可以说有些陡峭,本文尽可能帮助降低入门门槛。本文内容主要基于Envoy-1.12.2版本,官方链接:

    一见
  • 时空特征--Learning Spatiotemporal Features with 3D Convolutional Networks

    Learning Spatiotemporal Features with 3D Convolutional Networks ICCV 2015 h...

    用户1148525
  • 小白课代表的使用说明(必读)

    课代表
  • es6分享——变量的解构赋值

    变量的解构赋值:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。 以前的写法: var a = 1;...

    Java中文社群_老王
  • 你用的Google Analytics是哪个版本呢?

    部分在使用Google Analytics 的时候被各种版本搞混,不知道自己用的是什么版本,我将Google Analytics的版本变更可以用下面这张图表示:...

    GA小站
  • 使用URL直接进入SAP CRM WebClient UI某个订单的明细页面

    https://:44356/sap(bD1lbiZjPTAwMSZkPW1pbg==)/bc/bsp/sap/crm_ui_start/default.htm...

    Jerry Wang
  • 胶囊网络(Capsule Network)在文本分类的探索

    最近,Hinton老师等提出了胶囊网络, 用神经元向量代替传统神经网络的单个神经元节点,以dynamic routing的方式去训练这种全新的神经网络。

    腾讯知文实验室
  • awk给外部变量赋值

    假设将值存在文件t中,文件t内容如下,只有一行:a b c 需要将a、b和c分别赋给外部变量x、y和z,则脚本可写成如下: eval $(awk '{ pr...

    一见

扫码关注云+社区

领取腾讯云代金券