web-dev-qa-db-ja.com

Spectre 2を軽減するためにソースからmacOSソフトウェアをインストールする方法は?

私は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スイッチを含めるにはどうすればよいですか?

2
miguelmorin

ショートバージョン:多くの調査の結果、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をインストールする手順 に従いました。

最新のLLVM(自作付き)

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を使用したインストールは失敗しました。

GCC(自作あり)

もう1つの方法は、LLVMの代わりにgccを使用してコンパイルすることでした。最新バージョンのclang(6.0)をインストールしました

brew install gcc

そして、LLVMとは異なる このページ からgccフラグを追加しました。このbashスクリプトは、フラグをCC++の両方に追加し、両方のコンパイラーへのパスを提供し、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スクリプトは、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のコメントは、コンパイラにフラグを送信する方法に正しいものです。

1
miguelmorin