2011-10-26 57 views
2

我知道這是possible(使用GCC/g++ extensions to the C language)聲明函數與關鍵字_ 屬性 _屬性如下:
void __attribute__((weak)) foo(int j);編譯所有弱電一個目標文件的符號

是否有辦法告訴編譯器(g ++)將整個編譯單元編譯爲「弱」,這意味着鏈接時符號表中的所有全局符號將被視爲弱?

或者,有沒有辦法告訴連接器(LD)考慮所有的某些目標文件/庫的符號,如果他們是弱?

編輯:我會盡量解釋我的動機是:
我有2個靜態庫,libStatic1.alibStatic2.a。另外,我有很多用libStatic1.a編譯的SO(共享對象)。
到目前爲止,libStatic1.a和libStatic2.a是獨立的,一切都很好。但是現在我改變了libStatic1.a的代碼,以便它在libStatic2.a上取消。因此,任何在libStatic1.a上取消的SO現在都需要用libStatic2.a進行編譯。這對我來說是不可取的,因爲libStatic1.a的用戶現在有一個奇怪的約束:他們需要用libStatic2.a編譯他們的代碼,以便編譯/運行時成功/不會崩潰。這顯然造成了不必要的耦合,我想避免它。

因此,我需要以某種方式在libStatic1.a中「植」libStatic2.a的目標代碼。如果我只編譯libStatic1.a和libStatic2.a的所有對象文件(除了它自己的),它將基本包含它,但是這會產生另一個問題 - 如果libStatic1.a的一些用戶將決定使用libStatic2.a並會與它一起編譯,他會得到一個奇怪的「多重定義」錯誤。如果我能以某種方式告訴編譯器使用弱符號生成libStatic2.a的目標文件(僅適用於libStatic1.a),這將解決問題 - 沒有人會得到多個定義,也沒有任何許多SO的makefile使用libStatic1.a將需要更改。

+0

鏈接時是否遇到符號衝突? –

+0

@trojanfoe和馬克西姆Yegorushkin: **現在**我完成編輯我原來的消息來解釋我的動機。 – JohnnyW

回答

0

不,看起來沒有;是否有如此多的弱外部函數,以至於不能單獨設置它們的屬性?

1

如果您的圖書館很小,最簡單的方法仍然是通過手動添加__attribute__((weak))來更改聲明。

另一種可能性是要求g++溢出彙編代碼(用-S),並有它的一些(也許awked)腳本工作。

你也可以編寫一個GCC插件(假設你的g ++是一個4.6版本)或者一個GCC MELT的擴展。

+0

感謝您的回覆!我仍然不能投票,因爲我的代表... – JohnnyW

0

正常編譯,然後objcopy--weaken對象文件。

相關問題