
我參加了一個推介會倫敦大學學院教授的《幽靈與崩潰》。他提出了幾種緩解 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 腳本:C
C++
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(附自製軟體)
另一種選擇是使用gcc
LLVM 進行編譯。我安裝了最新版本的 clang (6.0)
brew install gcc
我添加了gcc
來自的標誌這一頁,這與 LLVM 不同。此 bash 腳本將標誌新增至C
和C++
,給出兩個編譯器的路徑,並從 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 的評論對於如何向編譯器發送標誌是正確的。