Linux熱補丁的實現

2021-07-11 09:49:08 字數 777 閱讀 5067

如果要修改乙個已經編譯完成的可執行檔案中某個函式的執行流程,有2種方式:

這裡討論第2種方式,即熱補丁(hotpatch)。

下面分別介紹下這2種方式的實現。

先在可執行檔案中找到儲存函式的的位址prelocate(在程式的relocation section)

儲存原始函式的位址poriginal(即*prelocation),此步可用於打補丁不成功後的恢復

載入補丁檔案,載入時機下面討論

載入補丁檔案完成後,找到補丁檔案中的函式位址ppatchfun

將儲存的函式位址指向新的補丁函式,*prelocation = ppatchfun

至於第3步,實現的方式也有多種,可通過發訊號、監控補丁配置檔案變化(使用inotify)等。

更多請參考:

executable and linkable format

redirecting functions in shared elf libraries

attach到目標程序(使用ptrace)

在程序中找到dlopen等函式的位址

在可執行檔案中找到儲存函式的的位址prelocate

儲存原始函式的位址poriginal(即*prelocation),此步可用於打補丁不成功後的恢復

通過dlopen將補丁檔案載入到程序空間

載入補丁檔案完成後,找到補丁檔案中的函式位址ppatchfun

將儲存的函式位址指向新的補丁函式,*prelocation = ppatchfun

此種方法比前一種方法多了前2步。

熱補丁原理

熱補丁 普通 修改技術是修改api起始位址的5個位元組,而熱補丁是修改7個位元組.相比 修改的api鉤取,採用熱補丁能提高多執行緒系統的穩定性和效能.二次跳轉 api起始位址7個位元組是5個nop和2個位元組的mov edi,edi沒有實際意義,是設計時專門留給打熱補丁用的7位元組.熱補丁實現時就是...

Linux核心熱補丁的四種技術

有多種技術在競爭成為實現linux核心熱補丁的最優方案。沒人喜歡重啟機器,尤其是涉及到乙個核心問題的最新補丁程式。為達到不重啟的目的,目前有3個專案在朝這方面努力,將為大家提供核心公升級時打熱補丁的機制,這樣就可以做到完全不重啟機器。首先要介紹的專案是ksplice,它是熱補丁技術的創始者,並於20...

Linux 4 1核心熱補丁成功實踐

最開始公司運維同學反饋,個別宿主機上存在程序cpu峰值使用率異常的現象。而數萬臺機器中只出現了幾例,也就是說萬分之幾的概率。監控產生的些小誤差,不會造成宕機等嚴重後果,很容易就此被忽略了。但我們考慮到這個異常轉瞬即逝 並不易被察覺,可能還存在更多這樣的機器,又或者現在正常將來又不正常,核心研發本能的...