linux下实现C语言反射

1. 前言

JAVA里实现反射已经家常便饭了,而在C语言程序里还从未实现过,遇到了正好研究下,这里只贴下代码,这段代码是从网上摘来了,只不过进行了完善,保证可以正确编译。

2.代码

#include 
#include 
#include 
#include 
#include 

void test(int i)
{
    printf(" call test with i:%d\n", i);
}

int main(int argc, char** argv)
{
    Elf         *elf = NULL;
    Elf_Scn     *scn = NULL;
    GElf_Shdr   shdr;
    Elf_Data    *data = NULL;
    int fd, ii, count;

    void (*test_func)(int);

    elf_version(EV_CURRENT);
    fd = open(argv[0], O_RDONLY);
    elf = elf_begin(fd, ELF_C_READ, NULL);
    while((scn = elf_nextscn(elf, scn)) != NULL) {
        gelf_getshdr(scn, &shdr);
        if(shdr.sh_type == SHT_SYMTAB) {
            break;
        }
    }
    data = elf_getdata(scn, NULL);
    count = shdr.sh_size / shdr.sh_entsize;

    for(ii = 0; ii < count; ++ii) {
        GElf_Sym sym;
        gelf_getsym(data, ii, &sym);
        if(strcmp("test", elf_strptr(elf, shdr.sh_link, sym.st_name)))
            continue;
        test_func = (void (*)(int))(sym.st_value);
        test_func(255);
        break;
    }
    elf_end(elf);
    close(fd);

    return 0;
}

3. 编译运行

3.1 编译

gcc test.c -o test

3.2 运行

./test

3.3 输出

 call test with i:255

4. 小结

ACE也使用了此方法,此方法用来做些高扩展性的程序还是蛮方便的,为我们打开一个很好的思路。

你可能感兴趣的:(反射,c,elf)