Dr.Deamon64 Git-Repository
(2014/03/01- Main-Repository: migrate from cvs)
リビジョン | f093259426af392ebfbfc30fddba32d1611480ab (tree) |
---|---|
日時 | 2018-10-15 21:37:45 |
作者 | Koine Yuusuke(koinec) <koinec@user...> |
コミッター | Koine Yuusuke(koinec) |
2018/10/15(Mon)
@@ -62,6 +62,8 @@ typedef struct { | ||
62 | 62 | #define LIBGOBLIN_API extern |
63 | 63 | #endif |
64 | 64 | LIBGOBLIN_API |
65 | + int LibGoblin_AnalyzeProgram( int i_pgid ); | |
66 | +LIBGOBLIN_API | |
65 | 67 | int LibGoblin_GetUnresolv_ObjectFilePath( int i_pgid, LibGoblin_ObjectFilePath *p_objpath ); |
66 | 68 | LIBGOBLIN_API |
67 | 69 | int LibGoblin_SetPathAndLoad_ObjectFilePath( LibGoblin_ObjectFilePath *p_objpath ); |
@@ -55,6 +55,7 @@ OBJS = drd64_libgoblin_api.o \ | ||
55 | 55 | drd64_libgoblin_readbin.o \ |
56 | 56 | drd64_libgoblin_loadprog.o \ |
57 | 57 | drd64_libgoblin_symwork.o \ |
58 | + drd64_libgoblin_objinfo.o \ | |
58 | 59 | drd64_libgoblin_addrinfo.o \ |
59 | 60 | drd64_libgoblin_section.o \ |
60 | 61 | drd64_libgoblin_elf.o \ |
@@ -79,6 +80,7 @@ HEADER = drd64_libgoblin.h \ | ||
79 | 80 | drd64_libgoblin_readbin.h \ |
80 | 81 | drd64_libgoblin_loadprog.h \ |
81 | 82 | drd64_libgoblin_symwork.h \ |
83 | + drd64_libgoblin_objinfo.h \ | |
82 | 84 | drd64_libgoblin_addrinfo.h \ |
83 | 85 | drd64_libgoblin_section.h \ |
84 | 86 | drd64_libgoblin_elf.h \ |
@@ -148,6 +150,9 @@ drd64_libgoblin_loadprog.o: drd64_libgoblin_loadprog.c $(HEADER) | ||
148 | 150 | drd64_libgoblin_symwork.o: drd64_libgoblin_symwork.c $(HEADER) |
149 | 151 | $(CC) -c -o drd64_libgoblin_symwork.o $(FLAGS_DEBUG) \ |
150 | 152 | drd64_libgoblin_symwork.c |
153 | +drd64_libgoblin_objinfo.o: drd64_libgoblin_objinfo.c $(HEADER) | |
154 | + $(CC) -c -o drd64_libgoblin_objinfo.o $(FLAGS_DEBUG) \ | |
155 | + drd64_libgoblin_objinfo.c | |
151 | 156 | drd64_libgoblin_addrinfo.o: drd64_libgoblin_addrinfo.c $(HEADER) |
152 | 157 | $(CC) -c -o drd64_libgoblin_addrinfo.o $(FLAGS_DEBUG) \ |
153 | 158 | drd64_libgoblin_addrinfo.c |
@@ -78,6 +78,7 @@ Comment: | ||
78 | 78 | #include"drd64_libgoblin_loadprog.h" |
79 | 79 | #include"drd64_libgoblin_symwork.h" |
80 | 80 | #include"drd64_libgoblin_section.h" |
81 | +#include"drd64_libgoblin_objinfo.h" | |
81 | 82 | #include"drd64_libgoblin_addrinfo.h" |
82 | 83 | #include"drd64_libgoblin_elf.h" |
83 | 84 | #include"drd64_libgoblin_elf_dynver.h" |
@@ -41,7 +41,7 @@ Comment: | ||
41 | 41 | /*---------------------------------------------------------------------- |
42 | 42 | ----------------------------------------------------------------------*/ |
43 | 43 | int |
44 | - LibGoblin_AddrInfo_Set_Symtab( | |
44 | + AddrInfo_Set_Symtab( | |
45 | 45 | LibGoblin_BinaryInfo *p_binfo, |
46 | 46 | LibGoblin_AddressInfo *p_addr, |
47 | 47 | LibGoblin_SymbolWorkInfo *p_syminfo ) |
@@ -105,7 +105,7 @@ int | ||
105 | 105 | /*---------------------------------------------------------------------- |
106 | 106 | ----------------------------------------------------------------------*/ |
107 | 107 | int |
108 | - LibGoblin_AddrInfo_Move_AddrInfo( | |
108 | + AddrInfo_Move_AddrInfo( | |
109 | 109 | LibGoblin_BinaryInfo *p_binfo, |
110 | 110 | LibGoblin_AddressInfo *p_addr, |
111 | 111 | LibGoblin_SymbolWorkInfo *p_syminfo ) |
@@ -135,7 +135,7 @@ int | ||
135 | 135 | ----------------------------------------------------------------------*/ |
136 | 136 | LIBGOBLIN_ADDRINFO_EXTERN |
137 | 137 | int |
138 | - LibGoblin_AddrInfo_SyncSymbolWorkTable( | |
138 | + AddrInfo_SyncSymbolWorkTable( | |
139 | 139 | LibGoblin_BinaryInfo *p_binfo, |
140 | 140 | LibGoblin_SymbolWorkTable *p_symworktbl ) |
141 | 141 | { |
@@ -172,7 +172,7 @@ int | ||
172 | 172 | p_syminfo = p_symworktbl->p_symwork + (p_symworktbl->dw_max_symwork - 1); |
173 | 173 | for( dw_cnt = p_symworktbl->dw_max_symwork; dw_cnt > 0; dw_cnt--, p_syminfo--, p_addr-- ) { |
174 | 174 | if( LIBGOBLIN_SYMWORKINFO_TYPE_SYMTAB == GET_SYMWORKINFO_TYPE(p_syminfo->dw_type) ) { |
175 | - i_result = LibGoblin_AddrInfo_Set_Symtab( p_binfo, p_addr, p_syminfo ); | |
175 | + i_result = AddrInfo_Set_Symtab( p_binfo, p_addr, p_syminfo ); | |
176 | 176 | } |
177 | 177 | else if( LIBGOBLIN_SYMWORKINFO_TYPE_DWARF |
178 | 178 | == GET_SYMWORKINFO_TYPE(p_syminfo->dw_type) ) { |
@@ -180,7 +180,7 @@ int | ||
180 | 180 | } |
181 | 181 | else if( LIBGOBLIN_SYMWORKINFO_TYPE_ADDRTBL |
182 | 182 | == GET_SYMWORKINFO_TYPE(p_syminfo->dw_type) ) { |
183 | - i_result = LibGoblin_AddrInfo_Move_AddrInfo( p_binfo, p_addr, p_syminfo ); | |
183 | + i_result = AddrInfo_Move_AddrInfo( p_binfo, p_addr, p_syminfo ); | |
184 | 184 | } |
185 | 185 | } |
186 | 186 |
@@ -194,7 +194,7 @@ int | ||
194 | 194 | ----------------------------------------------------------------------*/ |
195 | 195 | LIBGOBLIN_ADDRINFO_EXTERN |
196 | 196 | int |
197 | - LibGoblin_AddrInfo_AllocAddrInfo( | |
197 | + AddrInfo_AllocAddrInfo( | |
198 | 198 | LibGoblin_BinaryInfo *p_binfo, |
199 | 199 | DWord dw_initsymbols ) |
200 | 200 | { |
@@ -227,7 +227,7 @@ int | ||
227 | 227 | ----------------------------------------------------------------------*/ |
228 | 228 | LIBGOBLIN_ADDRINFO_EXTERN |
229 | 229 | int |
230 | - LibGoblin_AddrInfo_FreeAddrInfo( | |
230 | + AddrInfo_FreeAddrInfo( | |
231 | 231 | LibGoblin_BinaryInfo *p_binfo ) |
232 | 232 | { |
233 | 233 | assert( NULL != p_binfo ); |
@@ -54,12 +54,12 @@ Comment: | ||
54 | 54 | #define LIBGOBLIN_CalcAddrInfoAllocs(m) ((((m) / LIBGOBLIN_ADDRINFO_ALLOC_UNITS) + 2) * LIBGOBLIN_ADDRINFO_ALLOC_UNITS) |
55 | 55 | |
56 | 56 | LIBGOBLIN_ADDRINFO_EXTERN |
57 | - int LibGoblin_AddrInfo_SyncSymbolWorkTable( | |
57 | + int AddrInfo_SyncSymbolWorkTable( | |
58 | 58 | LibGoblin_BinaryInfo *p_binfo, LibGoblin_SymbolWorkTable *p_symworktbl ); |
59 | 59 | LIBGOBLIN_ADDRINFO_EXTERN |
60 | - int LibGoblin_AddrInfo_AllocAddrInfo( LibGoblin_BinaryInfo *p_binfo, DWord dw_initsymbols ); | |
60 | + int AddrInfo_AllocAddrInfo( LibGoblin_BinaryInfo *p_binfo, DWord dw_initsymbols ); | |
61 | 61 | LIBGOBLIN_ADDRINFO_EXTERN |
62 | - int LibGoblin_AddrInfo_FreeAddrInfo( LibGoblin_BinaryInfo *p_binfo ); | |
62 | + int AddrInfo_FreeAddrInfo( LibGoblin_BinaryInfo *p_binfo ); | |
63 | 63 | |
64 | 64 | |
65 | 65 | #endif /* DRD64_HEADER_XXX */ |
@@ -42,6 +42,30 @@ Comment: | ||
42 | 42 | ***********************************************************************/ |
43 | 43 | LIBGOBLIN_API |
44 | 44 | int |
45 | + LibGoblin_AnalyzeProgram( | |
46 | + int i_pgid ) | |
47 | +{ | |
48 | + int i_result; | |
49 | + LibGoblin_ProgramInfo *p_pginfo; | |
50 | + | |
51 | + p_pginfo = ProgInfo_GetProgInfo( i_pgid ); | |
52 | + if( NULL == p_pginfo ) { | |
53 | + return -0x01; | |
54 | + } | |
55 | + | |
56 | + i_result = ELF_ReadELF_Phase2( p_pginfo->p_binfo[LIBGOBLIN_BINFO_FILE_EXEC] ); | |
57 | + if( 0x00 != i_result ) { | |
58 | + return -0x02; | |
59 | + } | |
60 | + | |
61 | + return i_result; | |
62 | +} | |
63 | + | |
64 | + | |
65 | +/*********************************************************************** | |
66 | +***********************************************************************/ | |
67 | +LIBGOBLIN_API | |
68 | +int | |
45 | 69 | LibGoblin_GetUnresolv_ObjectFilePath( |
46 | 70 | int i_pgid, |
47 | 71 | LibGoblin_ObjectFilePath *p_objpath ) |
@@ -389,7 +389,7 @@ int | ||
389 | 389 | |
390 | 390 | if( NULL == p_binfo ) { return 0x01; } |
391 | 391 | |
392 | - i_result = LibGoblin_AddrInfo_FreeAddrInfo( p_binfo ); | |
392 | + i_result = AddrInfo_FreeAddrInfo( p_binfo ); | |
393 | 393 | if( 0x00 != i_result ) { |
394 | 394 | return -0x02; |
395 | 395 | } |
@@ -50,7 +50,7 @@ int | ||
50 | 50 | assert( NULL != p_bin ); |
51 | 51 | |
52 | 52 | /* Get .debug_abbrev section Info */ |
53 | - pb_data_abbrev = LibGoblin_Elf_GetSection( | |
53 | + pb_data_abbrev = ELF_GetSection( | |
54 | 54 | &qw_size_abbrev, p_bin, |
55 | 55 | LIBGOBLIN_SECTION_ID_DEBUG_ABBREV ); |
56 | 56 | if( NULL == pb_data_abbrev ) { return 0x00; } |
@@ -136,7 +136,7 @@ int | ||
136 | 136 | assert( NULL != p_dwarf ); |
137 | 137 | |
138 | 138 | /* Get .debug_abbrev section Info */ |
139 | - pb_data = LibGoblin_Elf_GetSection( | |
139 | + pb_data = ELF_GetSection( | |
140 | 140 | &qw_size_abbrev, p_bin, |
141 | 141 | LIBGOBLIN_SECTION_ID_DEBUG_ABBREV ); |
142 | 142 | if( NULL == pb_data ) { return 0x01; } |
@@ -221,7 +221,7 @@ int | ||
221 | 221 | assert( NULL != p_src ); |
222 | 222 | |
223 | 223 | /* Get .debug_abbrev section Info */ |
224 | - pb_data = LibGoblin_Elf_GetSection( | |
224 | + pb_data = ELF_GetSection( | |
225 | 225 | &qw_size_abbrev, p_bin, |
226 | 226 | LIBGOBLIN_SECTION_ID_DEBUG_ABBREV ); |
227 | 227 | if( NULL == pb_data ) { return 0x01; } |
@@ -492,7 +492,7 @@ int | ||
492 | 492 | assert( NULL != p_src ); |
493 | 493 | |
494 | 494 | /* Get .debug_abbrev section Info */ |
495 | - pb_data = LibGoblin_Elf_GetSection( | |
495 | + pb_data = ELF_GetSection( | |
496 | 496 | &qw_size_info, p_bin, |
497 | 497 | LIBGOBLIN_SECTION_ID_DEBUG_INFO ); |
498 | 498 | if( NULL == pb_data ) { return 0x01; } |
@@ -653,7 +653,7 @@ int | ||
653 | 653 | assert( NULL != p_src ); |
654 | 654 | |
655 | 655 | /* Get .debug_abbrev section Info */ |
656 | - pb_data = LibGoblin_Elf_GetSection( | |
656 | + pb_data = ELF_GetSection( | |
657 | 657 | &qw_size, p_bin, |
658 | 658 | LIBGOBLIN_SECTION_ID_DEBUG_LINE ); |
659 | 659 | if( NULL == pb_data ) { return 0x01; } |
@@ -42,7 +42,7 @@ Comment: | ||
42 | 42 | ----------------------------------------------------------------------*/ |
43 | 43 | LIBGOBLIN_ELF_EXTERN |
44 | 44 | int |
45 | - LibGoblin_IsElf( | |
45 | + ELF_IsElf( | |
46 | 46 | Byte *p_data ) |
47 | 47 | { |
48 | 48 |
@@ -62,7 +62,7 @@ Will Deprecate Functions!!! - Not Use! | ||
62 | 62 | ----------------------------------------------------------------------*/ |
63 | 63 | LIBGOBLIN_ELF_EXTERN |
64 | 64 | Byte * |
65 | - LibGoblin_Elf_GetSection( | |
65 | + ELF_GetSection( | |
66 | 66 | QWord *qw_secsize, |
67 | 67 | LibGoblin_BinaryInfo *p_binfo, |
68 | 68 | Byte b_secid ) |
@@ -94,7 +94,7 @@ Byte * | ||
94 | 94 | ----------------------------------------------------------------------*/ |
95 | 95 | LIBGOBLIN_ELF_EXTERN |
96 | 96 | int |
97 | - LibGoblin_Elf_ReadELF_Phase1( | |
97 | + ELF_ReadELF_Phase1( | |
98 | 98 | LibGoblin_BinaryInfo *p_binfo ) |
99 | 99 | { |
100 | 100 | int i_result = 0x00; |
@@ -131,7 +131,7 @@ int | ||
131 | 131 | ----------------------------------------------------------------------*/ |
132 | 132 | LIBGOBLIN_ELF_EXTERN |
133 | 133 | int |
134 | - LibGoblin_Elf_ReadELF_Phase2( | |
134 | + ELF_ReadELF_Phase2( | |
135 | 135 | LibGoblin_BinaryInfo *p_binfo ) |
136 | 136 | { |
137 | 137 | int i_result; |
@@ -151,14 +151,14 @@ int | ||
151 | 151 | return i_result; |
152 | 152 | } |
153 | 153 | |
154 | - i_result = LibGoblin_AddrInfo_AllocAddrInfo( p_binfo, t_symwork.dw_max_symwork ); | |
154 | + i_result = AddrInfo_AllocAddrInfo( p_binfo, t_symwork.dw_max_symwork ); | |
155 | 155 | if( 0x00 != i_result ) { |
156 | 156 | return i_result; |
157 | 157 | } |
158 | 158 | |
159 | 159 | LibGoblin_Debug_SymWork_PrintWorkTable( &t_symwork, 0x02 ); |
160 | 160 | |
161 | - i_result = LibGoblin_AddrInfo_SyncSymbolWorkTable( p_binfo, &t_symwork ); | |
161 | + i_result = AddrInfo_SyncSymbolWorkTable( p_binfo, &t_symwork ); | |
162 | 162 | if( 0x00 != i_result ) { |
163 | 163 | return i_result; |
164 | 164 | } |
@@ -47,14 +47,14 @@ Comment: | ||
47 | 47 | |
48 | 48 | |
49 | 49 | LIBGOBLIN_ELF_EXTERN |
50 | - int LibGoblin_IsElf( Byte *p_data ); | |
50 | + int ELF_IsElf( Byte *p_data ); | |
51 | 51 | LIBGOBLIN_ELF_EXTERN |
52 | - Byte *LibGoblin_Elf_GetSection( | |
52 | + Byte *ELF_GetSection( | |
53 | 53 | QWord *qw_secsize, LibGoblin_BinaryInfo *p_bin, Byte b_secid ); |
54 | 54 | LIBGOBLIN_ELF_EXTERN |
55 | - int LibGoblin_Elf_ReadELF_Phase1( LibGoblin_BinaryInfo *p_binfo ); | |
55 | + int ELF_ReadELF_Phase1( LibGoblin_BinaryInfo *p_binfo ); | |
56 | 56 | LIBGOBLIN_ELF_EXTERN |
57 | - int LibGoblin_Elf_ReadELF_Phase2( LibGoblin_BinaryInfo *p_binfo ); | |
57 | + int ELF_ReadELF_Phase2( LibGoblin_BinaryInfo *p_binfo ); | |
58 | 58 | |
59 | 59 | |
60 | 60 | #endif /* DRD64_HEADER_LIBGOBLIN_BINFO */ |
@@ -60,7 +60,7 @@ int | ||
60 | 60 | return -0x04; |
61 | 61 | } |
62 | 62 | |
63 | - i_result = LibGoblin_Elf_ReadELF_Phase1( p_binfo ); | |
63 | + i_result = ELF_ReadELF_Phase1( p_binfo ); | |
64 | 64 | if( 0x00 != i_result ) { |
65 | 65 | return -0x05; |
66 | 66 | } |
@@ -105,6 +105,9 @@ int | ||
105 | 105 | } |
106 | 106 | |
107 | 107 | i_result = LoadProg_LoadBinaryInfo( p_binfo ); |
108 | + if( 0x00 != i_result ) { | |
109 | + return -0x03; | |
110 | + } | |
108 | 111 | |
109 | 112 | return i_result; |
110 | 113 | } |
@@ -0,0 +1,240 @@ | ||
1 | +/*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64 | |
2 | + | |
3 | + D r . D e a m o n 6 4 | |
4 | + for INTEL64(R), AMD64(R) | |
5 | + | |
6 | + Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved. | |
7 | + | |
8 | +Redistribution and use in source and binary forms, with or without | |
9 | +modification, are permitted provided that the following conditions are met: | |
10 | + | |
11 | + 1. Redistributions of source code must retain the above copyright notice, | |
12 | + this list of conditions and the following disclaimer. | |
13 | + 2. Redistributions in binary form must reproduce the above copyright | |
14 | + notice, this list of conditions and the following disclaimer in the | |
15 | + documentation and/or other materials provided with the distribution. | |
16 | + | |
17 | +THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY | |
18 | +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
19 | +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
20 | +DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE | |
21 | +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
22 | +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
23 | +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
24 | +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
25 | +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
26 | +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | |
27 | +OF THE POSSIBILITY OF SUCH DAMAGE. | |
28 | + | |
29 | +DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/ | |
30 | + | |
31 | +/* File Info ----------------------------------------------------------- | |
32 | +File: drd64_.c | |
33 | +Function: | |
34 | +Comment: | |
35 | +----------------------------------------------------------------------*/ | |
36 | + | |
37 | +#define DRD64_SRC_LIBGOBLIN_OBJINFO | |
38 | +#include"drd64_libgoblin.h" | |
39 | + | |
40 | + | |
41 | +/*---------------------------------------------------------------------- | |
42 | +----------------------------------------------------------------------*/ | |
43 | +LIBGOBLIN_OBJINFO_EXTERN | |
44 | +LibGoblin_ObjectInfo * | |
45 | + ObjectInfo_GetObjectInfo( | |
46 | + LibGoblin_ProgramInfo *p_pginfo, | |
47 | + int i_oid ) | |
48 | +{ | |
49 | + assert( NULL != p_pginfo ); | |
50 | + | |
51 | + if(( p_pginfo->i_max_objinfo <= i_oid ) || ( 0 > i_oid )) | |
52 | + { return NULL; } | |
53 | + | |
54 | + return OBJINFO(p_pginfo, i_oid); | |
55 | +} | |
56 | + | |
57 | + | |
58 | +/*---------------------------------------------------------------------- | |
59 | +----------------------------------------------------------------------*/ | |
60 | +void | |
61 | + ObjectInfo_ClearObjectInfo( | |
62 | + LibGoblin_ObjectInfo *p_objinfo ) | |
63 | +{ | |
64 | + assert( NULL != p_objinfo ); | |
65 | + | |
66 | + memset( p_objinfo, 0x00, sizeof( LibGoblin_ObjectInfo ) ); | |
67 | + | |
68 | + p_objinfo->i_id = -0x01; | |
69 | + | |
70 | + return; | |
71 | +} | |
72 | + | |
73 | + | |
74 | +/*---------------------------------------------------------------------- | |
75 | +----------------------------------------------------------------------*/ | |
76 | +LIBGOBLIN_OBJINFO_EXTERN | |
77 | +LibGoblin_ObjectInfo * | |
78 | + ObjectInfo_AllocObjectInfo( | |
79 | + LibGoblin_ProgramInfo *p_pginfo ) | |
80 | +{ | |
81 | + int i_cnt; | |
82 | + int i_id_now; | |
83 | + LibGoblin_ObjectInfo *p_objinfo_base; | |
84 | + LibGoblin_ObjectInfo *p_objinfo_now; | |
85 | + | |
86 | + assert( NULL != p_pginfo ); | |
87 | + | |
88 | + p_objinfo_now = NULL; | |
89 | + i_id_now = -1; | |
90 | + | |
91 | + // Search Non-used ObjectInfo --- | |
92 | + if( p_pginfo->i_now_objinfo < p_pginfo->i_max_objinfo ) { | |
93 | + for( i_cnt = 0; i_cnt < p_pginfo->i_max_objinfo; i_cnt++ ) { | |
94 | + | |
95 | + if( -1 == OBJINFO(p_pginfo, i_cnt)->i_id ) { | |
96 | + p_objinfo_now = OBJINFO(p_pginfo, i_cnt); | |
97 | + i_id_now = i_cnt; | |
98 | + p_pginfo->i_now_objinfo++; | |
99 | + break; | |
100 | + } | |
101 | + } | |
102 | + } | |
103 | + else if( p_pginfo->i_now_objinfo == p_pginfo->i_alloc_objinfo ) { | |
104 | + | |
105 | + p_objinfo_base = realloc( p_pginfo->p_objinfo, | |
106 | + sizeof( LibGoblin_ObjectInfo ) * | |
107 | + (p_pginfo->i_alloc_objinfo + LIBGOBLIN_OBJINFO_UNITS) ); | |
108 | + if( NULL == p_objinfo_base ) { | |
109 | + return NULL; | |
110 | + } | |
111 | + | |
112 | + for( i_cnt = p_pginfo->i_alloc_objinfo; | |
113 | + i_cnt < (p_pginfo->i_alloc_objinfo + LIBGOBLIN_OBJINFO_UNITS); i_cnt++ ) { | |
114 | + ObjectInfo_ClearObjectInfo( p_objinfo_base + i_cnt ); | |
115 | + } | |
116 | + | |
117 | + p_pginfo->p_objinfo = p_objinfo_base; | |
118 | + p_pginfo->i_alloc_objinfo += LIBGOBLIN_OBJINFO_UNITS; | |
119 | + | |
120 | + p_objinfo_now = OBJINFO(p_pginfo, p_pginfo->i_now_objinfo); | |
121 | + i_id_now = p_pginfo->i_now_objinfo++; | |
122 | + | |
123 | + if( i_id_now == p_pginfo->i_max_objinfo ) | |
124 | + { p_pginfo->i_max_objinfo++; } | |
125 | + } | |
126 | + else { | |
127 | + p_objinfo_now = OBJINFO(p_pginfo, p_pginfo->i_now_objinfo); | |
128 | + i_id_now = p_pginfo->i_now_objinfo++; | |
129 | + | |
130 | + if( i_id_now == p_pginfo->i_max_objinfo ) | |
131 | + { p_pginfo->i_max_objinfo++; } | |
132 | + } | |
133 | + | |
134 | + assert( NULL != p_objinfo_now ); | |
135 | + | |
136 | + ObjectInfo_ClearObjectInfo( p_objinfo_now ); | |
137 | + p_objinfo_now->i_id = i_id_now; | |
138 | + | |
139 | + return p_objinfo_now; | |
140 | +} | |
141 | + | |
142 | + | |
143 | +/*---------------------------------------------------------------------- | |
144 | +----------------------------------------------------------------------*/ | |
145 | +LIBGOBLIN_OBJINFO_EXTERN | |
146 | +int | |
147 | + ObjectInfo_FreeObjectInfo( | |
148 | + LibGoblin_ProgramInfo *p_pginfo, | |
149 | + LibGoblin_ObjectInfo *p_objinfo ) | |
150 | +{ | |
151 | + int i_objid; | |
152 | + | |
153 | + assert( NULL != p_pginfo ); | |
154 | + | |
155 | + if( NULL == p_objinfo ) { return 0x01; } | |
156 | + | |
157 | + i_objid = p_objinfo->i_id; | |
158 | + ObjectInfo_ClearObjectInfo( p_objinfo ); | |
159 | + | |
160 | + if( p_pginfo->i_max_objinfo == (i_objid + 1) ) | |
161 | + { p_pginfo->i_max_objinfo--; } | |
162 | + p_pginfo->i_now_objinfo--; | |
163 | + if( 0 == p_pginfo->i_now_objinfo ) | |
164 | + { p_pginfo->i_max_objinfo = 0; } | |
165 | + | |
166 | + return 0x00; | |
167 | +} | |
168 | + | |
169 | + | |
170 | +/*---------------------------------------------------------------------- | |
171 | +----------------------------------------------------------------------*/ | |
172 | +LIBGOBLIN_OBJINFO_EXTERN | |
173 | +int | |
174 | + ObjectInfo_Init( | |
175 | + LibGoblin_ProgramInfo *p_pginfo, | |
176 | + int i_init_objnums ) | |
177 | +{ | |
178 | + int i_cnt; | |
179 | + int i_items; | |
180 | + LibGoblin_ObjectInfo *p_objinfo; | |
181 | + | |
182 | + assert( NULL != p_pginfo ); | |
183 | + | |
184 | + if( 0 != p_pginfo->i_max_objinfo ) { | |
185 | + return -0x01; | |
186 | + } | |
187 | + | |
188 | + if( 0 == i_init_objnums ) | |
189 | + { i_items = LIBGOBLIN_OBJINFO_UNITS * LIBGOBLIN_OBJINFO_INITALLOCRATE; } | |
190 | + else | |
191 | + { i_items = (( i_init_objnums / LIBGOBLIN_OBJINFO_UNITS ) + 2) * LIBGOBLIN_OBJINFO_UNITS; } | |
192 | + | |
193 | + p_pginfo->p_objinfo = malloc( sizeof( LibGoblin_ObjectInfo ) * i_items ); | |
194 | + if( NULL == p_pginfo->p_objinfo ) { | |
195 | + return -0x02; | |
196 | + } | |
197 | + | |
198 | + for( i_cnt = 0; i_cnt < LIBGOBLIN_OBJINFO_UNITS; i_cnt++ ) { | |
199 | + p_objinfo = OBJINFO(p_pginfo, i_cnt); | |
200 | + ObjectInfo_ClearObjectInfo( p_objinfo ); | |
201 | + } | |
202 | + | |
203 | + p_pginfo->i_alloc_objinfo = LIBGOBLIN_OBJINFO_UNITS; | |
204 | + p_pginfo->i_max_objinfo = 0; | |
205 | + p_pginfo->i_now_objinfo = 0; | |
206 | + | |
207 | + return 0x00; | |
208 | +} | |
209 | + | |
210 | + | |
211 | +/*---------------------------------------------------------------------- | |
212 | +----------------------------------------------------------------------*/ | |
213 | +LIBGOBLIN_OBJINFO_EXTERN | |
214 | +int | |
215 | + ObjectInfo_Term( | |
216 | + LibGoblin_ProgramInfo *p_pginfo ) | |
217 | +{ | |
218 | + LibGoblin_ObjectInfo *p_objinfo; | |
219 | + | |
220 | + assert( NULL != p_pginfo ); | |
221 | + | |
222 | + if( 0 < p_pginfo->i_now_objinfo ) { | |
223 | + for( ; p_pginfo->i_now_objinfo >= 0; p_pginfo->i_now_objinfo-- ) { | |
224 | + p_objinfo = OBJINFO(p_pginfo, p_pginfo->i_now_objinfo); | |
225 | + ObjectInfo_FreeObjectInfo( p_pginfo, p_objinfo ); | |
226 | + } | |
227 | + } | |
228 | + | |
229 | + free( p_pginfo->p_objinfo ); | |
230 | + | |
231 | + p_pginfo->p_objinfo = NULL; | |
232 | + p_pginfo->i_alloc_objinfo = 0; | |
233 | + p_pginfo->i_max_objinfo = 0; | |
234 | + p_pginfo->i_now_objinfo = 0; | |
235 | + | |
236 | + return 0x00; | |
237 | +} | |
238 | + | |
239 | + | |
240 | +/* EOF of drd64_.c ----------------------------------- */ |
@@ -0,0 +1,83 @@ | ||
1 | +/*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64 | |
2 | + | |
3 | + D r . D e a m o n 6 4 | |
4 | + for INTEL64(R), AMD64(R) | |
5 | + | |
6 | + Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved. | |
7 | + | |
8 | +Redistribution and use in source and binary forms, with or without | |
9 | +modification, are permitted provided that the following conditions are met: | |
10 | + | |
11 | + 1. Redistributions of source code must retain the above copyright notice, | |
12 | + this list of conditions and the following disclaimer. | |
13 | + 2. Redistributions in binary form must reproduce the above copyright | |
14 | + notice, this list of conditions and the following disclaimer in the | |
15 | + documentation and/or other materials provided with the distribution. | |
16 | + | |
17 | +THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY | |
18 | +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
19 | +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
20 | +DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE | |
21 | +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
22 | +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
23 | +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
24 | +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
25 | +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
26 | +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | |
27 | +OF THE POSSIBILITY OF SUCH DAMAGE. | |
28 | + | |
29 | +DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/ | |
30 | + | |
31 | +/* File Info ----------------------------------------------------------- | |
32 | +File: drd64_.h | |
33 | +Function: Header | |
34 | +Comment: | |
35 | +----------------------------------------------------------------------*/ | |
36 | + | |
37 | +#ifndef DRD64_HEADER_LIBGOBLIN_OBJINFO | |
38 | +#define DRD64_HEADER_LIBGOBLIN_OBJINFO | |
39 | + | |
40 | +#include"drd64_libgoblin.h" | |
41 | + | |
42 | +#ifdef DRD64_SRC_LIBGOBLIN_OBJINFO | |
43 | + #define LIBGOBLIN_OBJINFO_EXTERN | |
44 | +#else | |
45 | + #define LIBGOBLIN_OBJINFO_EXTERN extern | |
46 | +#endif | |
47 | + | |
48 | +#if defined DRD64_SRC_LIBGOBLIN_OBJINFO | |
49 | + #define LIBGOBLIN_OBJINFO_INTERNALFUNC | |
50 | +#elif defined DRD64_SRC_TEST_LIBGOBLIN_OBJINFO | |
51 | + #define LIBGOBLIN_OBJINFO_INTERNALFUNC | |
52 | +#endif | |
53 | + | |
54 | + | |
55 | +#define LIBGOBLIN_OBJINFO_UNITS 2048 | |
56 | +#define LIBGOBLIN_OBJINFO_INITALLOCRATE 4 | |
57 | + | |
58 | +#ifdef DRD64_SRC_LIBGOBLIN_OBJINFO | |
59 | + | |
60 | +#endif | |
61 | + | |
62 | +#define OBJINFO(p,n) ((LibGoblin_ObjectInfo *)((p)->p_objinfo + (n))) | |
63 | + | |
64 | +LIBGOBLIN_OBJINFO_EXTERN | |
65 | + LibGoblin_ObjectInfo *ObjectInfo_GetObjectInfo( LibGoblin_ProgramInfo *p_pginfo, int i_bid ); | |
66 | +LIBGOBLIN_OBJINFO_EXTERN | |
67 | + LibGoblin_ObjectInfo *ObjectInfo_AllocObjectInfo( LibGoblin_ProgramInfo *p_pginfo ); | |
68 | +LIBGOBLIN_OBJINFO_EXTERN | |
69 | + int ObjectInfo_FreeObjectInfo( LibGoblin_ProgramInfo *p_pginfo, LibGoblin_ObjectInfo *p_binfo ); | |
70 | +LIBGOBLIN_OBJINFO_EXTERN | |
71 | + int ObjectInfo_Init( LibGoblin_ProgramInfo *p_pginfo, int i_init_objnums ); | |
72 | +LIBGOBLIN_OBJINFO_EXTERN | |
73 | + int ObjectInfo_Term( LibGoblin_ProgramInfo *p_pginfo ); | |
74 | + | |
75 | + | |
76 | +#ifdef LIBGOBLIN_OBJINFO_INTERNALFUNC | |
77 | + void ObjectInfo_ClearObjectInfo( LibGoblin_ObjectInfo *p_binfo ); | |
78 | +#endif | |
79 | + | |
80 | + | |
81 | +#endif /* DRD64_HEADER_LIBGOBLIN_OBJINFO */ | |
82 | + | |
83 | +/* EOF of drd64_.h ----------------------------------- */ |
@@ -50,17 +50,46 @@ typedef struct { | ||
50 | 50 | |
51 | 51 | /*=====================================================================*/ |
52 | 52 | typedef struct { |
53 | - Ptr ptr_address; | |
54 | - char *pstr_name; | |
55 | - DWord dw_size; | |
56 | - DWord dw_srcid; | |
53 | + Ptr ptr_address; // Object Address | |
54 | + DWord dw_size; // Object Size (Address Range) | |
55 | + char *pstr_name; // Object Name (Param./Func./etc...) | |
56 | + //DWord dw_srcid; // SourceInfo struct ID | |
57 | 57 | DWord dw_next; |
58 | 58 | Byte b_elf_flags; |
59 | - Word w_secid; | |
59 | + Word w_secid; // SectionInfo ItemIndex belong with this object. | |
60 | 60 | } LibGoblin_AddressInfo; |
61 | 61 | |
62 | 62 | |
63 | 63 | /*=====================================================================*/ |
64 | +typedef struct { | |
65 | + int i_id; | |
66 | + | |
67 | + Ptr ptr_address; // Object Address | |
68 | + DWord dw_size; // Object Size (Address Range) | |
69 | + char *pstr_name; // Object Name (Param./Func./etc...) | |
70 | + //DWord dw_srcid; // SourceInfo struct ID | |
71 | + DWord dw_next; | |
72 | + Byte b_elf_flags; | |
73 | + Word w_secid; // SectionInfo ItemIndex belong with this object. | |
74 | + | |
75 | +} LibGoblin_ObjectInfo; | |
76 | + | |
77 | + | |
78 | +/*=====================================================================*/ | |
79 | +typedef struct { | |
80 | + Ptr ptr_address; | |
81 | + LibGoblin_ObjectInfo *p_objinfo; | |
82 | +} LibGoblin_AddressTable; | |
83 | + | |
84 | +/*=====================================================================*/ | |
85 | +typedef struct { | |
86 | + int i_srcid; | |
87 | + char str_filename[DRD64_MAX_PATH]; | |
88 | + char str_localpath[DRD64_MAX_PATH]; | |
89 | +} LibGoblin_SourceInfo; | |
90 | + | |
91 | + | |
92 | +/*=====================================================================*/ | |
64 | 93 | typedef struct { |
65 | 94 | int i_id; |
66 | 95 | int i_refcount; |
@@ -174,8 +203,17 @@ typedef struct { | ||
174 | 203 | int i_num_binfo; |
175 | 204 | LibGoblin_BinaryInfo *p_binfo[LIBGOBLIN_BINFO_MAXFILES]; |
176 | 205 | |
177 | - int i_opened_bid; | |
206 | + /* Address Table Info. */ | |
207 | + LibGoblin_AddressInfo *p_addrinfo; | |
208 | + DWord dw_alloc_addrinfo; | |
209 | + DWord dw_max_addrinfo; | |
178 | 210 | |
211 | + // Object Table --- | |
212 | + LibGoblin_ObjectInfo *p_objinfo; | |
213 | + int i_alloc_objinfo; | |
214 | + int i_max_objinfo; | |
215 | + int i_now_objinfo; | |
216 | + | |
179 | 217 | } LibGoblin_ProgramInfo; |
180 | 218 | |
181 | 219 |
@@ -84,6 +84,9 @@ void Test_LibGoblin_LoadProg_API_LoadProgram_test00_001( void ) | ||
84 | 84 | { goto goto_Test_LibGoblin_LoadProg_API_LoadProgram_test00_001_post; } |
85 | 85 | } |
86 | 86 | |
87 | + i_result = LibGoblin_AnalyzeProgram( i_pgid ); | |
88 | + CU_ASSERT( 0x00 == i_result ); | |
89 | + | |
87 | 90 | i_result = LibGoblin_FreeProgInfo( i_pgid ); |
88 | 91 | CU_ASSERT( 0x00 == i_result ); |
89 | 92 |