转自:http://blog.sina.com.cn/s/blog_690c46500100kxhd.html
pt1.c
#include <stdio.h>
void pt(){
}
pt2.c
#include <stdio.h>
void pt(){
}
pt3.c
#include <stdio.h>
void pt(){
}
pt4.c
#include <stdio.h>
void pt(){
}
pt5.c
#include <stdio.h>
void pt(){
}
gcc -fPIC -c pt1.c -o pt.o
gcc -shared pt.o -o libpt.so
mv libpt.so /tmp/st/1/
gcc -fPIC -c pt2.c -o pt.o
gcc -shared pt.o -o libpt.so
mv libpt.so /tmp/st/2/
gcc -fPIC -c pt3.c -o pt.o
gcc -shared pt.o -o libpt.so
mv libpt.so /tmp/st/3/
gcc -fPIC -c pt4.c -o pt.o
gcc -shared pt.o -o libpt.so
mv libpt.so /lib/
gcc -fPIC -c pt5.c -o pt.o
gcc -shared pt.o -o libpt.so
mv libpt.so /usr/lib/
m.c
#include <stdio.h>
int main(){
}
(a) 往/etc/ld.so.conf总增加一行,内容:/tmp/st/3,然后执行 ldconfig 命令
(b) export LD_LIBRARY_PATH=/tmp/st/2
另外3中路径,ld都可以得到,请接着看下面。
gcc m.c -o m1 -L/tmp/st/1 -lpt -Wl,-rpath,/tmp/st/1
./m1
start....
1
......end
这里在可执行文件中动态段中DT_RPATH所指定的路径,因此需要在编译m.c的时候就指定路径,由于其他路径都也告诉了ld,很明显,此种方法优先级最高了。
gcc m.c -o m -L/tmp/st/1 -lpt
./m
start....
2 path on the LD_LIBRARY_PATH
......end
这里很显然调用了LD_LIBRARY_PATH指定了路径中的共享库,因此此种情况优先级第二。
mv /tmp/st/2/libpt.so /tmp/st/2/libpt2.so
/m
start....
3 path on the /etc/ld.so.conf
......end
这里是调用了/etc/ld.so.cache中所缓存的动态库路径中的共享库,因此此种情况优先级第三。
mv /tmp/st/3/libpt.so /tmp/st/3/libpt3.so
./m
start....
4 path on the /lib
......end
这里是调用/lib中的共享库,优先级第四。
rm /lib/libpt.so
./m
start....
5 path on the /usr/lib
......end
这里是调用/lib中的共享库,优先级第五。
补充:
http://www.360doc.com/content/10/0123/14/79031_14221613.shtml
编译参数解析
最主要的是GCC命令行的一个选项:
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
l -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。