|
发表于 2022-2-26 23:10:38
|
显示全部楼层
initcall0init$$Base, initcall0init$$Limit这类属于keil工具链的扩展语法。
对于sct文件里定义的一个段(segment), Keil会根据其属性自动生成name$$Base, name$$Limit, name$$ZI$$Limit等符号, 用来标记对应的数据段物理地址, 数据段数据长度, 数据段加载长度(如果该段具备load属性)。
这些符号是在sct文件里隐式定义的, c文件通过extern symbol的方式引用其地址, 获取感兴趣的段的加载信息。
Keil提供了很多有趣的扩展语法, 比如当你实现了带$sub$$和$supper$$前缀的符号, 外部模块对原始符号的引用,会被转化为对带有$sub$$前缀的符号的引用。而如果你想引用原始符号, 可以通过引用带$supper$$前缀的符号实现。 这个技巧可以劫持函数调用, 一种典型应用是插桩。
比如定义一组形如$sub$$main, $super$$main的函数, 可以实现对main函数调用控制流的劫持, 在调用原始main符号之前插入你自己的代码。
外部模块调用main -> $sub$$main -> $super$$main -> 原始的main
|
|