2012-05-02 41 views
4

我下載了glibc源代碼,修改了標準庫的某些部分,然後使用LD_PRELOAD與我的程序一起使用修改過的標準庫(以.so文件的形式)。但是,當我將.so文件複製到另一臺計算機並嘗試使用LD_PRELOAD在那裏運行相同的程序時,出現了分段錯誤。通過glibc庫複製

請注意,兩臺計算機都有x86-64處理器。而且,這兩臺電腦都安裝了gcc 4.4。儘管未運行的計算機也安裝了除gcc 4.4之外的gcc 4.1.2。然而,其中一個運行的是Ubuntu 10.04(我編譯的地方),另一個運行的是CentOS 5.這是導致分段故障的原因嗎?我怎麼解決這個問題?請注意,我在CentOS 5的計算機上沒有管理權限。

+3

請注意,使用'LD_PRELOAD',您不必修改標準庫,就可以創建一個新庫來替換標準庫中的一些函數。這可能更容易。 –

+2

你可以在gdb中運行它來獲得回溯?在gdb提示符下使用'set environment LD_PRELOAD = blah'。 – Tobu

回答

2

當你LD_PRELOAD的C庫,我相信你加載它,除了默認的C庫。當它們是完全相同的版本時,所有符號都是匹配的,而您的優先順序是。所以它工作。當它們的版本不同時,您可能會在每個符號的基礎上進行混合。

而且,NSS(名稱服務交換機,例如來自/etc/nsswitch.conf的所有東西)API 不穩定。這些模塊與主libc.so分離,但在程序(例如,用戶ID到用戶名映射)時動態加載。加載錯誤的版本(因爲你拷貝了libc.so)會造成各種不好的結果。

此外,Ubuntu可能使用eglibc和CentOS glibc。所以你可以看看glibc的另一個分支。

如果LD_PRELOAD庫包括只有你確實需要覆蓋的符號,並將其推翻的最低金額可能的(例如,如果可能的話,重寫的功能),那麼你的圖書館有機會較高便攜式。

有關如何操作的示例,請參閱(例如)fakeroot。 (a)你做了一件非常奇怪的事情;但是,如果你正在改變很多libc,你唯一的選擇就是重寫所有的libc,那麼(a) (b)您可能要使用LD_LIBRARY_PATH,而不是LD_PRELOAD;詳情請參閱ld.so(8) manpage

1

很可能您的libc在內核版本之間不可移植。