
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 llvm
y -mretpoline
flag o con gcc
and -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register
flags. Esto parece más general R
y 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 -mretpoline
bandera a ambos C
, agregué la ruta a ambos C
y 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.log
proporciona 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 gcc
LLVM en lugar de hacerlo. Instalé la última versión de clang (6.0) con
brew install gcc
Y agregué las gcc
banderas deesta página, que son diferentes de LLVM. Este script bash agrega los indicadores a ambos C
y 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.log
proporciona 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 gcc
también fracasé. Y ahora estoy perdido.
Apéndice: LLVM de Apple
El siguiente script bash exporta los indicadores make
y 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.