
私はプレゼンテーションUCL教授によるSpectreとMeltdownに関する論文。彼は、High Sierraにアップグレードし、スイッチ--mretpoline(LLVMとGCCにすでに導入済み)を使用してすべてのソフトウェアをソースからインストールすることで、Spectre 2(Branch Target Injection)を緩和するいくつかの方法を提案しました。この方法でRとRStudioをmacOS High Sierraにインストールしたいと思います。両方のソースをダウンロードしました。インストール手順はRとRStudioで似ています。RのINSTALLファイルには、
./configure
make
「configure」ファイルと makefile (Makeconf.in、Makefile.in、Makefile.in) を調べました。スイッチを追加する明確な方法は見つかりませんでした。make のヘルプを参照しましたが、スイッチを追加する方法については記載されていません。
これをオンラインで検索したところ、最も近いものは retpoline と Spectre 2 の説明でした。
make を使用してソースからソフトウェアをコンパイルし、--mretpoline スイッチを含めるにはどうすればよいでしょうか?
答え1
短縮版llvm
: 調査を重ねた結果、および-mretpoline
フラグ、または およびgcc
フラグのいずれかを使用して、ソースから MacOS にソフトウェアをインストールできませんでした-mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register
。これは よりも一般的で にR
固有のものであるように思われるMacOS
ため、それに応じてタイトルを変更しました。2018 年 4 月 27 日現在、これは Mac では実行できないと思われます。私は macOS High Sierra バージョン 10.13.3 (17D102) を実行しています。
ロングバージョン: 以下はGnuPGに当てはまります。Rの前にインストールすることにしたのです(Rはgfortranを必要とし、gfortranはgccを必要とし、gccはマルコム(GPG署名が付属しており、それを検証したいと思った)。GitからGPGをインストールする手順。
最新の LLVM (Homebrew を使用)
Apple の LLVM は失敗します (下記参照)。そのため、LLVM clang 6 を使用してこれを修正し、homebrew でインストールしました (特定のフラグを使用してソースからコンパイルする目的が少し損なわれますが、時間が足りませんでした)。homebrew を次のようにインストールしました。
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
その後、2回更新しました
brew update
HomebrewでclangをインストールするにはXCodeが必要だったので、App Storeからインストールしました。その後、このページ:
brew install --with-toolchain llvm
-mretpoline
次に、両方にフラグを追加し、両方とコンパイラC
へのパスを追加して、GPG からシェル スクリプトを呼び出しました。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 (Homebrew 付き)
もう一つの選択肢は、LLVMの代わりにコンパイルすることでしたgcc
。私はclangの最新バージョン(6.0)をインストールしました。
brew install gcc
そして私はgcc
旗を追加しましたこのページC
は、LLVM とは異なります。この bash スクリプトは、との両方にフラグを追加し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
。そして今は途方に暮れています。
付録: Apple の LLVM
次の bash スクリプトは、GnuPG のフラグをエクスポートしmake
、シェル スクリプトを呼び出します。
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 のコメントは正しいです。