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 可以看到所有的系统加载库
---------------
评论
发表评论