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 umftrace_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). Undftrace_stub()
befindet sich direkt unterhalb derftrace_graph_caller
so Modifikation oben bricht die Anweisung im Kernel resultierende oops auf dieftrace_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.
[Dieser Link gibt Ihnen, was Sie brauchen.] (Https://lkml.org/lkml/2016/5/18/326) – LPs
@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