2012-06-03 40 views
1

說我通過創建一個共享對象並使用LD_PRELOAD首先加載它來替換一個函數。是否有可能具有與原始庫中的參數不同的參數?LD_PRELOAD函數可以用不同的參數嗎?

例如,如果我更換的pthread_mutex_lock,使得代替參數pthread_mutex_t花費pthread_my_mutex_t。可能嗎?

其次,除了函數,是否可以使用LD_PRELOAD來更改結構聲明?例如,可以將一個字段添加到結構中。

回答

3

雖然您可以安排提供修改後的pthread_mutex_lock()函數,但代碼已編譯爲調用標準函數。當傳遞給標準函數的參數調用替換時,這會導致問題。這是說的一種禮貌的方式:

  • 期待它和好如初

任何預加載功能必須實現相同的接口—相同的名稱,在相同的參數,相同的價值觀出—作爲功能它取代。內部可以根據需要以不同的方式實現,但接口必須相同。

與結構相似。現有的代碼被編譯爲預期結構的一個尺寸,具有一個特定的佈局。您可能會在最後添加一個額外的字段,但未替換的代碼可能無法正常工作。它將爲結構的原始大小分配空間,而不是增強結構等。它不會訪問額外的元素本身。這可能不是不可能的,但是你必須設計程序來處理動態變化的結構尺寸,這對你什麼時候可以做到足夠嚴格的限制,以至於「你不能」的答案可能是適合的簡單)。

IMNSHO,LD_PRELOAD機制是用於可怕的緊急情況(並且是對於給定問題的暫時的創可貼)。這不是一個你應該計劃使用任何遠遠類似於常規基礎的機制。

2

LD_PRELOAD做了一件事,只有一件事。它安排一個特定的DSO文件在ld.so用來查找符號的列表的前面。它與代碼如何使用函數或數據項無關。

您可以使用LD_PRELOAD執行任何操作,只需將替換庫鏈接到列表前面的-l即可進行模擬。另一方面,如果您無法用-l完成任務,則無法使用LD_PRELOAD完成該任務。

+0

所以你認爲我可以改變函數的參數或改變數據結構。 – pythonic

+0

如果您不改變所有呼叫者通過的功能,則無法有效更改功能預期的功能。所以不行。 – bmargulies

0

您所描述的效果在概念上與在正常鏈接時提供不匹配的外部函數的效果相同:未定義的行爲。

如果你想這樣做,而不是玩火,你爲什麼不讓你的替換函數也採取pthread_mutex_t *作爲它的參數類型,然後只是將指針轉換爲pthread_my_mutex_t *在函數體?通常情況下,這種轉換隻會在源頭級別發生;不應該爲它生成代碼。

相關問題