如何從原始碼安裝 macOS 軟體來緩解 Spectre 2?

如何從原始碼安裝 macOS 軟體來緩解 Spectre 2?

我參加了一個推介會倫敦大學學院教授的《幽靈與崩潰》。他提出了幾種緩解 Spectre 2(分支目標注入)的方法,即升級到 High Sierra 並使用開關 --mretpoline(已部署在 LLVM 和 GCC 中)從來源安裝所有軟體。我想透過這種方式在 macOS High Sierra 上安裝 R 和 RStudio。我下載了兩者的原始碼。 R 和 RStudio 的安裝過程類似。 R 檔案 INSTALL 表示我應該要運行

./configure
make

我檢查了「設定」檔案和 makefile(Makeconf.in、Makefile.in、Makefile.in)。我沒有看到明顯的方法來添加開關。我呼叫了make的幫助,其中也沒有提到如何添加開關。

我在網路上搜尋了這個,我能找到的最接近的是 retpoline 和 Spectre 2 的解釋。

如何使用 make 從原始碼編譯軟體並包含 --mretpoline 開關?

答案1

簡潔版本:經過大量調查,我無法使用llvm-mretpoline標誌或使用gcc-mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register標誌從原始碼在 MacOS 上安裝軟體。這看起來比 更籠統,R更具​​體MacOS,所以我相應地更改了標題。我懷疑自 2018 年 4 月 27 日起,這無法在 Mac 上完成。

長版:以下適用於GnuPG,我決定在R之前安裝它(因為R需要gfortran,它需要gcc,它需要MPFR,其中帶有我想要驗證的 GPG 簽名)。我跟著從 Git 安裝 GPG 的步驟

最新的 LLVM(附有自製軟體)

Apple 的LLVM 失敗了(見下文),因此我使用LLVM clang 6 來修復此問題,並使用自製軟體安裝(它有點違背了從具有特定標誌的源代碼進行編譯的目的,但我已經沒有時間了) 。我安裝了自製軟體:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

然後更新了兩次

brew update

使用 Homebrew 安裝 clang 需要 XCode,所以我從 App Store 安裝了它。然後我按照以下步驟操作這一頁:

brew install --with-toolchain llvm

然後我將-mretpoline標誌新增至 Both ,新增了和編譯器C的路徑,並從 GPG 呼叫了 shell 腳本:CC++

export CFLAGS='-mretpoline'
export CC=/usr/local/opt/llvm/bin/clang
export CXX=/usr/local/opt/llvm/bin/clang++
./autogen.sh
./configure --sysconfdir=/etc --enable-maintainer-mode  && make

我收到這個錯誤:

checking whether the C compiler works... no

日誌檔案config.log提供了更多詳細資訊:

configure:4049: /usr/local/opt/llvm/bin/clang -mretpoline   conftest.c  >&5
fatal error: error in backend: MachO doesn't support COMDATs, '__llvm_retpoline_r11' cannot be lowered.
clang-6.0: error: clang frontend command failed with exit code 70 (use -v to see invocation)

這個線程底部有一條 2018 年 1 月的評論說 Mac 尚不支持-mretpoline

samkellett:@chandlerc 是否故意省略了 MacOS 支援(即尚未實現)? chandlerc:完全沒有,我只是沒有Mac系統來測試...

此後一直沒有任何回應。所以用LLVM安裝失敗。

GCC(附自製軟體)

另一種選擇是使用gccLLVM 進行編譯。我安裝了最新版本的 clang (6.0)

brew install gcc

我添加了gcc來自的標誌這一頁,這與 LLVM 不同。此 bash 腳本將標誌新增至CC++,給出兩個編譯器的路徑,並從 GPG 呼叫 shell 腳本:

export CFLAGS='-mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register'
export CXXFLAGS=$CFLAGS
export CC=/usr/local/opt/gcc/bin/gcc-7
export CXX=/usr/local/opt/gcc/bin/g++-7
./autogen.sh
./configure --sysconfdir=/etc --enable-maintainer-mode  && make

我再次收到錯誤:

checking whether the C compiler works... no

日誌檔案config.log提供了更多詳細資訊:

configure:4027: checking whether the C compiler works
configure:4049: /usr/local/opt/gcc/bin/gcc-7 -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register   conftest.c  >&5
Undefined symbols for architecture x86_64:
  "__x86_return_thunk", referenced from:
      _main in ccZuBhFQ.o
     (maybe you meant: ___x86_return_thunk)
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
configure:4053: $? = 1
configure:4091: result: no

奇怪的是,編譯器知道發音相似但帶有額外底線的名稱。

所以gcc也失敗了。現在我不知所措。

附錄:Apple 的 LLVM

以下 bash 腳本匯出 GnuPG 的標誌make並呼叫 GnuPG 的 shell 腳本:

export CFLAGS='-mretpoline'
export CXXFLAGS=$CFLAGS
echo $CFLAGS
echo $CXXFLAGS
./autogen.sh
./configure --sysconfdir=/etc --enable-maintainer-mode  && make

Apple 附帶的編譯器失敗,但它顯示標誌已到達編譯器:

configure:4045: gcc -mretpoline -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register   conftest.c  >&5
clang: error: unknown argument: '-mretpoline'

所以 @seth 的評論對於如何向編譯器發送標誌是正確的。

相關內容