¿Cómo instalar el software macOS desde la fuente para mitigar Spectre 2?

¿Cómo instalar el software macOS desde la fuente para mitigar Spectre 2?

asistí a unpresentaciónsobre Spectre y Meltdown por un profesor de la UCL. Sugirió varias formas de mitigar Spectre 2 (Inyección de destino de rama) actualizando a High Sierra e instalando todo el software desde la fuente con el conmutador --mretpoline (ya implementado en LLVM y GCC). Quiero instalar R y RStudio en macOS High Sierra de esta manera. Descargué la fuente de ambos. El procedimiento de instalación es similar para R y RStudio. El archivo INSTALL para R dice que debo ejecutar

./configure
make

Inspeccioné el archivo "configurar" y los archivos MAKE (Makeconf.in, Makefile.in, Makefile.in). No vi ninguna forma obvia de agregar el interruptor. Llamé a la ayuda para make, que tampoco menciona cómo agregar un interruptor.

Busqué esto en línea y lo más cercano que pude encontrar fueron explicaciones de retpoline y Spectre 2.

¿Cómo puedo compilar software desde el código fuente con make e incluir el modificador --mretpoline?

Respuesta1

Version corta: Después de mucha investigación, no pude instalar software en MacOS desde la fuente con llvmy -mretpolineflag o con gccand -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-registerflags. Esto parece más general Ry específico MacOS, por lo que cambié el título en consecuencia. Sospecho que esto no se puede hacer en una Mac a partir del 27 de abril de 2018. Estoy ejecutando macOS High Sierra versión 10.13.3 (17D102).

Versión larga: Lo siguiente se aplica a GnuPG, que decidí instalar antes de R (porque R requiere gfortran, que requiere gcc, que requiereMPFR, que viene con una firma GPG que quería verificar). Seguí elpasos para instalar GPG desde Git.

Último LLVM (con Homebrew)

LLVM de Apple falla (ver más abajo), así que usé LLVM clang 6 para solucionar este problema y lo instalé con homebrew (anula un poco el propósito de compilar desde el código fuente con indicadores específicos, pero se me estaba acabando el tiempo). Instalé homebrew con:

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

luego lo actualicé dos veces con

brew update

La instalación de clang con Homebrew requirió XCode, así que lo instalé desde la App Store. Luego seguí los pasos enesta página:

brew install --with-toolchain llvm

Luego agregué la -mretpolinebandera a ambos C, agregué la ruta a ambos Cy a C++los compiladores y llamé a los scripts de shell desde 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

Recibí este error:

checking whether the C compiler works... no

El archivo de registro config.logproporciona más detalles:

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 hilocon un comentario de enero de 2018 en la parte inferior que dice que Mac aún no es compatible con -mretpoline:

samkellett: @chandlerc, ¿se ha omitido intencionalmente la compatibilidad con MacOS (es decir, aún no se ha implementado)? chandlerc: En absoluto, simplemente no tengo un sistema Mac para probar...

Desde entonces no ha tenido respuesta. Entonces la instalación con LLVM falló.

GCC (con cerveza casera)

Otra alternativa era compilar con gccLLVM en lugar de hacerlo. Instalé la última versión de clang (6.0) con

brew install gcc

Y agregué las gccbanderas deesta página, que son diferentes de LLVM. Este script bash agrega los indicadores a ambos Cy C++, proporciona las rutas a ambos compiladores y llama a los scripts de shell desde 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

y nuevamente me sale el error:

checking whether the C compiler works... no

El archivo de registro config.logproporciona más detalles:

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

Es extraño que el compilador conozca el nombre que suena similar con un guión bajo adicional.

Así que gcctambién fracasé. Y ahora estoy perdido.

Apéndice: LLVM de Apple

El siguiente script bash exporta los indicadores makey llama a los scripts de shell desde GnuPG:

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

Falla con el compilador que viene desde Apple, pero muestra que las banderas están llegando al compilador:

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

Entonces, el comentario de @seth es correcto sobre cómo enviar indicadores al compilador.

información relacionada