如何查看和修改gcc/g++默认library路径 ldconfig工具介绍 常用库工具介绍
- 2015-06-22 11:48:00
- admin
- 原创 13031
一、查看默认library路径
gcc --print-search-dir
g++ --print-search-dir
lib目录:内核级/lib、系统级/usr/lib、用户级/usr/local/lib,/lib优先级高于/usr/lib,usr全称unix system resource。
libs = '/usr/lib/gcc/x86_64-redhat-linux/4.4.7/:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../x86_64-redhat-linux/lib/x86_64-redhat-linux/4.4.7/:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../x86_64-redhat-linux/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../x86_64-redhat-linux/4.4.7/:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/:/lib/x86_64-redhat-linux/4.4.7/:/lib/../lib64/:/usr/lib/x86_64-redhat-linux/4.4.7/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../x86_64-redhat-linux/lib/:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../:/lib/:/usr/lib/'
print len(libs.split(':'))
for i in libs.split(':'):
print i
默认一共有14个library库路径:
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../x86_64-redhat-linux/lib/x86_64-redhat-linux/4.4.7/
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../x86_64-redhat-linux/lib/../lib64/
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../x86_64-redhat-linux/4.4.7/
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/
/lib/x86_64-redhat-linux/4.4.7/
/lib/../lib64/
/usr/lib/x86_64-redhat-linux/4.4.7/
/usr/lib/../lib64/
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../x86_64-redhat-linux/lib/
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../
/lib/
/usr/lib/
二、修改默认library路径
1、命令行增加路径时前面的目录优先级高于后面的目录;
2、用户添加的路径优先级高于系统默认的路径;
命令行添加:
gcc -L/home -L/tmp main.c
g++ -L/home -L/tmp main.cpp
修改环境变量:
LIBRARY_PATH=/home:/tmp:$LIBRARY_PATH
export LIBRARY_PATH
/home/x86_64-redhat-linux/4.4.7/
/home/../lib64/
/tmp/x86_64-redhat-linux/4.4.7/
/tmp/../lib64/
./x86_64-redhat-linux/4.4.7/
./../lib64/
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../x86_64-redhat-linux/lib/x86_64-redhat-linux/4.4.7/
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../x86_64-redhat-linux/lib/../lib64/
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../x86_64-redhat-linux/4.4.7/
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/
/lib/x86_64-redhat-linux/4.4.7/
/lib/../lib64/
/usr/lib/x86_64-redhat-linux/4.4.7/
/usr/lib/../lib64/
/home/
/tmp/
./
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../x86_64-redhat-linux/lib/
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../
/lib/
/usr/lib/
三、静态库动态库生成
1、生成静态库只是将多个文件打包成一个文件,没有进行链接过程,没有进行类函数去重;
2、生成动态库进行链接过程,进行类函数去重,PIC表示生成位置无关代码;
3、gcc优先使用动态库编译代码,除非指定-static参数编译代码,或者-l:filename方式指定库文件;
4、gcc使用动态库编译代码,动态库和可执行文件相同函数不会去重,执行时优先选择可执行文件函数;
5、程序运行使用LD_LIBRARY_PATH环境变量查找动态库,示例设置export LD_LIBRARY_PATH="."
6、头文件或者实现文件函数只要版本不一致就会出问题;
生成静态库:
g++ -c lib.cpp
ar cr libtest.a lib.o,创建静态库,c表示创建,r表示添加或替换
ar t libtest.a,显示归档信息
objdump -a libtest.a,显示归档信息
使用静态库:
g++ -L. main.cpp -ltest
生成动态库:
g++ -c -fPIC lib.cpp
g++ -shared -fPIC -o libtest.so lib.o
使用动态库:
g++ -L. main.cpp -ltest
四、ldconfig工具介绍
程序执行时会去ld.so.cache文件查找动态库的信息,ldconfig利用ld.so.conf生成该文件:
1、ldconfig生成ld.so.cache文件;
2、ldconfig -p打印所有动态库的信息;
增加新目录扫描动态库:
1、编辑/etc/ld.so.conf文件,增加新目录;
2、执行ldconfig命令,生成新的ld.so.cache文件;
重新扫描/lib和/usr/lib目录,ldconfig默认搜索这两个目录:
cp libmyfunc.so /lib
ldconfig
五、常用库工具介绍
execstack设置堆栈执行标志:
1、execstack -c file,禁止程序代码在堆栈执行,不会触发堆栈安全问题;
2、execstack -s file,允许程序代码在堆栈执行,容易产生堆栈安全问题;
libtool是一个跨平台的库创建工具,libtool使用的文件类型说明:
1、lo文件是使用libtool编译出的目标文件描述信息;
2、la文件是使用libtool编译出的库文件描述信息;