2012-03-21 67 views
0

如何強制我的應用程序的某個特定模塊使用舊版本的libc?如何將2個libc版本鏈接到同一個應用程序中?

我有兩個.so文件需要鏈接到我的應用程序中,但其中一個只適用於較舊版本的libc,一個只適用於較新版本。

我確實有源碼,但是到目前爲止追蹤錯誤的來源並不成功。我不是在彎腰搜尋,因爲這當然是正確的解決辦法。

作爲一種臨時措施,有沒有辦法強制鏈接器只使用較早的libc作爲應用程序的這一部分?

我很好,靜態鏈接的東西和/或設置符號鏈接。

更新/澄清:

我試圖做到這一點不改變代碼庫。我想找出一種方法來告訴鏈接器,對於這個非常具體的.so文件,應該使任何libc符號指向libc的舊版本。

即使/當我確實發現真正的bug時,這對它自己來說似乎是一個足夠有趣的挑戰。

這甚至可能嗎?

感謝

回答

1

從技術上講,你可以動態加載使用dlopen替代庫,然後從它的dlsym檢索符號的地址。這使您可以獲取函數的地址並調用其代碼而不是默認的代碼。例如參見linker documentation page

但是,根據受影響代碼的大小和最差情況,這可能至少很複雜,可能註定了標準C庫的低級別以及它可能暗含的衝突/不匹配。

瞭解什麼是你的代碼錯誤(或libc中)肯定會是一個更好的辦法

更新

沒有爲符號的單個命名空間等等,據我所知,目前還沒有根據代碼原點來說明如何解析符號的方法。你肯定需要用我建議的方法修改你的代碼。

或者,您可能會將代碼拆分爲兩個與其各自的libc鏈接的程序,並讓它們通過套接字,共享內存或任何其他方式進行通信,但這也意味着要重寫(並在此重新構建)您的代碼。

+0

有趣的鏈接,謝謝。顯然,找到錯誤的正確解決方案,但這不是問題的關鍵。 :)這可以在編譯器標誌級別完成嗎? (我會更新原文。) – nonot1 2012-03-22 15:26:53

相關問題