韌館-LearnHouse

[轉]打patch(補丁)時的常見錯誤

資料來源:https://onestraw.github.io/linux/apply-patch-to-linux-kernel/

當patch命令應用一個補丁檔案時,它會用不同的方法驗證補丁檔案的完整性。
patch命令做的兩個完整性檢查:
檢查檔案是不是一個有效的補丁檔案;
檢查修改的bits附近的程式碼是否匹配補丁檔案中相應位置上下文;

如果patch命令執行過程中遇到一些不太正確(not ‘quite right’)的問題,它有兩個選擇,一是拒絕修補更新變化,退出;二是嘗試找到一個方法對補丁做一些小的改動。

一個例子(補丁不太正確,patch命令試圖修復):上下文匹配,需要修改的行匹配,但是行號不匹配。這是可能發生的,例如,patch命令對檔案做一些變動,但是由於某些原因,在檔案開始處有幾行需要被新增或者刪除。在這種情況下,一切看起來都沒問題,它只是向上或向下移動一下,patch命令通常會調整行號,然後修補補丁。

每當patch命令使用它不得不進行稍微修改的補丁檔案時,它將提示”補丁通過’fuzz’被使用“來告訴你。你應該警惕這種變化,因為即使patch命令可能讓補丁檔案正確,它不可能總使補丁檔案正確,結果有時可能會出錯。

當patch命令遇到它不能通過fuzz修補的變化時,它完全拒絕這個檔案,並且生成一個擴展名為.rej的檔案(一個reject file)。你能夠從這個rej檔案找出哪個change不能被修補,所以你能夠手動修復它。

如果你沒有第三方補丁來修補你的核心原始碼,只有從kernel.org獲得的補丁,以正確的順序打補丁,不對原始檔作出修改(譯者註:應該是指補丁原始檔,這裡要說明的意思是,你使用完整的kernel.org上的補丁檔案,使用patch命令執行基本不會出問題),那麼你應該看不到來自patch命令的fuzz或者reject消息。但是如果你看到了fuzz或者reject消息,那麼這可能是一個高風險狀況:你的本地source tree或者補丁檔案損壞了。在這種情況下,你應該嘗試重新下載補丁,如果問題還沒有解決,建議你從kernel.org下載一個全新的source tree(譯者註:應該是完整的核心原始碼,因為這個問題可能說明你本地核心程式碼被惡意篡改了).

讓我們看一下patch命令可能產生的其它資訊。

如果patch命令停止,出現”File to patch:”提示,說明patch命令沒有找到補丁檔案。你很可能忘記了指定 -p1選項,或者你的當前工作目錄不對。其它情況,補丁檔案需要 -p0選項而不是-p1選項(如果是這種情況,閱讀補丁檔案就可以發現,如果是的話,這是由寫補丁的人犯的錯誤,這不算嚴重)。

如果顯示”Hunk #2 succeeded at 1887 with fuzz 2 (offset 7 lines).”或者類似這個資訊的,這說明patch命令不得不調整change的位置(上面這個例子中,它需要移動7行)。由於補丁檔案和期望的檔案不同,結果檔案可能是也可能不是正確的。如果試圖將一個核心版本的補丁應用到另一個不同版本的核心上,經常會出現這種提示消息。

如果顯示”Hunk #3 FAILED at 2387.”,說明這個補丁檔案不能夠正確修補,patch命令用fuzz方法也不能正確執行。這將會產生一個.rej檔案,該檔案包含導致patch命令失敗的change,還會產生一個.orig檔案,該檔案包含不能改變的原始內容。

如果顯示”Reversed (or previously applied) patch detected! Assume -R? [n]”,說明patch命令檢測到補丁檔案中的change已經修補了核心。 如果你之前確實打過該補丁,你只是誤操作,那麼輸入[n]o來中止patch命令。如果你之前打過該補丁,現在想撤銷它,卻忘記了指定-R選項,那麼輸出[y]es來撤銷補丁。 如果補丁的作者在建立補丁時reversed the source 和目標目錄,這也會發生,在這種情況下,恢復/撤銷補丁將在實際中應用它。

如果顯示類似”patch: ** unexpected end of file in patch” 或者 “patch unexpectedly ends in middle of line”的消息,表示patch命令不能正確解析你輸入的補丁檔案。或許是你下載的檔案損壞了,你試圖輸入一個壓縮的補丁檔案,或許是你使用的補丁檔案由於郵件客戶端/郵件傳輸代理在傳輸過程中損壞了,例如,通過分隔長行為兩行。往往這些警告可以很容易的修復,通過連接被分隔的兩行。

正如我上面已經提到的,如果將從kernel.org獲取的補丁應用到正確的未經修改的原始碼樹上,將不會出現這些錯誤。所以,如果你使用kernel.org上的補丁,卻還是遇到這些錯誤,那麼應該是你的補丁檔案或者你的核心原始碼樹損壞了,建議你重新下載一個完整的核心樹和你想使用的補丁檔案。

2023年2 月 posted by admin in 文獻參考 and have No Comments

Place your comment

Please fill your data and comment below.
名稱:
信箱:
網站:
您的評論: