一、解決驅動原始碼編譯的.o檔案不通用問題
-
1、背景
-
我希望將驅動的部分原始碼事先編譯成 .o 檔案,然後將另一部分原始碼和事先編譯好的 .o 檔案拿到其它核心環境下重新編譯成驅動模組檔案(.ko檔案)。
-
2、問題描述
-
在 Ubuntu20.04(核心版本 5.15.0-91-generic)環境下,由部分驅動原始碼編譯成的 .o 檔案拿到 Ubuntu18.04(核心版本 5.4.0-84-generic)環境下重新編譯成驅動模組檔案(.ko檔案)出錯。
-
3、報錯截圖
-
4、原因分析
-
經過排查發現由於核心版本不同,核心的一些配置選項有些差異,20.04 的 menuconfig 相較於18.04 增加了一些選項,導致在 20.04 編譯成的 .o 檔案包含了 18.04 中沒有的一些符號連結,具體可以使用 objdump -t xx.o 命令檢視符號連結表。可以透過 make menuconfig 命令以圖形化的介面關閉相關選項,或者透過直接修改 .config 配置檔案關閉相關選項。
-
5、補充
-
__x86_return_thunk 是一個與安全相關的機制,主要用於防止某些型別的攻擊,如間接分支投機(Indirect Branch Speculation)。這些攻擊被稱為 “Spectre” 攻擊變種之一。為了應對這些安全漏洞,Linux 核心以及其他軟體對其進行了各種緩解措施。
具體來說,__x86_return_thunk 是一種在函式返回時替代直接使用 ret 指令的技術。它透過使用一個安全的返回路徑來防止潛在的攻擊,這些攻擊可能利用 CPU 的分支預測機制導致資訊洩露。
-
6、如何修改(A、B二選一)
A、透過 make menuconfig
搜尋 CONFIG_RETPOLINE,找到 Enable return-thunks 選項並關閉( 路徑:Mitigations for speculative execution vulnerabilities --> Enable return-thunks);搜尋 CONFIG_RETPOLINE,找到 Undefined behaviour sanity checker 選項並關閉;(路徑:Kernel hacking --> Generic Kernel Debugging Instruments --> Undefined behaviour sanity checker),核心版本 5.15.0-91-generic,其它核心版本可能略有差異。
B、修改.config
將 CONFIG_RETHUNK=y 修改為 #CONFIG_RETHUNK is not set;將 CONFIG_UBSAN=y 修改為#CONFIG_UBSAN is not set。
-
7、Makefile、.config、make menuconfig、Kconfig 之間的關係
-
Makefile 裡面的條件編譯是由 .config 中選項決定,修改 make menuconfig 配置選項會修改 .config 檔案選項, make menuconfig 中的是否存在這個配置選項則是由 Kconfig 決定的。
作者:ThinkerOne
出處:https://www.cnblogs.com/zwsmile/p/14150552.html
宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連結,否則保留追究法律責任的權利。
出處:https://www.cnblogs.com/zwsmile/p/14150552.html
宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連結,否則保留追究法律責任的權利。