私はUCL教授によるSpectreand Meltdownの プレゼンテーション に出席しました。彼は、High Sierraにアップグレードし、スイッチ--mretpoline(LLVMおよびGCCにすでにデプロイされている)を使用してソースからすべてのソフトウェアをインストールすることにより、Spectre 2(ブランチターゲットインジェクション)を軽減するいくつかの方法を提案しました。この方法でMacOSHighSierraにRとRStudioをインストールしたいと思います。両方のソースをダウンロードしました。インストール手順は、RとRStudioで似ています。 R用のファイルINSTALLは、実行する必要があることを示しています
./configure
make
「configure」ファイルとmakefile(Makeconf.in、Makefile.in、Makefile.in)を調べました。スイッチを追加する明確な方法は見当たりませんでした。 makeのヘルプを呼び出しましたが、スイッチの追加方法についても触れられていません。
私はこれをオンラインで検索しました、そして私が見つけることができた最も近いものはretpolineとSpectre2の説明でした。
Makeを使用してソースからソフトウェアをコンパイルし、-mretpolineスイッチを含めるにはどうすればよいですか?
ショートバージョン:多くの調査の結果、llvm
フラグと-mretpoline
フラグのいずれかを使用してソースからMacOSにソフトウェアをインストールできませんでした、またはgcc
および-mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register
フラグを使用します。これはR
よりも一般的で、MacOS
に固有のように思われるので、それに応じてタイトルを変更しました。 2018年4月27日現在、Macではこれを実行できないと思われます。macOSHighSierraバージョン10.13.3(17D102)を実行しています。
長いバージョン:以下はRの前にインストールすることにしたGnuPGに適用されます(Rにはgfortranが必要であり、gccが必要であり、 [〜#〜] mpfr [〜#〜] 、これには検証したいGPG署名が付属しています)。 GitからGPGをインストールする手順 に従いました。
Appleが失敗する(以下を参照)からのLLVM)、それで私はこれを修正するためにLLVM clang 6を使用し、homebrewでインストールしました(特定のフラグを使用してソースからコンパイルする目的を少し損ないますが、私は時間切れ)私は自作をインストールしました:
Ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
その後、2回更新しました
brew update
HomebrewでclangをインストールするにはXCodeが必要だったので、AppStoreからインストールしました。次に、 このページ の手順に従いました。
brew install --with-toolchain llvm
次に、-mretpoline
フラグを両方のC
に追加し、C
コンパイラとC++
コンパイラの両方へのパスを追加し、GPGからシェルスクリプトを呼び出しました。
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を使用したインストールは失敗しました。
もう1つの方法は、LLVMの代わりにgcc
を使用してコンパイルすることでした。最新バージョンのclang(6.0)をインストールしました
brew install gcc
そして、LLVMとは異なる このページ からgcc
フラグを追加しました。このbashスクリプトは、フラグをC
とC++
の両方に追加し、両方のコンパイラーへのパスを提供し、GPGからシェルスクリプトを呼び出します。
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
も失敗しました。そして今、私は途方に暮れています。
次のbashスクリプトは、make
のフラグをエクスポートし、GnuPGからシェルスクリプトを呼び出します。
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のコメントは、コンパイラにフラグを送信する方法に正しいものです。