Wie installiere ich macOS-Software von der Quelle, um Spectre 2 abzuschwächen?

495
mmorin

Ich habe an einem Vortrag eines Professors der UCL über Spectre and Meltdown teilgenommen. Er schlug mehrere Möglichkeiten vor, um Spectre 2 (Branch Target Injection) durch ein Upgrade auf High Sierra abzuschwächen und die gesamte Software von der Quelle mit dem Schalter --mretpoline (bereits in LLVM und GCC bereitgestellt) zu installieren. Ich möchte R und RStudio auf diesem Weg auf macOS High Sierra installieren. Ich habe die Quelle für beide heruntergeladen. Der Installationsvorgang ist für R und RStudio ähnlich. Die Datei INSTALL for R sagt, dass ich laufen soll

./configure make 

Ich habe die "configure" -Datei und die Makefiles (Makeconf.in, Makefile.in, Makefile.in) untersucht. Ich habe keine offensichtliche Möglichkeit gesehen, den Schalter hinzuzufügen. Ich rief die Hilfe für make an, in der auch nicht erwähnt wird, wie ein Schalter hinzugefügt wird.

Ich suchte online nach diesem und am nächsten fand ich Erklärungen zu Retpoline und Spectre 2.

Wie kann ich Software mit make kompilieren und den Schalter --mretpoline hinzufügen?

2
Nur um Verwirrung zu vermeiden, gibt es auch eine SO-Frage (von Ihnen), die geschlossen wurde. [Here] (https://stackoverflow.com/questions/48523008/wie-nach-installationssoftware-mit-make-and-mretpoline). Möglicherweise ist auch die Option [Zusätzliche Variablen von der Befehlszeile an make] (https://stackoverflow.com/questions/2826029/passing-additional-variables-from-command-line-to-make) relevant. Seth vor 6 Jahren 0
Vielen Dank @Seth für den Link, um Verwirrung zu vermeiden und für den Tipp zum Weitergeben von Variablen. Das Übergeben von Variablen funktioniert, aber nicht das bestimmte Flag "-mretpoline". mmorin vor 6 Jahren 0

1 Antwort auf die Frage

2
mmorin

Kurzfassung : Nach vielen Untersuchungen konnte ich nicht zum Installieren von Software auf MacOS von der Quelle entweder mit llvmund -mretpolineFlagge oder mit gccund -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-registerFahnen. Dies scheint allgemeiner Rund spezifischer zu sein MacOS, daher habe ich den Titel entsprechend geändert. Ich vermute, dass dies ab dem 27. April 2018 nicht auf einem Mac 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 (da R gfortran benötigt, was gcc erfordert, was MPFR erfordert, das mit einer GPG-Signatur geliefert wird, die ich überprüfen wollte). Ich habe die Schritte befolgt , um GPG von Git zu installieren .

Neueste LLVM (mit Homebrew)

LLVM von Apple schlägt fehl (siehe unten), daher habe ich LLVM clang 6 verwendet, um dieses Problem zu beheben, und ich habe es mit Homebrew installiert (es beseitigt ein wenig den Zweck des Kompilierens aus der Quelle mit bestimmten Flags, aber ich hatte keine Zeit mehr). Ich habe Homebrew installiert mit:

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

dann zweimal mit aktualisiert

brew update 

Für die Installation von clang mit Homebrew war XCode erforderlich, also habe ich diesen aus dem App Store installiert. Dann folgte ich den Schritten auf dieser Seite :

brew install --with-toolchain llvm 

Dann fügte ich das -mretpolineFlag zu beiden Chinzu, ich fügte den Pfad zu beiden Cund zu C++Compilern hinzu und rief die Shellskripte von GPG an:

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.logenthä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 Thread mit einem Kommentar vom Januar 2018 am unteren Rand besagt, dass Mac noch nicht unterstützt wird mit -mretpoline:

samkellett: @chandlerc wird die Unterstützung von MacOS absichtlich weggelassen (dh noch nicht implementiert)? chandlerc: Überhaupt nicht, ich habe einfach kein Mac-System zum Testen ...

Es hat seitdem keine Antwort mehr. Die Installation mit LLVM ist daher fehlgeschlagen.

GCC (mit Homebrew)

Eine andere Alternative war das Kompilieren mit gccLLVM. Ich habe die neueste Version von Clang (6.0) mit installiert

brew install gcc 

Und ich habe die gccFlaggen von dieser Seite hinzugefügt, die sich von LLVM unterscheiden. Dieses Bash-Skript fügt die Flags beiden hinzu Cund C++gibt die Pfade zu beiden Compilern an und ruft die Shell-Skripte von GPG 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 bekomme ich den fehler:

checking whether the C compiler works... no 

Die Protokolldatei config.logenthä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 auch gccgescheitert. Und jetzt bin ich ratlos.

Anhang: LLVM von Apple

Das folgende Bash-Skript exportiert die Flags für makeGnuPG und ruft die Shell-Skripts 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 gelieferten Compiler fehl, aber es zeigt an, dass die Flags zum Compiler gelangen:

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

@ Seths Kommentar ist also richtig, um Flags an den Compiler zu senden.