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

2

Participei de uma apresentação sobre Specter and Meltdown, de um professor da UCL. Ele sugeriu várias maneiras de mitigar o Spectre 2 (Branch Target Injection) atualizando para o High Sierra e instalando todo o software da fonte com o switch --mretpoline (já implantado no LLVM e no GCC). Eu quero instalar o R e o RStudio no macOS High Sierra dessa maneira. Eu baixei a fonte para ambos. O procedimento de instalação é semelhante para R e RStudio. O arquivo INSTALL for R diz que eu deveria rodar

./configure
make

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

Eu procurei por isso online e o mais perto que eu pude encontrar foram explicações sobre a retpolina e o Spectre 2.

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

    
por mmorin 01.02.2018 / 11:11

1 resposta

2

Versão curta : após muita investigação, não consegui instalar o software no MacOS a partir da origem com llvm e -mretpoline flag ou com gcc e -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register flags. Isso parece mais geral do que R e específico para MacOS , então mudei o título de acordo. Eu suspeito que isso não pode 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 eu decidi instalar antes de R (porque R requer gfortran, que requer gcc, que requer MPFR , que vem com uma assinatura GPG que eu queria verificar). Eu segui as etapas para instalar o GPG no Git .

Últimas LLVM (com Homebrew)

O LLVM da Apple falha (veja abaixo), então eu usei o LLVM clang 6 para consertar isso e instalei com o homebrew (ele derrota um pouco o propósito de compilar a partir da fonte com flags específicos, mas eu estava ficando sem tempo). Eu instalei o homebrew com:

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

atualizou-o duas vezes com

brew update

Instalar o clang no Homebrew exigia o XCode, então eu instalei isso na App Store. Em seguida, segui os passos em esta página :

brew install --with-toolchain llvm

Em seguida, adicionei o sinal -mretpoline a ambos os C , adicionei o caminho aos compiladores C e C++ 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ópico com um comentário de janeiro de 2018 na parte inferior dizendo que o Mac ainda não é compatível com -mretpoline :

samkellett: @chandlerc is MacOS support omitted intentionally (ie. not implemented yet)? chandlerc: Not at all, I just don't have a Mac system to test with...

Não tem resposta desde então. Então, instalar com o LLVM falhou.

GCC (com Homebrew)

Outra alternativa foi compilar com gcc em vez de LLVM. Eu instalei a versão mais recente do clang (6.0) com

brew install gcc

Adicionei as sinalizações gcc de esta página , que são diferentes do LLVM. Esse script bash adiciona os sinalizadores a C e C++ , fornece os caminhos para os dois compiladores e chama os scripts de 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 de som similar com um sublinhado extra.

Portanto, gcc falhou também. E agora eu estou perdido.

Apêndice: LLVM da Apple

O seguinte script bash exporta os sinalizadores para make e chama os scripts de 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 que vem da 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'

O comentário de So @ seth está certo em como enviar sinalizadores para o compilador.

    
por 27.04.2018 / 12:07