
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 llvm
e -mretpoline
ou com sinalizadores gcc
e -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register
. Isso parece mais geral R
e 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 -mretpoline
sinalizador a ambos C
, adicionei o caminho a ambos C
os 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.log
fornece 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 gcc
em vez de LLVM. Instalei a versão mais recente do clang (6.0) com
brew install gcc
E adicionei as gcc
bandeiras deesta página, que são diferentes do LLVM. Este script bash adiciona os sinalizadores a ambos C
e 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.log
fornece 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 gcc
também falhou. E agora estou perdido.
Apêndice: LLVM da Apple
O script bash a seguir exporta os sinalizadores make
e 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.