2009-11-19 103 views
6

我有一些.so库,我想合并成一个共享库,以便它不再依赖于原始的.so文件。如何组合共享库?

.so文件相互依赖。

我该怎么做?我可以这样做吗?

+0

这似乎是相关的:http://stackoverflow.com/questions/386579/pack-shared-libraries-into-the-elf – Inshallah 2009-11-19 11:40:07

+1

@Inshallah:Windows - 我必须支持 - 不支持ELF。 – 2009-11-19 13:23:52

回答

8

这里假设你的源代码给所有共享对象:

只要没有名字空间的冲突,它不会(其中如果两个并存,因为它是不应该有)将它们构建到一个共享对象中非常困难。

如果共享库本身依赖于来自其他库的代码,那么订单就会很重要。真正的工作就是获得makefile中的依赖关系。我从来没有在SO的成功链接中看到循环依赖关系,所以我怀疑你有他们开始。即foo()依赖于依赖于foo()的bar()。

我已经做了几次,虽然库本身是微不足道的。我从ustr(字符串处理程序),配置文件处理程序,一些其他自定义分析程序和其他实用程序函数中提取了一些部分,并创建了自定义混搭。

真正的痛苦带来了上游的改进,每一次你将它们合并在一起,但我不确定这对你是否有问题。

所以,如果您有:

libfoo.so: $(LIB_FOO_OBJECTS) $(LIB_BAR_OBJECTS) $(LIBFOOBAR_OBJECTS) 

其中:

LIB_FOO_OBJECTS = \ 
    $(libfoo)/foo.o \ 
    $(libfoo)/strings.o 

LIB_BAR_OBJECTS = \ 
    $(libbar)/bar.o 
.... 

...和顺序是正确的..休息是很容易的。请注意,我没有显示标题摘要,每个人都有不同的表现。虽然它们在进行混搭时很重要,因为您可能希望避免每次更改一个标头时重新编译整个库。

注意:如果所有这三个项目都使用自动工具..您的任务取决于指数更容易(或更难)。

如果你没有源代码

如果每个库的静态版本,您可以提取对象,并使用它们。 I .: .:

$ cp /usr/lib/foo.a ./foo.a 
$ ar x foo.a 
$ gcc -fPIC -shared *.o -o foo.so 

当然它比相关说明更多地涉及。

我从来没有尝试过,不知道如何处理那些有主要()的SO,当涉及到在这种情况下的链接。

+0

他想要的是“libstuff.so:libfoo.so libbar.so”,它不是?我认为问题是他没有目标文件。 – 2009-11-19 11:39:57

+0

@Jamie Soriano:最好的做法(在所有帐户中)是编译将单个共享对象变成一个大的共享对象的对象。如果你只是依靠其余的一个大型SO,那么你就没有做任何事情来解决依赖性问题,而这个问题首先让你做到了。 – 2009-11-19 12:53:11

+0

@Jaime Soriano:这就是我真正想要的。但我甚至不确定这是可能的。 – 2009-11-19 13:06:48