[英]Is it possible to LD_PRELOAD a function with different parameters?
假設我通過創建共享對象並使用LD_PRELOAD首先加載它來替換函數。 是否有可能使該功能的參數不同於原始庫中的參數?
例如,如果我替換pthread_mutex_lock ,這樣它將代替參數pthread_mutex_t而是使用pthread_my_mutex_t 。 可能嗎?
其次,除了函數之外,是否可以使用LD_PRELOAD更改結構聲明? 例如,可以向結構中增加一個字段。
盡管可以安排提供修改后的pthread_mutex_lock()
函數,但是該代碼將被編譯為調用標准函數。 當使用傳遞到標准函數的參數調用替換時,將導致問題。 這是一種禮貌的說法:
任何預加載的函數都必須實現與其替換的函數相同的接口,即相同的名稱,相同的參數,相同的值。 可以根據需要以不同的方式實現內部實現,但是接口必須相同。
與結構類似。 現有代碼經過編譯,期望結構具有一種尺寸,並具有一種特定的布局。 您可能不希望在最后添加一個額外的字段,但是未替換的代碼可能無法正常工作。 它將為結構的原始大小而不是增強結構等分配空間。它將永遠不會訪問額外的元素本身。 可能不是很不可能,但是您必須設計該程序來處理動態變化的結構大小,這對何時可以執行設置了足夠嚴格的限制,答案“不可能”可能是適當的(而且肯定很多)更簡單)。
IMNSHO,LD_PRELOAD機制用於緊急情況(是給定問題的臨時創可貼)。 這不是您應該計划在定期類似於遠程的任何事物上使用的機制。
LD_PRELOAD只做一件事。 它將一個特定的DSO文件安排在ld.so用於查找符號的列表的最前面。 一旦找到,它與代碼如何使用函數或數據項無關。
使用LD_PRELOAD可以執行任何操作,只需將替換庫與列表前面的-l鏈接即可進行模擬。 另一方面,如果您無法使用該-l完成任務,則無法使用LD_PRELOAD完成該任務。
您所描述的效果在概念上與在正常鏈接時提供不匹配的外部功能的效果相同:未定義的行為。
如果要這樣做,而不是玩弄火,為什么不讓替換函數也將pthread_mutex_t *
作為其參數類型,然后將指針轉換為函數體內的pthread_my_mutex_t *
? 通常,無論如何,這種轉換只會在源代碼級別進行; 不應為此生成任何代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.