当前位置: 技术问答>linux和unix
静态库可以动态链接进程序!!
来源: 互联网 发布时间:2016-03-27
本文导语: 我发现一个奇怪的问题.使用ldd查看程序所需链接的动态库时,有一些系统的静态库也被链了进来,不知道是如何做到的. 例如:ldd /usr/bin/dbx /usr/bin/dbx needs: /usr/lib/libc.a(shr.o) ...
我发现一个奇怪的问题.使用ldd查看程序所需链接的动态库时,有一些系统的静态库也被链了进来,不知道是如何做到的.
例如:ldd /usr/bin/dbx
/usr/bin/dbx needs:
/usr/lib/libc.a(shr.o)
/usr/lib/libdbx.a(shr.o)
/unix
/usr/lib/libcrypt.a(shr.o)
/usr/lib/libpthdebug.a(shr.o)
而/usr/lib/libc.a等都是使用ar打包的静态库.
用ar -tv /usr/lib/libc.a 可以看到里面的.o文件.
rw-r----- 300/300 1616 Nov 23 03:55 2005 frexp.o
rw-r----- 300/300 750 Jul 20 07:42 2005 itrunc.o
rw-r----- 300/300 1958 Nov 23 03:55 2005 ldexp.o
rw-r----- 300/300 1614 Nov 23 03:55 2005 modf.o
rw-r----- 300/300 925 Jul 20 06:04 2005 logb.o
rw-r----- 300/300 3230 Nov 23 03:49 2005 scalb.o
rw-r----- 300/300 463 Jul 20 06:04 2005 finite.o
rw-r----- 300/300 744 Jul 20 07:42 2005 uitrunc.o
rw-r----- 300/300 768 Jul 20 05:51 2005 _itrunc.o
rw-r----- 300/300 765 Jul 20 05:51 2005 _uitrunc.o
但是自己打包的.a静态库却不能动态链接入程序.
请高手帮忙解释一下.
例如:ldd /usr/bin/dbx
/usr/bin/dbx needs:
/usr/lib/libc.a(shr.o)
/usr/lib/libdbx.a(shr.o)
/unix
/usr/lib/libcrypt.a(shr.o)
/usr/lib/libpthdebug.a(shr.o)
而/usr/lib/libc.a等都是使用ar打包的静态库.
用ar -tv /usr/lib/libc.a 可以看到里面的.o文件.
rw-r----- 300/300 1616 Nov 23 03:55 2005 frexp.o
rw-r----- 300/300 750 Jul 20 07:42 2005 itrunc.o
rw-r----- 300/300 1958 Nov 23 03:55 2005 ldexp.o
rw-r----- 300/300 1614 Nov 23 03:55 2005 modf.o
rw-r----- 300/300 925 Jul 20 06:04 2005 logb.o
rw-r----- 300/300 3230 Nov 23 03:49 2005 scalb.o
rw-r----- 300/300 463 Jul 20 06:04 2005 finite.o
rw-r----- 300/300 744 Jul 20 07:42 2005 uitrunc.o
rw-r----- 300/300 768 Jul 20 05:51 2005 _itrunc.o
rw-r----- 300/300 765 Jul 20 05:51 2005 _uitrunc.o
但是自己打包的.a静态库却不能动态链接入程序.
请高手帮忙解释一下.
|
你用的是AIX?
AIX下有shared library和shared object两个概念,包含shared object的archive就是shared library,也是用ar生成。你能看到生成的依赖关系里:
/usr/bin/dbx needs:
/usr/lib/libc.a(shr.o)
libc.a就是一个shared library,而其中的shr.o就是shared object。dbx依赖于libc.a中的shr.o。
你自己打包是可以的,但其中的.o必须是按照shared object方式生成的,才能动态链接。
AIX下有shared library和shared object两个概念,包含shared object的archive就是shared library,也是用ar生成。你能看到生成的依赖关系里:
/usr/bin/dbx needs:
/usr/lib/libc.a(shr.o)
libc.a就是一个shared library,而其中的shr.o就是shared object。dbx依赖于libc.a中的shr.o。
你自己打包是可以的,但其中的.o必须是按照shared object方式生成的,才能动态链接。