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/

10-10 04:01