[發明專利]動態替換主程序中C/C++函數的方法及裝置有效
| 申請號: | 201210047538.9 | 申請日: | 2012-02-27 |
| 公開(公告)號: | CN103294457B | 公開(公告)日: | 2017-02-01 |
| 發明(設計)人: | 禤彪 | 申請(專利權)人: | 百度在線網絡技術(北京)有限公司 |
| 主分類號: | G06F9/44 | 分類號: | G06F9/44;G06F9/45 |
| 代理公司: | 北京清亦華知識產權代理事務所(普通合伙)11201 | 代理人: | 宋合成 |
| 地址: | 100085 北京市*** | 國省代碼: | 北京;11 |
| 權利要求書: | 查看更多 | 說明書: | 查看更多 |
| 摘要: | |||
| 搜索關鍵詞: | 動態 替換 主程序 c++ 函數 方法 裝置 | ||
1.一種動態替換主程序中C/C++函數的方法,其特征在于,包括以下步驟:
啟動主程序,并加載用于查詢和修改內存的替換程序模塊;
對加載的所述替換程序模塊進行初始化以使所述替換程序模塊先于所述主程序中的主函數執行,并將所述主程序中函數的符號表信息保存到內存中;
在所述替換程序模塊接收到替換指令之后,所述替換程序模塊根據被替換函數對應的符號表信息確定所述被替換函數在所述內存中的映像地址;以及
根據所述映像地址對所述被替換函數進行替換。
2.如權利要求1所述的動態替換主程序中C/C++函數的方法,其特征在于,所述被替換函數為動態函數。
3.如權利要求2所述的動態替換主程序中C/C++函數的方法,其特征在于,所述根據所述映像地址對所述被替換函數進行替換進一步包括:
將所述被替換函數的映像地址進行備份;以及
將所述被替換函數的映像地址替換為新函數的映像地址。
4.如權利要求1所述的動態替換主程序中C/C++函數的方法,其特征在于,所述被替換函數為靜態函數。
5.如權利要求4所述的動態替換主程序中C/C++函數的方法,其特征在于,所述根據所述映像地址對所述被替換函數進行替換進一步包括:
根據所述被替換函數的映像地址確定所述被替換函數的入口地址;
根據所述被替換函數的入口地址將所述被替換函數對應的字節碼分為第一段字節碼和第二段字節碼,其中,以指令為基本單元進行劃分,所述第一段字節碼為從函數入口至長度長于遠跳指令的最小長度字節碼;
將所述第一段字節碼備份至新分配內存,并將所述新分配內存中所述第一段字節碼中的相對地址跳轉修改為絕對地址跳轉;
在所述新分配內存中所述第一段字節碼之后添加第一遠跳指令,所述第一遠跳指令用于跳轉到所述第二段字節碼;以及
將所述被替換函數對應的第一段字節碼修改為第二遠跳指令,所述第二遠跳指令用于跳轉到新函數的映像地址。
6.如權利要求1所述的動態替換主程序中C/C++函數的方法,其特征在于,所述替換程序模塊作為共享庫,由Linux的LD_PRELOAD環境變量進行加載。
7.如權利要求6所述的動態替換主程序中C/C++函數的方法,其特征在于,所述由Linux的所述LD_PRELOAD環境變量進行加載進一步包括:
設置所述LD_PRELOAD環境變量為編譯成所述共享庫的所述替換程序模塊和用戶編寫的獨立樁模塊,其中,所述用戶編寫的獨立樁模塊的初始化函數可對函數的動態替換進行設置;以及
啟動所述主程序。
8.如權利要求1所述的動態替換主程序中C/C++函數的方法,其特征在于,所述替換程序模塊作為靜態庫,通過編譯時的鏈接進行加載。
9.如權利要求8所述的動態替換主程序中C/C++函數的方法,其特征在于,所述替換程序模塊作為所述靜態庫,通過編譯時鏈接進行加載進一步包括:
在所述主程序中通過應用程序編程接口API對函數的動態替換進行設置;
在所述主程序中添加指向所述替換程序模塊的鏈接并對所述主程序進行編譯,其中,所述替換程序模塊已經通過編譯并作為靜態庫;以及
啟動所述主程序。
10.如權利要求1所述的動態替換主程序中C/C++函數的方法,其特征在于,通過C/C++關鍵字__attribute__((constructor))定義屬性函數,其中,所述屬性函數對所述替換程序模塊進行初始化。
11.一種動態替換主程序中C/C++函數的裝置,其特征在于,包括:
替換程序模塊,用于查詢和修改內存,并在接收到替換指令之后,根據被替換函數對應的符號表信息確定所述被替換函數在所述內存中的映像地址,以及根據所述映像地址對所述被替換函數進行替換;以及
加載及初始化模塊,用于加載并初始化所述替換程序模塊以使所述替換程序模塊先于所述主程序中的主函數執行,并將所述主程序中函數的符號表信息保存到內存中。
12.如權利要求11所述的動態替換主程序中C/C++函數的裝置,其特征在于,所述被替換函數為動態函數。
該專利技術資料僅供研究查看技術是否侵權等信息,商用須獲得專利權人授權。該專利全部權利屬于百度在線網絡技術(北京)有限公司,未經百度在線網絡技術(北京)有限公司許可,擅自商用是侵權行為。如果您想購買此專利、獲得商業授權和技術合作,請聯系【客服】
本文鏈接:http://www.szxzyx.cn/pat/books/201210047538.9/1.html,轉載請聲明來源鉆瓜專利網。





