3+61+丨6165+|3+6123丨2是哪首歌?


13岁的叶家傻女,一朝重生!    坐拥万能神鼎,身怀灵植空间,她不再是人见人欺的废材弃女!    药毒无双,神医也要靠边站;灵兽求契约,不好意思,兽神都喊咱老大;    渣爹,敢抛妻弃女,她就让他家破人亡;世人,敢欺她辱她,她必百倍还之;    再世为人,她王者归来,岂料惹上了邪魅嗜血的他。    他明明是杀伐决断的鬼帝,却化身呆萌无害的敌国质子……    ~完本姐妹篇《神医狂妃:天才召唤师》、《天才魔妃》,欢迎跳坑~    ~大芙子的官方粉丝群:,2号群 ,新浪微博:大元气妞-MS芙子~(书屋小说(shu05.com)祝您阅读愉快)

     1.书屋小说网提供无弹窗阅读,让读者享受干净,清静的阅读环境,我们的口号——“书屋小说网真正的无弹窗小说网”
     2.读者在全文阅读中如发现内容有与法律抵触之处,请马上向本站举报。希望您多多支持本站,非常感谢您的支持!
     3.本小说《》是本好看的言情小说,但其内容仅代表作者MS芙子本人的观点,与书屋小说网 的立场无关。
     4.如果如果读者在阅读神医弃女时对作品内容、版权等方面有质疑,或对本站有意见建议请联系管理员处理。
     5.《{》是一本优秀小说,为了让作者MS芙子 能提供更多更好崭新的作品,请您购买本书的VIP或完本、全本、完结版实体小说及多多宣传本书和推荐,也是对作者的一种另种支持!小说的未来,是需要您我共同的努力!

}

基于4.19.190内核,高版本内核中或许有更新

内核 CONFIG_STACK_VALIDATION 选项启用objtool 在编译时运行。 它有一个“检查”子命令,分析每个 .o 文件并确保其堆栈元数据的有效性。
它对 asm 代码和 C 内联汇编代码强制执行一组规则,因此堆栈跟踪是可靠的。对于每个函数,它递归地遵循所有可能的代码路径和在每条指令中验证

它还遵循涉及特殊部分的代码路径,例如.altinstructions、__jump_table 和 __ex_table,可以添加给定指令(或一组指令)的替代执行路径。
同样,它知道如何遵循 switch 语句,因为其中 gcc 有时会使用跳转表。

以下是验证堆栈元数据的一些好处:

a) 为启用帧指针的内核提供更可靠的堆栈跟踪

c) 更高的实时补丁兼容率

为了实现验证,objtool 强制执行以下规则:

1. 每个可调用函数都必须使用 ELF 函数类型进行注解。 在 asm 代码中,这通常使用
ENTRY/ENDPROC 宏。 如果 objtool 在函数之外找到返回指令,它会标记一个错误,因为这通常表明应相应地注释可调用代码。
这个规则是必要的,以便objtool能够正确地识别每个可调用函数,以便分析其堆栈元数据。

2. 相反,每一段不能被调用的代码都不应该被注释为ELF函数。ENDPROC宏不应该在这种情况下使用。

3.每个调用另一个函数的可调用函数必须具有正确的帧指针逻辑,如果需要CONFIG_FRAME_POINTER或体系结构的回链规则。这可以通过FRAME_BEGIN/FRAME_END宏在asm代码中完成。

此规则确保基于帧指针的堆栈跟踪将按设计工作。 如果函数 A 在调用函数 B 之前没有创建堆栈帧,则函数 A 的_caller_ 将在堆栈追踪时被跳过。

4. 只有在以下情况下才允许动态跳转和跳转到未定义的符号:

b) 跳转匹配同级(兄弟)调用语义,并且帧指针具有与函数入口相同的值。

需要此规则,以便 objtool 可以可靠地分析所有函数的代码路径。 如果一个函数跳转到另一个文件中的代码,
而且不是同级(兄弟)调用,objtool没办法跟着跳转,因为它一次只分析一个文件。

5. 可调用函数可能不执行内核进入/退出指令。唯一需要此类指令的代码是内核入口代码,无论如何,它不应该在可调用函数中。

对于 C 文件,常见的罪魁祸首是内联 asm 语句和调用“noreturn”功能。 请参阅下面的更多细节。

以下是 objtool 报告的一些常见警告示例、它们的含义以及如何修复它们的建议。

在启用 CONFIG_FRAME_POINTER的情况下,func() 函数在执行一个函数调用时没有先保存和/或更新帧指针。

如果错误是针对 asm 文件,并且func()确实是可调用的函数,使用 FRAME_BEGIN和FRAME_END 宏添加适当的帧指针逻辑,
如果它不是可调用函数,除它的 ELF 函数注释通过将 ENDPROC 更改为 END来删,而不是使用 asm/unwind_hints.h 中的手动展开提示宏。

如果是 GCC 编译的 .c 文件,错误可能是因为函数使用具有“调用”指令的内联 asm() 语句。一个带有 call 指令的 asm() 语句必须其输出操作数中声明使用

否则堆栈帧可能不会在调用之前创建。

Objtool 找不到到达指令的代码路径。

如果错误是针对 asm 文件,并且指令在一个(或可从)可调用函数内部(到达),该函数应该被注释,使用 ENTRY/ENDPROC 宏(ENDPROC 是重要的)。
除此以外,代码可能应该使用asm/unwind_hints.h 中的展开提示宏进行注释,为了 objtool 和展开器可以知道与代码相关的堆栈状态。

如果您 100% 确定代码不会影响堆栈跟踪,或者如果您仅仅只是一个bad person,你可以告诉 objtool 忽略它。 见“添加例外”一节。

如果它实际上不在可调用函数中(例如内核入口代码),将 ENDPROC 更改为 END。

该文件是否在text部分中有数据? 如果是这样,那可能会混淆objtool的指令解码器。 将数据移动到更合适的位置,.data 或 .rodata 之类的部分。

这是一个内核进入/退出指令,如 sysenter 或 iret。这样的指令在可调用函数中不允许使用。并且很可能是内核入口代码的一部分。
它们通常不应具有可调用函数注释 (ENDPROC),并且应始终使用 asm/unwind_hints.h 中的展开提示宏进行注释。

这是动态跳转或跳转到未定义符号。 Objtool 假定它是同级调用并检测到帧指针没有首先恢复到其原始状态。
如果它不是真正的同级调用,您可能需要将目标代码移动到本地文件。

如果指令实际上不在可调用函数中(例如内核入口代码),将 ENDPROC 更改为 END 并手动注释

还要确保函数中没有其他代码接触帧指针。
另一种可能性是代码有一些汇编或内联汇编,它们对堆栈或帧指针做了一些不寻常的事情。在这种情况下,

这意味着 funcA() 不会以返回指令或无条件跳转结束,并且objtool已经确定该函数可以落入下一个函数。

如果你_真的_需要 objtool 来忽略某些东西,并且 100% 确定它不会影响内核堆栈跟踪,您可以告诉 objtool

- 要跳过文件验证,请添加

- 要跳过目录验证,请添加

}

我要回帖

更多关于 QW6165 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信