Android OpenGL ES 分析与实践(5)

来源:互联网 发布:如何测试网络稳定性 编辑:程序博客网 时间:2024/06/05 06:33

看一下load_driver中到底做了什么手脚。

1.首先调用dlopen打开动态链接库,返回值是void*,这个void*指向的是什么内容呢?追踪到bionic/linker/Dlfcn.c中。其中调用了find_library函数,这个函数是一个奇怪的函数,因为它虽然叫做find_library,在其实现中,不但在系统的so链表中去查找指定的文件名的动态链接库信息,而且对其动态链接库进行加载并返回。至此我们明白了,这个void*指向的是一个soinfo类型的结构体

这是man dlopen的说明。一个标准的linux函数。

The function dlopen() loads the dynamic library file named by the null-

       terminated  string  filename and  returns  an  opaque "handle" for the

       dynamic library.  If filename is NULL, then the returned handle is for

       the  main  program.  If  filename  contains  a slash ("/"), then it is

       interpreted as a  (relative  or  absolute)  pathname. 

 

 

2. 由上一步的分析,我们知道了egl_connection_t的第一个变量dso,是指向的一个soinfo结构体(discover/decompress shared

object的缩写???)

Printf("HAHA Let me print the so infomation\n");

    Printf("name=%s:phdr=%x:entry=%x:base=%x:size=%x\n",soi->name,soi->phdr,soi->entry,soi->base,soi->size);

这是上一条语句打印的一些信息。

name=libGLES_android.so:phdr=acc80034:entry=0:base=acc80000:size=1c000

 

3.dlsym可以根据dlopen的返回值,查找第二个参数指定的函数名的地址并返回

The  function dlsym() takes a "handle" of a dynamic library returned by

       dlopen() and the null-terminated symbol  name,  returning  the  address

       where  that  symbol is loaded into memory. If the symbol is not found,

       in the specified library or any of the libraries that  were  automati-

       cally  loaded by dlopen() when that library was loaded, dlsym() returns

       NULL.  (The search performed by dlsym() is breadth first  through  the

       dependency  tree  of these  libraries.)  Since the value of the symbol

       could actually be NULL (so that a NULL return from  dlsym()  need  not

       indicate  an  error), the  correct way to test for an error is to call

       dlerror() to clear any old error conditions,  then  call  dlsym(),  and

       then call dlerror() again, saving its return value into a variable, and

       check whether this saved value is not NULL.

 

 

getProcAddress = (getProcAddressType)dlsym(dso, "eglGetProcAddress");

        Printf("eglGetProcAddress's location is %x\n",getProcAddress);

打印信息如下,可以和刚才的打印信息比较一下。我们确实找到了一个函数。

eglGetProcAddress's location is acc930b1

 

Printf("curr=%x,it's address is %x\n",curr,f);

打印如下

eglGetProcAddress's location is acc930b1

*api=eglGetDisplay

curr=ac708a60,it's address is acc931a5

*api=eglInitialize

curr=ac708a64,it's address is acc93c9d

*api=eglTerminate

curr=ac708a68,it's address is acc93cdd

*api=eglGetConfigs

curr=ac708a6c,it's address is acc93d41

*api=eglChooseConfig

curr=ac708a70,it's address is acc9472d

*api=eglGetConfigAttrib

curr=ac708a74,it's address is acc94325

*api=eglCreateWindowSurface

curr=ac708a78,it's address is acc94689

*api=eglCreatePixmapSurface

curr=ac708a7c,it's address is acc945d5

*api=eglCreatePbufferSurface

curr=ac708a80,it's address is acc9451d

*api=eglDestroySurface

curr=ac708a84,it's address is acc93a1d

*api=eglQuerySurface

curr=ac708a88,it's address is acc94341

*api=eglCreateContext

curr=ac708a8c,it's address is acc9415d

*api=eglDestroyContext

curr=ac708a90,it's address is acc93d09

*api=eglMakeCurrent

curr=ac708a94,it's address is acc93a6d

*api=eglGetCurrentContext

curr=ac708a98,it's address is acc93055

*api=eglGetCurrentSurface

curr=ac708a9c,it's address is acc941a1

*api=eglGetCurrentDisplay

curr=ac708aa0,it's address is acc93061

*api=eglQueryContext

curr=ac708aa4,it's address is acc942ed

*api=eglWaitGL

curr=ac708aa8,it's address is acc9307d

*api=eglWaitNative

curr=ac708aac,it's address is acc93081

*api=eglSwapBuffers

curr=ac708ab0,it's address is acc93bf5

*api=eglCopyBuffers

curr=ac708ab4,it's address is acc93d71

*api=eglGetError

curr=ac708ab8,it's address is acc93125

*api=eglQueryString

curr=ac708abc,it's address is acc9373d

*api=eglGetProcAddress

curr=ac708ac0,it's address is acc930b1

*api=eglSurfaceAttrib

curr=ac708ac4,it's address is acc93d89

*api=eglBindTexImage

curr=ac708ac8,it's address is acc93da5

*api=eglReleaseTexImage

curr=ac708acc,it's address is acc93dc1

*api=eglSwapInterval

curr=ac708ad0,it's address is acc93ddd

*api=eglBindAPI

curr=ac708ad4,it's address is acc93df9

*api=eglQueryAPI

curr=ac708ad8,it's address is acc93085

*api=eglWaitClient

curr=ac708adc,it's address is acc930e5

*api=eglReleaseThread

curr=ac708ae0,it's address is acc9308d

*api=eglCreatePbufferFromClientBuffer

curr=ac708ae4,it's address is acc941e5

*api=eglLockSurfaceKHR

curr=ac708ae8,it's address is acc93091

*api=eglUnlockSurfaceKHR

curr=ac708aec,it's address is acc93095

*api=eglCreateImageKHR

curr=ac708af0,it's address is acc94201

*api=eglDestroyImageKHR

curr=ac708af4,it's address is acc93e15

*api=eglSetSwapRectangleANDROID

curr=ac708af8,it's address is acc93c51

*api=eglGetRenderBufferANDROID

curr=ac708afc,it's address is acc94125


原创粉丝点击