2016-06-14 25 views
7

Dopo aver trascorso qualche tempo su un previous question, un utente mi ha fatto conoscere un thread di posta elettronica per quanto riguarda la questione qui di seguito:Quali sono le conseguenze della modifica di un simbolo da .globl a .weak?

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

Sul mio sistema, è sufficiente abilitare e disabilitare la funzione grafico tracciante può Arresta il kernel. Non so come ha funzionato fino ad ora.

Il ftrace_disable_ftrace_graph_caller() modifica istruzione JMP a ftrace_graph_call supponendo che è un 5 byte vicino JMP (e9). Tuttavia è un breve jmp composto da solo 2 byte (eb). E ftrace_stub() si trova proprio sotto la ftrace_graph_caller modo modifica sopra rompe l'istruzione con conseguente kernel oops sul la ftrace_stub() con il codice operativo non valida come di seguito:

Una soluzione di questo problema è la seguente 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) 

via https://lkml.org/lkml/2016/5/16/493

non capisco che cosa l'effetto è in sostituzione di GLOBAL(ftrace_stub) con WEAK(ftrace_stub). Né il commento incluso nella patch né l'esame di GLOBAL() e WEAK() mi hanno aiutato a capire perché questa soluzione funziona.

La mia domanda, come suggerisce il titolo, è: Quali sono le conseguenze della modifica di un simbolo da .globl a .weak? Gradirei una risposta che consideri come la sostituzione di GLOBAL(ftrace_stub) a WEAK(ftrace_stub) potrebbe risolvere il problema segnalato.

+1

[Questo link ti fornisce quello che ti serve.] (Https://lkml.org/lkml/2016/5/18/326) – LPs

+0

@LPs "Dichiarare ftrace_stub come una chiamata debole impedisce al gas di utilizzare due salti di byte per esso "contiene parte di ciò che non capisco; vale a dire, in che modo dichiarare ftrace_stub come debole impedisce di usare due salti di byte? modifica: la risposta di Jester ha riempito il pezzo di informazione che mi mancava. – buratino

risposta

6

Poiché ftrace_stub è definito nel file corrente, l'assemblatore conosce la distanza e può utilizzare la versione più corta di jmp con intervallo limitato.

Se è stato modificato in weak, ciò significa che il simbolo potrebbe non risolversi con quello nel file corrente, poiché l'altro modulo potrebbe sovrascriverlo. L'offset rispetto a quel potenziale override non è noto, quindi l'assemblatore deve utilizzare l'intervallo completo jmp che è ciò che il codice di patching si aspetta.

Problemi correlati