Spectre 2 を軽減するために macOS ソフトウェアをソースからインストールするにはどうすればよいでしょうか?

Spectre 2 を軽減するために macOS ソフトウェアをソースからインストールするにはどうすればよいでしょうか?

私はプレゼンテーション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 からシェル スクリプトを呼び出しました。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 (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 のコメントは正しいです。

関連情報