打印
[ZLG-ARM]

链接函数表的问题.

[复制链接]
1820|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laserpic|  楼主 | 2012-2-6 22:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
table.h 文件中有:
/* tables.h
* Linker table helper macros.
* NetWatch system management mode administration console
*
* Copyright 2009, Google Inc.
* All rights reserved.
*...........
*/
typedef void (*thunk_t)(void);
typedef struct {
    thunk_t f;
    const char * name;
} initializer_t;

#define TABLE(typ, name) \
    const volatile typ name##_table[0] __attribute__((section(".table." #name ))); \
const volatile typ name##_table_end[0] __attribute__((section(".table." #name ".END")));

#define TABLE_LENGTH(name)    (name##_table_end - name##_table)

在main.c  中调用:(aa,bb均己定义的函数名)
TABLE(initializer_t, aa);
TABLE(initializer_t, bb);

for (i = 0; i < TABLE_LENGTH(aa); i++) {
        outputf("- %s()", aa_table[i].name);
        aa_table[i].f();
}
for (i = 0; i < TABLE_LENGTH(bb); i++) {
        outputf("- %s()", bb_table[i].name);
        bb_table[i].f();
}
这是从一个开源软件(基于GCC编译的)上看到的. 搞不明白,name##_table[0]中的name能像字符串那样用参数直接替代.
有朋友接触过这些吗.

相关帖子

沙发
laserpic|  楼主 | 2012-2-6 22:32 | 只看该作者
在链接文件里有(lpc1758.lds):
_table_start = .;
    *(SORT(.table.*));
    _table_end = .;

使用特权

评论回复
板凳
laserpic|  楼主 | 2012-2-8 15:31 | 只看该作者
怎么没有人来关注啊.

使用特权

评论回复
地板
xlhtracy| | 2012-2-8 15:53 | 只看该作者
帮顶一下 不太清楚

使用特权

评论回复
5
laserpic|  楼主 | 2012-2-8 16:17 | 只看该作者
作用应该是把函数指针在section.table下面排序, 初始化时顺序调用,而无需了解具体要调用多少个函数.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

187

帖子

0

粉丝