在previous question上花了一些时间后,一个用户向我介绍了有关以下问题的电子邮件线程:
以下修补程序是解决此问题的一种方法:
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)
通过https://lkml.org/lkml/2016/5/16/493
我不明白将
GLOBAL(ftrace_stub)
替换为WEAK(ftrace_stub)
的影响是什么。补丁中的注释或GLOBAL()和WEAK()都没有帮助我理解为什么此解决方案有效。正如标题所示,我的问题是:将符号从.globl更改为.weak有什么后果?我希望得到一个考虑如何将
GLOBAL(ftrace_stub)
替换为WEAK(ftrace_stub)
的解决方案,以解决所引用的问题。 最佳答案
由于ftrace_stub
是在当前文件中定义的,因此汇编程序可以知道距离,并且可以使用范围有限的jmp
的较短版本。
如果将其更改为weak
,则意味着该符号可能无法解析为当前文件中的那个符号,因为其他模块可能会覆盖它。该潜在替代的偏移量未知,因此,汇编程序必须使用完整范围的jmp
,这是修补代码所期望的。
关于c - 将符号从.global更改为.weak有什么后果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37812507/