Como instalar o software macOS da fonte para mitigar o Spectre 2?

Como instalar o software macOS da fonte para mitigar o Spectre 2?

Eu participei de umapresentaçãosobre Spectre e Meltdown por um professor da UCL. Ele sugeriu várias maneiras de mitigar o Spectre 2 (Branch Target Injection), atualizando para High Sierra e instalando todo o software da fonte com o switch --mretpoline (já implantado no LLVM e GCC). Quero instalar o R ​​e o RStudio no macOS High Sierra desta forma. Baixei a fonte de ambos. O procedimento de instalação é semelhante para R e RStudio. O arquivo INSTALL for R diz que devo executar

./configure
make

Inspecionei o arquivo “configure” e os makefiles (Makeconf.in, Makefile.in, Makefile.in). Não vi nenhuma maneira óbvia de adicionar a opção. Liguei para a ajuda do make, que também não menciona como adicionar um switch.

Procurei isso online e o mais próximo que consegui encontrar foram explicações sobre retpoline e Spectre 2.

Como posso compilar software a partir do código-fonte com make e incluir a opção --mretpoline?

Responder1

Versão curta: Depois de muita investigação, não consegui instalar o software no MacOS a partir da fonte com sinalizador llvme -mretpolineou com sinalizadores gcce -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register. Isso parece mais geral Re específico MacOS, então mudei o título de acordo. Suspeito que isso não possa ser feito em um Mac a partir de 27 de abril de 2018. Estou executando o macOS High Sierra versão 10.13.3 (17D102).

Versão longa: O seguinte se aplica ao GnuPG, que decidi instalar antes do R (porque R requer gfortran, que requer gcc, que requerMPFR, que vem com uma assinatura GPG que eu queria verificar). Eu segui oetapas para instalar o GPG do Git.

LLVM mais recente (com Homebrew)

O LLVM da Apple falha (veja abaixo), então usei o LLVM clang 6 para consertar isso e instalei com o homebrew (isso anula um pouco o propósito de compilar a partir do código-fonte com sinalizadores específicos, mas meu tempo estava acabando). Eu instalei o homebrew com:

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

então atualizei duas vezes com

brew update

A instalação do clang com o Homebrew exigia o XCode, então instalei-o na App Store. Então segui os passos emesta página:

brew install --with-toolchain llvm

Em seguida, adicionei o -mretpolinesinalizador a ambos C, adicionei o caminho a ambos Cos C++compiladores e chamei os scripts de shell do 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

Eu recebi este erro:

checking whether the C compiler works... no

O arquivo de log config.logfornece mais detalhes:

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)

Este tópicocom um comentário de janeiro de 2018 na parte inferior dizendo que o Mac ainda não é compatível com -mretpoline:

samkellett: @chanlerc o suporte ao MacOS foi omitido intencionalmente (ou seja, ainda não foi implementado)? chanlerc: De jeito nenhum, só não tenho um sistema Mac para testar...

Não houve resposta desde então. Portanto, a instalação com LLVM falhou.

GCC (com Homebrew)

Outra alternativa era compilar com gccem vez de LLVM. Instalei a versão mais recente do clang (6.0) com

brew install gcc

E adicionei as gccbandeiras deesta página, que são diferentes do LLVM. Este script bash adiciona os sinalizadores a ambos Ce C++, fornece os caminhos para ambos os compiladores e chama os scripts shell do 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

e novamente recebo o erro:

checking whether the C compiler works... no

O arquivo de log config.logfornece mais detalhes:

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

É estranho que o compilador saiba sobre o nome com som semelhante com um sublinhado extra.

Então gcctambém falhou. E agora estou perdido.

Apêndice: LLVM da Apple

O script bash a seguir exporta os sinalizadores makee chama os scripts shell do GnuPG:

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

Ele falha com o compilador fornecido pela Apple, mas mostra que os sinalizadores estão chegando ao compilador:

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

Portanto, o comentário de @seth está correto sobre como enviar sinalizadores para o compilador.

informação relacionada