连接与加载的关系.
连接时指定了全路径的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 文件位置, 不带路径的可以移动位置.