Как установить программное обеспечение macOS из исходного кода, чтобы смягчить последствия Spectre 2?

Как установить программное обеспечение macOS из исходного кода, чтобы смягчить последствия Spectre 2?

Я посетилпрезентацияо Spectre и Meltdown профессором UCL. Он предложил несколько способов смягчения Spectre 2 (Branch Target Injection) путем обновления до High Sierra и установки всего программного обеспечения из исходного кода с помощью переключателя --mretpoline (уже развернутого в LLVM и GCC). Я хочу установить R и RStudio на macOS High Sierra таким образом. Я скачал исходный код для обоих. Процедура установки для R и RStudio похожа. Файл INSTALL для R говорит, что я должен запустить

./configure
make

Я проверил файл «configure» и makefiles (Makeconf.in, Makefile.in, Makefile.in). Я не увидел очевидного способа добавить переключатель. Я вызвал справку по make, в которой также не упоминается, как добавить переключатель.

Я искал это в интернете, и самое близкое, что мне удалось найти, были объяснения ретполина и Спектра 2.

Как скомпилировать программное обеспечение из исходного кода с помощью make и включить параметр --mretpoline?

решение1

Укороченная версия: После долгих расследований мне не удалось установить программное обеспечение на MacOS из источника с флагом llvmи или с флагами и . Это кажется более общим, чем и специфичным для , поэтому я изменил заголовок соответствующим образом. Я подозреваю, что это невозможно сделать на Mac по состоянию на 27 апреля 2018 года. Я использую macOS High Sierra версии 10.13.3 (17D102).-mretpolinegcc-mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-registerRMacOS

Длинная версия: Следующее относится к GnuPG, который я решил установить перед R (потому что R требует gfortran, который требует gcc, который требуетМПФР, который поставляется с подписью GPG, которую я хотел проверить). Я следовалшаги по установке GPG из Git.

Последняя версия LLVM (с Homebrew)

LLVM от Apple не работает (см. ниже), поэтому я использовал LLVM clang 6, чтобы исправить это, и я установил с помощью homebrew (это немного противоречит цели компиляции из исходников с определенными флагами, но у меня было мало времени). Я установил homebrew с помощью:

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

затем обновил его дважды с помощью

brew update

Установка clang с Homebrew требовала XCode, поэтому я установил его из App Store. Затем я следовал инструкциям наэта страница:

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 года внизу, в котором говорится, что Mac пока не поддерживается -mretpoline:

samkellett: @chandlerc, поддержка MacOS упущена намеренно (т.е. еще не реализована)? chandlerc: Вовсе нет, у меня просто нет системы Mac для тестирования...

С тех пор ответа нет. Так что установка с LLVM не удалась.

GCC (с Homebrew)

Другой альтернативой была компиляция с помощью gccвместо LLVM. Я установил последнюю версию clang (6.0) с помощью

brew install gcc

И я добавил gccфлаги изэта страница, которые отличаются от LLVM. Этот скрипт 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тоже не удалось. И теперь я в растерянности.

Приложение: LLVM от Apple

Следующий скрипт 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 верен в том, как отправлять флаги компилятору.

Связанный контент