c - 从 ARM (Keil uVIsion) 的 C 代码生成部分并获取开始和结束符号,并防止链接器删除它们
问题描述
我正在用 C 语言为 ARM 开发一个嵌入式项目。我想在代码中创建一个部分,在其中定义一些函数,然后一个init
函数将遍历它们以执行它们。就像是:
void f1(void) { ... } __section("some_section")
void f2(void) { ... } __section("some_section")
...
...
[In a different module]
typedef void (*funptr)(void);
void init_func(void) {
funptr iter = &__some_section_start;
do {
*iter();
iter++;
} while (iter <= &__some_section_end);
}
我知道可以通过修改项目链接描述文件来完成类似的事情,但我想知道是否可以在没有链接描述文件的情况下这样做。
我也尝试过,__attribute__((section("ARM.at.<address>")))
但这不起作用,因为这会使一个功能与另一个功能重叠。
另外,我尝试使用一个典型的__attribute__((section(...)))
反汇编生成的文件,看看Keil编译器是否生成了任何类型的符号来指示该部分的开始和结束。它不仅没有这样做,而且很多时候我在特定部分中创建的变量只是没有生成。我怀疑链接器正在剥离它,甚至使用volatile
and attribute(used)
(应该这样做)。如何防止链接器这样做?
解决方案
推荐阅读
- python - 为 and or 语句取零
- python - 在正文中为 http.client.HTTPConncetion.request 设置多个参数
- ruby-on-rails - 如何在 Ruby on Rails 6 中正确应用 has_many 关系和 order by
- django - Django 序列化程序与数据传输对象的使用
- javascript - 用 react-loadable 开玩笑:元素类型无效:对象。检查 `LoadableComponent` 的渲染方法
- c - 将两个 C 程序编译为仅一个二进制文件,第二个应从特定偏移量开始
- backend - 登录时未发送激活帐户电子邮件(Craft CMS)
- reactjs - React 中的树视图
- mysql - 如何从具有部分Json数组值并保留字符串值的mysql表的列中提取值
- javascript - 覆盖特定列单元格上的 css