gcc装载具体库的的方法总结

注:该总结主要来自:bugfly z的buzz.感谢bugfly z,以及回帖的盆友,如果有不完善的地方,欢迎拍砖。

1.环境变量LD_PRELOAD

LD_PRELOAD 后面接的是具体的库文件全路径,可以接多个

参考:http://blog.csdn.net/haoel/archive/2007/05/09/1602108.aspx

2.是方案1的变体。直接把库名加到列表加到/etc/ld.so.preload. 该方法会影响到系统里所有应用。

程序加载时,LD_PRELOAD加载路径优先级高于/etc/ld.so.preload

3. 环境变量LD_LIBRARY_PATH

LD_LIBRARY_PATH指定查找路径,这个路径优先级别高于系统预设的路径

假如现在需要在已有的环境变量上添加新的路径名,则采用如下方式:

LD_LIBRARY_PATH=NEWDIRS:$LD_LIBRARY_PATH.(newdirs是新的路径串)

4. gcc 中的 -L 和 -l参数  -Wl参数

放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。

-Wl,表示后面的参数将传给link程序ld

5.LD程序硬编码了一些库搜索路径
查看方法:

00653000-0066e000 r-xp 00000000 08:07 1320479 /lib/ld-2.11.1.so

0066e000-0066f000 r--p 0001a000 08:07 1320479 /lib/ld-2.11.1.so

0066f000-00670000 rw-p 0001b000 08:07 1320479 /lib/ld-2.11.1.so

$ strings /lib/ld-2.11.1.so | grep lib

...

display library search paths

/lib/

/usr/lib/

/lib/i486-linux-gnu/

/usr/lib/i486-linux-gnu/

...

上面就是默认的装载路径, 直接在装载器里hardcode,

5.ldconfig也可以起到作用
ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc /ld.so.cache,此文件保存已排好序的动态链接库名字列表.

运行ldconfig -v 可以看到所有的系统加载库
---------------

评论

此博客中的热门博文

提交了30次才AC ---【附】POJ 2488解题报告

n个进程共享m个资源得死锁问题证明