2016-06-14 6 views
7

Nachdem er einige Zeit auf einem previous question verbracht hatte, führte ein Benutzer mich über die unten Ausgabe an eine E-Mail-Thread:Welche Auswirkungen hat die Änderung eines Symbols von .globl auf .weak?

[PATCH] ftrace/x86: Fix function graph tracer reset path

Auf meinem System einfach aktivieren und Funktionsgraphen Tracer deaktivieren kann stürze den Kernel ab. Ich weiß nicht, wie es bisher funktioniert hat.

Die ftrace_disable_ftrace_graph_caller() ändert JMP-Anweisung um ftrace_graph_call unter der Annahme, es ist ein 5 Bytes in der Nähe von JMP (e9). Es ist jedoch ein kurzer Jmp, der nur aus 2 Bytes besteht (eb). Und ftrace_stub() befindet sich direkt unterhalb der ftrace_graph_caller so Modifikation oben bricht die Anweisung im Kernel resultierende oops auf die ftrace_stub() mit der ungültigen Opcode wie unten:

Eine Lösung für dieses Problem ist das folgende Patch:

diff --git a/arch/x86/kernel/mcount_64.S b/arch/x86/kernel/mcount_64.S 
index ed48a9f465f8..e13a695c3084 100644 
--- a/arch/x86/kernel/mcount_64.S 
+++ b/arch/x86/kernel/mcount_64.S 
@@ -182,7 +182,8 @@ GLOBAL(ftrace_graph_call) 
    jmp ftrace_stub 
    #endif 

-GLOBAL(ftrace_stub) 
+/* This is weak to keep gas from relaxing the jumps */ 
+WEAK(ftrace_stub) 
    retq 
    END(ftrace_caller) 

über https://lkml.org/lkml/2016/5/16/493

ich verstehe nicht, was Der Effekt besteht darin, GLOBAL(ftrace_stub) durch WEAK(ftrace_stub) zu ersetzen. Weder der Kommentar, der in dem Patch enthalten ist, noch der Blick in GLOBAL() und WEAK() haben mir geholfen zu verstehen, warum diese Lösung funktioniert.

Meine Frage, wie der Titel vorschlagen, ist: Was sind die Folgen der Änderung eines Symbols von .globl in .weak? Ich würde eine Antwort schätzen, die in Betracht zieht, wie das Ersetzen GLOBAL(ftrace_stub) zu WEAK(ftrace_stub) das referenzierte Problem adressieren könnte.

+1

[Dieser Link gibt Ihnen, was Sie brauchen.] (Https://lkml.org/lkml/2016/5/18/326) – LPs

+0

@LPs "Die Angabe von ftrace_stub als schwacher Aufruf verhindert, dass Gas zwei Byte-Sprünge zu es "enthält einen Teil dessen, was ich nicht verstehe; nämlich, wie verhindert das Deklarieren von ftrace_stub als schwach die Verwendung von Zwei-Byte-Sprüngen? edit: Jester's Antwort füllte die Information aus, die mir fehlte. – buratino

Antwort

6

Da ftrace_stub in der aktuellen Datei definiert ist, kennt der Assembler den Abstand und kann die kürzere Version von jmp verwenden, die nur eine begrenzte Reichweite hat.

Wenn es in weak geändert wird, bedeutet dies, dass das Symbol möglicherweise nicht in das in der aktuellen Datei aufgelöst wird, da andere Module es möglicherweise überschreiben. Der Offset zu dieser potentiellen Überschreibung ist nicht bekannt, daher muss der Assembler den vollen Bereich jmp verwenden, was der Patch-Code erwartet.