- -fPIC:表示编译为位置独立(地址无关)的代码,不用此选项的话,编译后的代码是位置相关的,所以动态载入时,是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
#### 环境变量 ####
# 查看程序静态链接库文件搜索路径
$ echo $LIBRARY_PATH
# 查看程序动态链接库文件搜索路径
$ echo $LD_LIBRARY_PATH
# 添加动态连接库的搜索路径
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/you_so_path/
#### 查看so相关 ####
# 查看so库符号表,注意C/C++的函数名称是不同的
$ nm -D xxx.so
# 例如
$ nm -D ./lib/gcc/x86_64-linux-gnu/9/libquadmath.so
0000000000003f80 T acoshq
0000000000004620 T acosq
0000000000005da0 T asinhq
0000000000006700 T asinq
0000000000006f50 T atan2q
00000000000073e0 T atanhq
00000000000077b0 T atanq
000000000000dc70 T cabsq
...
# 查看可执行程序链接动态库的情况
$ ldd <可执行程序>
# 例如
$ ldd ./lib/gcc/x86_64-linux-gnu/9/libquadmath.so
linux-vdso.so.1 (0x00007ffeb277d000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f66231e0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6622fee000)
/lib64/ld-linux-x86-64.so.2 (0x00007f662338e000)
#### 查看详情 ####
# 查看可执行程序详情
$ file <可执行程序>
# 查看so库详情
$ file <you_so_file>
# 例如
$ file ffmpeg
ffmpeg: ELF 64-bit LSB shared object, x86-64,
version 1 (SYSV), dynamically linked,
interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=dc453f393a417e09a78bf28f73b34f5514915c67,
for GNU/Linux 3.2.0,
stripped
# 例如
$ file libPrlDRI.so.1
libPrlDRI.so.1: ELF 64-bit LSB shared object, x86-64,
version 1 (SYSV), dynamically linked,
BuildID[sha1]=4446c029583e27ba19ebacd040700fc056a88c20,
stripped