由驅動原始碼編譯的.o檔案在不同版本的核心環境下無法通用

๑¹¹發表於2024-06-02

一、解決驅動原始碼編譯的.o檔案不通用問題

    1、背景
    我希望將驅動的部分原始碼事先編譯成 .o 檔案,然後將另一部分原始碼和事先編譯好的 .o 檔案拿到其它核心環境下重新編譯成驅動模組檔案(.ko檔案)。
    2、問題描述
    在 Ubuntu20.04(核心版本 5.15.0-91-generic)環境下,由部分驅動原始碼編譯成的 .o 檔案拿到 Ubuntu18.04(核心版本 5.4.0-84-generic)環境下重新編譯成驅動模組檔案(.ko檔案)出錯。
    3、報錯截圖
由驅動原始碼編譯的.o檔案在不同版本的核心環境下無法通用
    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,其它核心版本可能略有差異。

由驅動原始碼編譯的.o檔案在不同版本的核心環境下無法通用

    B、修改.config

    將 CONFIG_RETHUNK=y 修改為 #CONFIG_RETHUNK is not set;將 CONFIG_UBSAN=y 修改為#CONFIG_UBSAN is not set。

由驅動原始碼編譯的.o檔案在不同版本的核心環境下無法通用

由驅動原始碼編譯的.o檔案在不同版本的核心環境下無法通用

    7、Makefile、.config、make menuconfig、Kconfig 之間的關係
    Makefile 裡面的條件編譯是由 .config 中選項決定,修改 make menuconfig 配置選項會修改 .config 檔案選項, make menuconfig 中的是否存在這個配置選項則是由 Kconfig 決定的。

相關文章