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能像字符串那样用参数直接替代?
问题好二:在链接文件里section字段下面有(lds):
_table_start = .;
*(SORT(.table.*));
_table_end = .;
*(SORT(.table.*));这名的意思是将table下的东西排序吗? 原理是什么?
有朋友接触过这些吗. |