Home | History | Annotate | Download | only in deodexerant
      1 /*
      2  * Copyright 2011, Google Inc.
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are
      7  * met:
      8  *
      9  *     * Redistributions of source code must retain the above copyright
     10  * notice, this list of conditions and the following disclaimer.
     11  *     * Redistributions in binary form must reproduce the above
     12  * copyright notice, this list of conditions and the following disclaimer
     13  * in the documentation and/or other materials provided with the
     14  * distribution.
     15  *     * Neither the name of Google Inc. nor the names of its
     16  * contributors may be used to endorse or promote products derived from
     17  * this software without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 #include <stdio.h>
     33 #include <dlfcn.h>
     34 
     35 typedef struct InlineOperation {
     36     void *          func;
     37     const char*     classDescriptor;
     38     const char*     methodName;
     39     const char*     methodSignature;
     40 } InlineOperation;
     41 
     42 typedef const InlineOperation* (*dvmGetInlineOpsTablePtr)();
     43 typedef int (*dvmGetInlineOpsTableLengthPtr)();
     44 
     45 void main(int argc, char **argv) {
     46 	int i;
     47 
     48 	void *libdvm = dlopen("libdvm.so", RTLD_LAZY);
     49 
     50 	if (libdvm == NULL) {
     51 		printf("Failed to load libdvm: %s\n", dlerror());
     52 		return;
     53 	}
     54 
     55 	dvmGetInlineOpsTablePtr dvmGetInlineOpsTable = dlsym(libdvm, "dvmGetInlineOpsTable");
     56 
     57 	if (dvmGetInlineOpsTable == NULL) {
     58 		// clear the error, and retry with the c++ mangled name
     59 		dlerror();
     60 		dvmGetInlineOpsTable = dlsym(libdvm, "_Z20dvmGetInlineOpsTablev");
     61 	}
     62 
     63 	if (dvmGetInlineOpsTable == NULL) {
     64 		printf("Failed to load dvmGetInlineOpsTable: %s\n", dlerror());
     65 		dlclose(libdvm);
     66 		return;
     67 	}
     68 
     69 	dvmGetInlineOpsTableLengthPtr dvmGetInlineOpsTableLength = dlsym(libdvm, "dvmGetInlineOpsTableLength");
     70 
     71 	if (dvmGetInlineOpsTableLength == NULL) {
     72 		// clear the error, and retry with the c++ mangled name
     73 		dlerror();
     74 		dvmGetInlineOpsTableLength = dlsym(libdvm, "_Z26dvmGetInlineOpsTableLengthv");
     75 	}
     76 
     77 	if (dvmGetInlineOpsTableLength == NULL) {
     78 		printf("Failed to load dvmGetInlineOpsTableLength: %s\n", dlerror());
     79 		dlclose(libdvm);
     80 		return;
     81 	}
     82 
     83 	const InlineOperation *inlineTable = dvmGetInlineOpsTable();
     84 	int length = dvmGetInlineOpsTableLength();
     85 
     86 	for (i=0; i<length; i++) {
     87 		InlineOperation *item = &inlineTable[i];
     88 
     89 		printf("%s->%s%s\n", item->classDescriptor, item->methodName, item->methodSignature);
     90 	}
     91 
     92 	dlclose(libdvm);
     93 	return;
     94 }