2009-11-19 143 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