質問: 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スイッチを含めるにはどうすればよいですか?
回答: ショートバージョン:多くの調査の結果、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スクリプトは、フラグを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も失敗しました。そして今、私は途方に暮れています。付録: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のコメントは、コンパイラにフラグを送信する方法に正しいものです。