如何查看和修改gcc/g++默认library路径 ldconfig工具介绍 常用库工具介绍
- 2015-06-22 11:48:00
- admin
- 原创 13677
一、查看默认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
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/
/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/
./
/lib/
/usr/lib/
三、静态库动态库生成
1、生成静态库只是将多个文件打包成一个文件,没有链接过程,没有函数去重;
2、生成动态库进行链接过程,进行类函数去重,PIC表示生成位置无关代码;
3、gcc优先使用动态库编译代码,除非指定-static参数编译代码,或者-l:filename方式指定库文件;
4、gcc使用动态库编译代码,可执行文件和动态库相同函数不会去重,执行时优先选择可执行文件函数;
5、程序运行使用LD_LIBRARY_PATH环境变量查找动态库,示例设置export LD_LIBRARY_PATH="."
生成静态库:
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工具介绍
1、ldconfig用于生成动态库的soname,soname是动态库的软链接;
2、ldconfig会生成文件ld.so.cache,记录动态库的realname和soname;
3、ldconfig配置文件是ld.so.conf;
4、ldconfig -p打印所有动态库的信息;
5、示例:realname是libtest.so.1.1.1,soname则是libtest.so.1
6、程序链接时使用soname,程序执行时使用soname,这样便于升级动态库;
ldconfig新增扫描目录:
1、ldconfig默认扫描/lib和/usr/lib目录;
2、编辑/etc/ld.so.conf文件,增加目录;
3、执行ldconfig命令,生成新的ld.so.cache文件;
五、常用库工具介绍
execstack设置堆栈执行标志:
1、execstack -c file,禁止程序代码在堆栈执行,不会触发堆栈安全问题;
2、execstack -s file,允许程序代码在堆栈执行,容易产生堆栈安全问题;
libtool是一个跨平台的库创建工具,libtool使用的文件类型说明:
1、lo文件是使用libtool编译出的目标文件描述信息;
2、la文件是使用libtool编译出的库文件描述信息;