
Ich besuchte einePräsentationzu Spectre und Meltdown von einem UCL-Professor. Er schlug mehrere Möglichkeiten vor, Spectre 2 (Branch Target Injection) abzuschwächen, indem man auf High Sierra aktualisiert und alle Software aus der Quelle mit dem Schalter --mretpoline installiert (bereits in LLVM und GCC bereitgestellt). Ich möchte R und RStudio auf diese Weise auf macOS High Sierra installieren. Ich habe die Quelle für beide heruntergeladen. Das Installationsverfahren ist für R und RStudio ähnlich. Die Datei INSTALL für R sagt, dass ich ausführen soll
./configure
make
Ich habe die Datei „configure“ und die Makefiles (Makeconf.in, Makefile.in, Makefile.in) überprüft. Ich habe keine offensichtliche Möglichkeit gefunden, den Schalter hinzuzufügen. Ich habe die Hilfe für Make aufgerufen, in der ebenfalls nicht erwähnt wird, wie man einen Schalter hinzufügt.
Ich habe online danach gesucht und das Nächstbeste, was ich finden konnte, waren Erklärungen zu Retpoline und Spectre 2.
Wie kann ich mit make Software aus dem Quellcode kompilieren und den Schalter --mretpoline einbinden?
Antwort1
Kurzfassung: Nach eingehender Untersuchung konnte ich auf MacOS weder mit llvm
dem -mretpoline
Flag und noch mit gcc
den -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register
Flags und Software aus der Quelle installieren. Dies scheint allgemeiner zu sein als R
und spezifisch für MacOS
, daher habe ich den Titel entsprechend geändert. Ich vermute, dass dies seit dem 27. April 2018 auf einem Mac nicht mehr möglich ist. Ich verwende macOS High Sierra Version 10.13.3 (17D102).
Lange Version: Folgendes gilt für GnuPG, das ich vor R installiert habe (weil R gfortran erfordert, das gcc erfordert, dasMPFR, das mit einer GPG-Signatur versehen ist, die ich überprüfen wollte). Ich folgte denSchritte zur Installation von GPG von Git.
Neuestes LLVM (mit Homebrew)
LLVM von Apple schlägt fehl (siehe unten), also habe ich LLVM clang 6 verwendet, um das Problem zu beheben, und ich habe es mit Homebrew installiert (das macht das Kompilieren aus dem Quellcode mit bestimmten Flags etwas zunichte, aber mir lief die Zeit davon). Ich habe Homebrew mit Folgendem installiert:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
dann zweimal aktualisiert mit
brew update
Die Installation von clang mit Homebrew erforderte XCode, also habe ich es aus dem App Store installiert. Dann folgte ich den Schritten unterdiese Seite:
brew install --with-toolchain llvm
Dann habe ich das -mretpoline
Flag zu beiden hinzugefügt, den Pfad zu beiden und den Compilern C
hinzugefügt und die Shell-Skripte von GPG aus aufgerufen:C
C++
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
Ich habe diesen Fehler erhalten:
checking whether the C compiler works... no
Die Protokolldatei config.log
enthält weitere Details:
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)
Dieser Threadmit einem Kommentar vom Januar 2018 unten, der besagt, dass Mac noch nicht unterstützt wird mit -mretpoline
:
samkellett: @chandlerc, wurde die MacOS-Unterstützung absichtlich weggelassen (d. h. noch nicht implementiert)? chandlerc: Überhaupt nicht, ich habe einfach kein Mac-System zum Testen ...
Seitdem gibt es keine Reaktion mehr. Die Installation mit LLVM ist also fehlgeschlagen.
GCC (mit Homebrew)
Eine andere Alternative war, mit anstelle von LLVM zu kompilieren gcc
. Ich habe die neueste Version von clang (6.0) mit installiert
brew install gcc
Und ich habe die gcc
Flaggen von hinzugefügtdiese Seite, die sich von LLVM unterscheiden. Dieses Bash-Skript fügt die Flags zu beiden C
und C++
hinzu, gibt die Pfade zu beiden Compilern an und ruft die Shell-Skripte von GPG aus auf:
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
und wieder erhalte ich die Fehlermeldung:
checking whether the C compiler works... no
Die Protokolldatei config.log
enthält weitere Details:
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 ist seltsam, dass der Compiler den ähnlich klingenden Namen mit einem zusätzlichen Unterstrich kennt.
Also gcc
auch gescheitert. Und jetzt bin ich ratlos.
Anhang: LLVM von Apple
Das folgende Bash-Skript exportiert die Flags für make
GnuPG und ruft die Shell-Skripte von GnuPG auf:
export CFLAGS='-mretpoline'
export CXXFLAGS=$CFLAGS
echo $CFLAGS
echo $CXXFLAGS
./autogen.sh
./configure --sysconfdir=/etc --enable-maintainer-mode && make
Es schlägt mit dem von Apple mitgelieferten Compiler fehl, zeigt aber, dass die Flags den Compiler erreichen:
configure:4045: gcc -mretpoline -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register conftest.c >&5
clang: error: unknown argument: '-mretpoline'
Der Kommentar von @seth zum Senden von Flags an den Compiler ist also richtig.