Android OpenGL ES 分析与实践(4)

本文深入探讨了Android驱动加载过程中涉及的关键概念,包括动态库的加载流程及重要结构体的作用,通过详细解释egl_connection_t结构体及其成员变量,揭示了Android驱动加载的实现细节。
【转】Android OpenGL ES 分析与实践(4) - huangchangzhuan - 我的博客

 


由我以上图表可以看出,加载驱动的时候,会尝试先从libGLES_android.so中加载EGL、GLESV1_CM、GLESV2三个部分的函数,如

 

果加载失败,则会尝试从libEGL_android.so,libGLESV1_cm.so,libGLESV2.so三个动态库中对应的函数。在这部分代码中,我们可以看到一个非常重要的结构体,egl_connection_t,

struct egl_connection_t

{

    void *              dso;

    gl_hooks_t *        hooks[2];

    EGLint              major;

    EGLint              minor;

    egl_t               egl;

};到处都有他的身影,对这几个变量进行一下解释。

 

 

struct soinfo

{

    const char name[SOINFO_NAME_LEN];

    Elf32_Phdr *phdr;

    int phnum;

    unsigned entry;

    unsigned base;

    unsigned size;

    // buddy-allocator index, negative for prelinked libraries

    int ba_index;

 

    unsigned *dynamic;

 

    unsigned wrprotect_start;

    unsigned wrprotect_end;

 

    soinfo *next;

    unsigned flags;

 

    const char *strtab;

    Elf32_Sym *symtab;

 

    unsigned nbucket;

    unsigned nchain;

    unsigned *bucket;

    unsigned *chain;

 

    unsigned *plt_got;

 

    Elf32_Rel *plt_rel;

    unsigned plt_rel_count;

 

    Elf32_Rel *rel;

    unsigned rel_count;

 

    unsigned *preinit_array;

    unsigned preinit_array_count;

 

    unsigned *init_array;

    unsigned init_array_count;

    unsigned *fini_array;

    unsigned fini_array_count;

 

    void (*init_func)(void);

    void (*fini_func)(void);

 

#ifdef ANDROID_ARM_LINKER

    /* ARM EABI section used for stack unwinding. */

    unsigned *ARM_exidx;

    unsigned ARM_exidx_count;

#endif

 

    unsigned refcount;

    struct link_map linkmap;

};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值