Bagaimana cara menginstal perangkat lunak macOS dari sumber untuk mengurangi Specter 2?

2

Saya menghadiri presentasi tentang Specter dan Meltdown oleh seorang profesor UCL. Dia menyarankan beberapa cara untuk mengurangi Spectre 2 (Branch Target Injection) dengan memutakhirkan ke High Sierra dan menginstal semua perangkat lunak dari sumber dengan switch --mretpoline (sudah digunakan di LLVM dan GCC). Saya ingin menginstal R dan RStudio di macOS High Sierra dengan cara ini. Saya mengunduh sumber untuk keduanya. Prosedur instalasi serupa untuk R dan RStudio. File INSTALL untuk R mengatakan bahwa saya harus menjalankan

./configure
make

Saya memeriksa file "configure" dan makefiles (Makeconf.in, Makefile.in, Makefile.in). Saya tidak melihat cara yang jelas untuk menambahkan saklar. Saya meminta bantuan untuk make, yang juga tidak menyebutkan cara menambahkan switch.

Saya mencari ini secara online dan yang paling dekat yang bisa saya temukan adalah penjelasan retpoline dan Specter 2.

Bagaimana saya bisa mengkompilasi perangkat lunak dari sumber dengan make dan menyertakan --mretpoline switch?

miguelmorin
sumber
Hanya untuk menghindari kebingungan ada juga pertanyaan SO untuk ini (oleh Anda) yang ditutup. Berikut . Juga Melewati variabel tambahan dari baris perintah untuk membuat mungkin relevan.
Seth
Terima kasih @Seth atas tautannya untuk menghindari kebingungan dan atas tip tentang variabel yang lewat. Kelulusan variabel berfungsi, tetapi bukan flag tertentu -mretpoline.
miguelmorinin

Jawaban:

1

Versi pendek : Setelah banyak penyelidikan, saya tidak dapat menginstal perangkat lunak pada MacOS dari sumber dengan baik llvmdan -mretpolinebendera, atau dengan gccdan -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-registerbendera. Ini tampaknya lebih umum daripada Rdan khusus untuk MacOS, jadi saya mengubah judulnya. Saya menduga bahwa ini tidak dapat dilakukan pada Mac pada tanggal 27 April 2018. Saya menjalankan macOS High Sierra versi 10.13.3 (17D102).

Versi panjang : Hal berikut ini berlaku untuk GnuPG, yang saya putuskan untuk diinstal sebelum R (karena R membutuhkan gfortran, yang membutuhkan gcc, yang membutuhkan MPFR , yang dilengkapi dengan tanda tangan GPG yang ingin saya verifikasi). Saya mengikuti langkah - langkah untuk menginstal GPG dari Git .

LLVM terbaru (dengan Homebrew)

LLVM dari Apple gagal (lihat di bawah), jadi saya menggunakan LLVM clang 6 untuk memperbaikinya dan saya instal dengan homebrew (sedikit mengalahkan tujuan kompilasi dari sumber dengan flag tertentu, tetapi saya kehabisan waktu). Saya memasang homebrew dengan:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

kemudian memperbaruinya dua kali dengan

brew update

Menginstal dentang dengan Homebrew diperlukan XCode, jadi saya menginstalnya dari App Store. Kemudian saya mengikuti langkah-langkah di halaman ini :

brew install --with-toolchain llvm

Lalu saya menambahkan -mretpolineflag ke keduanya C, saya menambahkan path ke keduanya Cdan C++kompiler, dan saya memanggil skrip shell dari 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

Saya mendapat kesalahan ini:

checking whether the C compiler works... no

File log config.logmemberikan rincian lebih lanjut:

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)

Utas ini dengan komentar dari Januari 2018 di bagian bawah mengatakan bahwa Mac belum didukung dengan -mretpoline:

samkellett: @chandlerc apakah dukungan MacOS sengaja dihilangkan (mis. belum diimplementasikan)? chandlerc: Tidak sama sekali, saya hanya tidak memiliki sistem Mac untuk menguji dengan ...

Sejak itu tidak ada tanggapan. Jadi menginstal dengan LLVM gagal.

GCC (dengan Homebrew)

Alternatif lain adalah mengkompilasi dengan gccbukannya LLVM. Saya menginstal clang (6.0) versi terbaru dengan

brew install gcc

Dan saya menambahkan gccbendera dari halaman ini , yang berbeda dari LLVM. Skrip bash ini menambahkan flag untuk keduanya Cdan C++, memberikan path ke kedua kompiler, dan memanggil skrip shell dari 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

dan sekali lagi saya mendapatkan kesalahan:

checking whether the C compiler works... no

File log config.logmemberikan rincian lebih lanjut:

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

Sungguh aneh bahwa kompiler tahu tentang nama yang mirip dengan garis bawah ekstra.

Jadi gccgagal juga. Dan sekarang saya bingung.

Lampiran: LLVM dari Apple

Skrip bash berikut mengekspor flag untuk makedan memanggil skrip shell dari GnuPG:

export CFLAGS='-mretpoline'
export CXXFLAGS=$CFLAGS
echo $CFLAGS
echo $CXXFLAGS
./autogen.sh
./configure --sysconfdir=/etc --enable-maintainer-mode  && make

Gagal dengan kompiler yang dikirimkan dari Apple, tetapi itu menunjukkan bahwa flag-flag tersebut sampai ke kompiler:

configure:4045: gcc -mretpoline -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register   conftest.c  >&5
clang: error: unknown argument: '-mretpoline'

Jadi komentar @ seth benar dalam cara mengirim flag ke compiler.

miguelmorin
sumber