当前位置: 技术问答>linux和unix
问几个linux下关于动态库的问题
来源: 互联网 发布时间:2015-12-12
本文导语: 1、编译静态库和动态库的时候有什么不同? 2、同样的源程序只需要修改编译选项就可以编译成动态的或者静态的吗? 3、程序连接动态库的时候,linux系统在加载程序的时候是怎么查找动态库的? 4、为什么我的程序...
1、编译静态库和动态库的时候有什么不同?
2、同样的源程序只需要修改编译选项就可以编译成动态的或者静态的吗?
3、程序连接动态库的时候,linux系统在加载程序的时候是怎么查找动态库的?
4、为什么我的程序引入了动态库在gdb的时候break不能设到动态库中的函数上去?
2、同样的源程序只需要修改编译选项就可以编译成动态的或者静态的吗?
3、程序连接动态库的时候,linux系统在加载程序的时候是怎么查找动态库的?
4、为什么我的程序引入了动态库在gdb的时候break不能设到动态库中的函数上去?
|
1、编译静态库和动态库的时候有什么不同?
编译静态库:
gcc -c test.c
ar rcs libtest.a test.o
编译共享库:
gcc -shared -fPIC -o libtest.so test.c
2、同样的源程序只需要修改编译选项就可以编译成动态的或者静态的吗?
是的。
在默认情况下,Linux将首先搜索指定库的共享版本,如果找不到,才会去搜索静态版本。使用gcc -static -static参数告诉编译器,使用静态库。
3、程序连接动态库的时候,linux系统在加载程序的时候是怎么查找动态库的?
当启动该程序时,系统识别出该程序要依靠动态库。所以,系统调用加载器, /lib/ld-linux.so.X (X 是版本号),来载入所需库。可以用 ldd 来决定可执行文件所依赖的库。
$ ldd client
libprint.so.1 => ./libprint.so.1
libc.so.6 => /lib/libc.so.6
/lib/ld-linux.so.2=> /lib/ld-linux.so.2
这显示出文件 client 所依赖的库。然后加载器载入这些库,并调用相应的 _init() 部分。加载器首先在 LD_LIBRARY_PATH 环境变量所记录的路径中查找库,然后再 /etc/ld.so.conf 记录的标准路径中查找。再在/usr/lib中,然后在/lib中查找,如果找不到库,那么会报错。
编译静态库:
gcc -c test.c
ar rcs libtest.a test.o
编译共享库:
gcc -shared -fPIC -o libtest.so test.c
2、同样的源程序只需要修改编译选项就可以编译成动态的或者静态的吗?
是的。
在默认情况下,Linux将首先搜索指定库的共享版本,如果找不到,才会去搜索静态版本。使用gcc -static -static参数告诉编译器,使用静态库。
3、程序连接动态库的时候,linux系统在加载程序的时候是怎么查找动态库的?
当启动该程序时,系统识别出该程序要依靠动态库。所以,系统调用加载器, /lib/ld-linux.so.X (X 是版本号),来载入所需库。可以用 ldd 来决定可执行文件所依赖的库。
$ ldd client
libprint.so.1 => ./libprint.so.1
libc.so.6 => /lib/libc.so.6
/lib/ld-linux.so.2=> /lib/ld-linux.so.2
这显示出文件 client 所依赖的库。然后加载器载入这些库,并调用相应的 _init() 部分。加载器首先在 LD_LIBRARY_PATH 环境变量所记录的路径中查找库,然后再 /etc/ld.so.conf 记录的标准路径中查找。再在/usr/lib中,然后在/lib中查找,如果找不到库,那么会报错。