Linux dynamic link

参考文档

  1. http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
  2. http://man7.org/linux/man-pages/man8/ld.so.8.html
  3. The Linux Programming Interface chapter 41

原理

glibc

glibc提供了系统级的c语言库(也叫libc6),其他版本libc已基本被淘汰。现在Linux编译程序都依赖用glibc2编译,小版本号已经到了glibc2.23。

so文件的加载

glibc2编译的程序,如果要加载so文件,都是由/lib64/ld-linux-x86-64.so.2完成的。例如/bin/ls -l的运行,其实是执行了

/lib64/ld-linux-x86-64.so.2 /bin/ls -l

so文件加载顺序

  1. LD_LIBRARY_PATH
  2. /etc/ld.so.cache
  3. /lib,/usr/lib for 32bit OS
  4. /lib64,/usr/lib64 for 64bit OS

指定so加载目录

gcc -g -Wall -Wl,-rpath,/home/mtk/pdir -o prog prog.c libdemo.so
gcc -Wl,-rpath,'$ORIGIN'/lib ...

指定dynamic linker

g++ main.o -o myapp ... \
   -Wl,--rpath=/path/to/newglibc \
   -Wl,--dynamic-linker=/path/to/newglibc/ld-linux.so.2

可以通过这个命令看gcc的默认值

% gcc -dumpspecs
......
*link:
...%{m16|m32|mx32:;:-dynamic-linker %{muclibc:/lib/ld64-uClibc.so.0;:%{mbionic:/system/bin/linker64;:/lib64/ld-linux-x86-64.so.2}}}...
......

ld.so.cache

so文件被缓存在/etc/ld.so.cache里,用ldconfig -p可以打印出来

ldconfig和ld.so.conf

ldconfig会把/etc/ld.so.conf描述的so文件,放入/etc/ld.so.cache

so文件存放位置

  1. /usr/lib ,ubuntu或centos的库放在这里
  2. /lib,开机就需要的库放在这里
  3. /usr/local/lib, 用户自己编译的代码

相关环境变量

LD_LIBRARY_PATH=xxx command #指定so文件目录
LD_PRELOAD=xx.so command       #指定提前加载的so,这些会override默认的so文件

LD_DEBUG=help commond
LD_DEBUG=files commond      #显示verbose信息
LD_DEBUG=bindings commond   #显示符号绑定
LD_DEBUG=libs commond       #显示search path
LD_DEBUG=versions command   #显示版本依赖
LD_DEBUG=all commond

加载时候是动态link

编译动态链接库时候,需要制定-fPIC参数

  • PIC : position-independent code

安装so文件

  1. copy so file to /usr/lib
  2. 根据soname建立符号链接
  3. run ldconfig

目录

  1. /lib 系统启动的时候依赖的库,/lib被mount比较早
  2. /usr/lib 一般都安装在这里
  3. /usr/local/lib,非标准的,或者用户自己编译的体验版
  4. /etc/ld.so.conf描述的目录

Tools

ldd

ldd会至少2个so

  1. ld-linux.so.2 : the dynamic linker
  2. libc.so.6 : the standard C library
ldd /bin/ls

nm

搜索哪个lib有crypt函数定义

# nm -A /usr/lib/lib*.so 2> /dev/null | grep ' crypt$'
/usr/lib/libcrypt.so:00007080 W crypt

ldconfig

  1. 搜索一个so,需要很久,ldconfig帮忙引入cache => /etc/ld.so.cache
  2. 更新so库时候,需要运行ldconfig
ldconfig -p #display the cache
ldconfig -v #修改so后,会显示变化

so的版本管理

引入soname概念

  1. libdemo.so.1.0.1
  2. libdemo.so.1.0.2 主版本没变化,小版本有变化,和以前兼容
  3. libdemo.so.2.0.0 主版本变化,因此和以前不兼容

soname一般设置成libname.so.major-id,如

  1. libdemo.so.1 -> libdemo.so.1.0.2
  2. libdemo.so.2 -> libdemo.so.2.0.0
  3. libreadline.so.5 -> libreadline.so.5.0

so文件的兼容性

Application Binary Interface (ABI)

查看glibc版本

/lib64/libc.so.6
ldd --version
strings /lib64/libc.so.6 |grep GLIBC_

https://benohead.com/linux-check-glibc-version/

安装多版本glibc

使用patchelf
https://stackoverflow.com/questions/847179/multiple-glibc-libraries-on-a-single-host/851229#851229

替换新库

例如替换glibc,先编译好glibc

rm /lib64/libc.so.6
ln -s /lib64/libc-2.17.so /lib64/libc.so.6
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 226,913评论 6 527
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 97,710评论 3 412
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 174,561评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,278评论 1 306
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,080评论 6 405
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,604评论 1 320
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,698评论 3 434
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,847评论 0 285
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,361评论 1 329
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,330评论 3 353
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,487评论 1 365
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,044评论 5 355
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,738评论 3 342
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,134评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,378评论 1 281
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,053评论 3 385
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,471评论 2 370

推荐阅读更多精彩内容