- 在默认的linux ld的连接脚本(ld --verbose)中,‘__bss_start = .;’前添加
cmd.lds
__my_cmd_start = .;
.my_cmd : { *(.my_cmd) }
__my_cmd_end = .;
- 在C语言中使用
#include <stdio.h>
#include <string.h>
#include <unistd.h>
typedef struct _cmd_table_ cmd_tbl_t;
struct _cmd_table_
{
char *name;
void (*func)(void);
};
extern cmd_tbl_t __my_cmd_start;
extern cmd_tbl_t __my_cmd_end;
#define struct_section __attribute__ ((unused,section (".my_cmd")))
#define cmd_register(name) \
cmd_tbl_t __my_cmd_##name struct_section = {#name,name}
void help(void)
{
printf("[%s] handle\n",__func__);
}
cmd_register(help);
int main(int argc, char *argv[])
{
int i=0;
int cmd_number = (&__my_cmd_end - &__my_cmd_start);
cmd_tbl_t *tmp = (cmd_tbl_t *)&__my_cmd_start;
int arg_len = 0;
if(2 != argc )
{
printf("argc is :%d\n",argc);
return -1;
}
arg_len = strlen(argv[1]);
printf("__my_cmd_start:/%p, __my_cmd_end:%p, sizeof(cmd_tbl_t):%d, cmd_number:%d, arg_len:%d\n",&__my_cmd_start, &__my_cmd_end,&__my_cmd_end - &__my_cmd_start,cmd_number,arg_len);
for(i=0;i<cmd_number;i++)
{
printf("[%d] %s\n",i,tmp[i].name);
if(0 == strncmp(argv[1],tmp[i].name,arg_len))
{
tmp[i].func();
}
}
return 0;
}
- 编译
gcc cmd.c -T cmd.lds