程序连接与加载的关系.

连接与加载的关系.
连接时指定了全路径的so会直接加载, 不带路径的so会搜索加载.
先看一个简单的例子.
Makefile 如下:

test: main.cpp
    g++ -c -o $@.o $<
#    g++ -o $@  $@.o /usr/lib64/libdebug.so
    g++ -o $@  $@.o -L/usr/lib64 -ldebug
clean:
    rm test *.o

假定libdebug.so 在/usr/lib64 目录下, 标准写法是-L/usr/lib64 -ldebug
这样生成的test文件, 其头文件包含如下信息:
$ objdump -p test
... 忽略无关信息

动态节:
  NEEDED               libdebug.so
  NEEDED               libstdc++.so.6
  NEEDED               libm.so.6
  NEEDED               libgcc_s.so.1
  NEEDED               libc.so.6
  INIT                 0x0000000000400518
  FINI                 0x0000000000400704
  INIT_ARRAY           0x0000000000600dd8
  INIT_ARRAYSZ         0x0000000000000008
  FINI_ARRAY           0x0000000000600de0
  FINI_ARRAYSZ         0x0000000000000008

如果用 /usr/lib64/libdebug.so 来连接, 即直接包含上路径, 则用objdump 查看

动态节:
  NEEDED               /usr/lib64/libdebug.so
  NEEDED               libstdc++.so.6
  NEEDED               libm.so.6
  NEEDED               libgcc_s.so.1
  NEEDED               libc.so.6
  INIT                 0x0000000000400520
  FINI                 0x0000000000400704
  INIT_ARRAY           0x0000000000600dd8
  INIT_ARRAYSZ         0x0000000000000008
  FINI_ARRAY           0x0000000000600de0
  FINI_ARRAYSZ         0x0000000000000008
此时libdebug.so 是包含路径的.

差别体现在加载上. 包含了路径的so文件, 加载时直接到该路径下加载, 若文件不存在,则报错.
不包含路径的so文件, 加载时会搜索各加载路径, 可由ld.so.conf 来控制. 它会沿各路径搜索,
直到找到该so 文件. 所以带路径的不能移动so 文件位置, 不带路径的可以移动位置.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值