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

433
mmorin

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

./configure make 

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

Я искал это онлайн, и самое близкое, что я мог найти, было объяснением ретполина и Призрака 2.

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

2
Просто, чтобы избежать путаницы, есть еще один вопрос для этого (вами), который был закрыт. [Здесь] (https://stackoverflow.com/questions/48523008/how-to-install-software-with-make-and-mretpoline). Также [Передача дополнительных переменных из командной строки для создания] (https://stackoverflow.com/questions/2826029/passing-additional-variables-from-command-line-to-make) может иметь значение. Seth 6 лет назад 0
Спасибо @Seth за ссылку, чтобы избежать путаницы, и за подсказку о передаче переменных. Передача переменных работает, но не конкретный флаг `-mretpoline`. mmorin 6 лет назад 0

1 ответ на вопрос

2
mmorin

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

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

Последний LLVM (с Homebrew)

LLVM от Apple терпит неудачу (см. Ниже), поэтому я использовал LLVM clang 6, чтобы исправить это, и я установил с помощью 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 (т. е. еще не реализована)? Чандлерк: Вовсе нет, у меня просто нет системы Mac для тестирования ...

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

GCC (с домашним пивом)

Другой альтернативой была компиляция 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 прав в том, как отправлять флаги компилятору.