如何查看和修改gcc/g++默认library路径 ldconfig工具介绍 常用库工具介绍

2015-06-22 11:48:00
admin
原创 12475
摘要:如何查看和修改gcc/g++默认library路径 ldconfig工具介绍 常用库工具介绍

一、查看默认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文件,增加/root目录;

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编译出的库文件描述信息;

发表评论
评论通过审核之后才会显示。