這是C
中的一種獨特情況。覆蓋函數指針的實現並用於共享庫
說我們圖書館稱爲libfoo.so
和libbar.so
,並在這兩個我們同樣的功能名稱,Get_A
,假設Get_A
由系統調用。
說libbar
被加載,然後用參數G
調用它的Get_A
。 G
是一些函數指針一個結構,有感興趣的一個:
(*G)->RegisterBaz
所以libbar
的調用Get_A
,我們要變異的指針,RegisterBaz函數,然後調用libfoo
'的S版Get_A
藉助於dlopen + dlsym。
有一兩件事我想直接分配,但後來我的一個編譯器錯誤只讀變量無法分配的,所以我試圖去通過指針:
// not void * but actually some function signature typedefed.
void *f_ptr = (*G)->RegisterBaz;
*&f_ptr = r_n;
凡r_n
是一個普通的C函數具有相同簽名RegisterBaz
和r_n
我叫原來實行的RegisterBaz
因此,雖然這並不賽格故障,它不帶d打電話給我的包裝功能。
嗯,這樣做給我一個seg故障。 –
您是否100%確定您要替換的功能提供了所有相同的功能?你不能用你自己的庫來替換一個庫函數,只是因爲簽名匹配期望它是花哨的。 –
簽名是正確的,什麼可能是錯誤的,我可以從哪裏開始尋找線索或尋找。 AFAIK我的事情是正確的。 –