1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
4 for INTEL64(R), AMD64(R)
6 Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
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.
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.
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
31 /* File Info -----------------------------------------------------------
35 ----------------------------------------------------------------------*/
37 #define DRD64_SRC_LIBGOBLIN_API
38 #include"drd64_libgoblin.h"
41 #define LOCATION(n) DRD64_ERR_LOCATION( \
42 DRD64_ERROR_MODULE_LIBGOBLIN, DRD64_ERROR_ARCH_NODEPEND, \
43 DRD64_SRCID_LIBGOBLIN_API, (n))
45 /***********************************************************************
46 ***********************************************************************/
47 #define FUNCID_LibGoblin_AnalyzeMainProgram 0x31
50 LibGoblin_AnalyzeMainProgram(
54 LibGoblin_ProgramInfo *p_pginfo;
55 LibGoblin_BinaryInfo *p_binfo;
57 p_pginfo = ProgInfo_GetProgInfo( i_pgid );
58 if( NULL == p_pginfo ) {
59 LibBrownie_Error_SetErrorInfo(
60 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
61 LOCATION( FUNCID_LibGoblin_AnalyzeMainProgram ),
62 errno, (QWord)i_pgid, (QWord)0x00, __LINE__ );
66 p_binfo = BinaryInfo_GetBinInfo( p_pginfo->i_binfo_id );
67 if( NULL == p_binfo ) {
68 LibBrownie_Error_SetErrorInfo(
69 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x02 ),
70 LOCATION( FUNCID_LibGoblin_AnalyzeMainProgram ),
71 errno, (QWord)p_pginfo->i_binfo_id, (QWord)0x00, __LINE__ );
75 i_result = ELF_ReadELF_Phase2( p_binfo, (PtrValue)0x00000000 );
76 if( 0x00 != i_result ) {
77 LibBrownie_Error_SetErrorInfo(
78 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
79 LOCATION( FUNCID_LibGoblin_AnalyzeMainProgram ),
80 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
84 i_result = DWARF_ReadDWARF( p_binfo );
85 if( 0x00 != i_result ) {
86 LibBrownie_Error_SetErrorInfo(
87 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x04 ),
88 LOCATION( FUNCID_LibGoblin_AnalyzeMainProgram ),
89 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
93 i_result = ObjectInfo_PostProc( p_pginfo, p_binfo );
94 if( 0x00 != i_result ) {
95 LibBrownie_Error_SetErrorInfo(
96 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x05 ),
97 LOCATION( FUNCID_LibGoblin_AnalyzeMainProgram ),
98 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
102 //Debug_Index_DWARFInfo_DumpObjectInfo( p_binfo, 0xff );
105 Debug_ObjectInfo_Print_AllGroupLink( p_pginfo, 0xff );
111 /***********************************************************************
112 ***********************************************************************/
113 #define FUNCID_LibGoblin_AnalyzeLibrary 0x32
116 LibGoblin_AnalyzeLibrary(
119 PtrValue ptr_loadaddr )
122 LibGoblin_BinaryInfo *p_binfo;
124 p_binfo = BinaryInfo_GetBinInfo( i_bid );
125 if( NULL == p_binfo ) {
126 LibBrownie_Error_SetErrorInfo(
127 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
128 LOCATION( FUNCID_LibGoblin_AnalyzeLibrary ),
129 errno, (QWord)i_bid, (QWord)0x00, __LINE__ );
133 if( p_binfo->i_pginfo != i_pgid ) {
134 LibBrownie_Error_SetErrorInfo(
135 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x02 ),
136 LOCATION( FUNCID_LibGoblin_AnalyzeLibrary ),
137 errno, (QWord)p_binfo->i_pginfo, (QWord)i_pgid, __LINE__ );
141 i_result = ELF_ReadELF_Phase2( p_binfo, ptr_loadaddr );
142 if( 0x00 != i_result ) {
143 LibBrownie_Error_SetErrorInfo(
144 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
145 LOCATION( FUNCID_LibGoblin_AnalyzeLibrary ),
146 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
154 /***********************************************************************
155 ***********************************************************************/
156 #define FUNCID_LibGoblin_GetUnresolv_ObjectFilePath 0x22
159 LibGoblin_GetUnresolv_ObjectFilePath(
161 LibGoblin_ObjectFilePath *p_objpath )
164 LibGoblin_ProgramInfo *p_pginfo;
165 LibGoblin_BinaryInfo *p_binfo;
166 LibGoblin_BinaryInfo *p_binfo_parent;
167 LibGoblin_BinaryFile *p_bfile;
169 if( NULL == p_objpath ) {
170 LibBrownie_Error_SetErrorInfo(
171 DRD64_ERROR( DRD64_ERROR_PTN_FAILED_ARG, 0x01, 0x02 ),
172 LOCATION( FUNCID_LibGoblin_GetUnresolv_ObjectFilePath ),
173 errno, (QWord)0x00, (QWord)0x00, __LINE__ );
177 p_pginfo = ProgInfo_GetProgInfo( i_pgid );
178 if( NULL == p_pginfo ) {
179 LibBrownie_Error_SetErrorInfo(
180 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x03 ),
181 LOCATION( FUNCID_LibGoblin_GetUnresolv_ObjectFilePath ),
182 errno, (QWord)i_pgid, (QWord)0x00, __LINE__ );
186 p_binfo = BinaryInfo_GetBinInfo( p_pginfo->i_binfo_id );
187 while( NULL != p_binfo ) {
188 if( LIBGOBLIN_BINFO_PHASE_SETPROG > p_binfo->b_phase )
190 p_binfo = BinaryInfo_GetBinInfo( p_binfo->i_binfo_next );
194 if( NULL != p_binfo ) {
195 memset( p_objpath, 0x00, sizeof( LibGoblin_ObjectFilePath ) );
197 p_objpath->i_bid = p_binfo->i_id;
199 strncpy( p_objpath->str_filename, p_binfo->str_filename, DRD64_MAX_PATH );
201 if( -1 < p_binfo->i_binfo_parent ) {
202 p_binfo_parent = BinaryInfo_GetBinInfo( p_binfo->i_binfo_parent );
203 p_bfile = BinaryFile_GetBinaryFile( p_binfo_parent->i_binfile );
204 if( NULL != p_bfile ) {
205 strncpy( p_objpath->str_rpath, p_bfile->str_rpath, DRD64_MAX_PATH );
206 strncpy( p_objpath->str_runpath, p_bfile->str_runpath, DRD64_MAX_PATH );
210 i_result = p_binfo->i_id;
217 /***********************************************************************
218 ***********************************************************************/
219 #define FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath 0x23
222 LibGoblin_SetPathAndLoad_ObjectFilePath(
223 LibGoblin_ObjectFilePath *p_objpath )
226 LibGoblin_BinaryInfo *p_binfo;
228 p_binfo = BinaryInfo_GetBinInfo( p_objpath->i_bid );
229 if( NULL == p_binfo ) {
230 LibBrownie_Error_SetErrorInfo(
231 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
232 LOCATION( FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath ),
233 errno, (QWord)p_objpath->i_bid, (QWord)0x00, __LINE__ );
237 i_result = strncmp( p_objpath->str_filename,
238 p_binfo->str_filename, DRD64_MAX_PATH );
239 if( 0x00 != i_result ) {
240 LibBrownie_Error_SetErrorInfo(
241 DRD64_ERROR( DRD64_ERROR_PTN_LIBCALL, 0x01, 0x01 ),
242 LOCATION( FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath ),
243 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
247 i_result = BinaryInfo_SetProgramPath(
248 p_binfo, p_objpath->str_remotepath,
249 p_objpath->str_localpath );
250 if( 0x00 != i_result ) {
251 LibBrownie_Error_SetErrorInfo(
252 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
253 LOCATION( FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath ),
254 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
258 i_result = LoadProg_LoadBinaryInfo( p_binfo );
259 if( 0x00 != i_result ) {
260 LibBrownie_Error_SetErrorInfo(
261 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
262 LOCATION( FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath ),
263 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
272 /***********************************************************************
273 ***********************************************************************/
274 #define FUNCID_LibGoblin_LoadProgram_Main 0x21
277 LibGoblin_LoadProgram_Main(
279 const char *pstr_remotefull,
280 const char *pstr_localfull )
283 LibGoblin_ProgramInfo *p_pginfo;
285 p_pginfo = ProgInfo_GetProgInfo( i_pgid );
286 if( NULL == p_pginfo ) {
287 LibBrownie_Error_SetErrorInfo(
288 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
289 LOCATION( FUNCID_LibGoblin_LoadProgram_Main ),
290 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
294 if( NULL == pstr_localfull ) {
295 LibBrownie_Error_SetErrorInfo(
296 DRD64_ERROR( DRD64_ERROR_PTN_FAILED_ARG, 0x01, 0x01 ),
297 LOCATION( FUNCID_LibGoblin_LoadProgram_Main ),
298 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
302 i_bid = LoadProgram_LoadMainProgram(
303 p_pginfo, pstr_remotefull, pstr_localfull );
304 if(( 0 > i_bid ) || ( NULL == pstr_localfull )) {
305 LibBrownie_Error_SetErrorInfo(
306 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
307 LOCATION( FUNCID_LibGoblin_LoadProgram_Main ),
308 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
316 /***********************************************************************
317 ***********************************************************************/
318 #define FUNCID_LibGoblin_AllocProgInfo 0x11
319 LIBGOBLIN_API_PROGINFO
321 LibGoblin_AllocProgInfo(
325 LibGoblin_ProgramInfo *p_pginfo = NULL;
327 p_pginfo = ProgInfo_AllocProgInfo();
328 if( NULL == p_pginfo ) {
329 LibBrownie_Error_SetErrorInfo(
330 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
331 LOCATION( FUNCID_LibGoblin_AllocProgInfo ),
332 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
336 i_result = ObjectInfo_Init( p_pginfo, 0 );
337 if( 0x00 != i_result ) {
338 ProgInfo_FreeProgInfo( p_pginfo ); // None use return value.
340 LibBrownie_Error_SetErrorInfo(
341 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
342 LOCATION( FUNCID_LibGoblin_AllocProgInfo ),
343 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
347 return p_pginfo->i_id;
351 /***********************************************************************
352 ***********************************************************************/
353 #define FUNCID_LibGoblin_FreeProgInfo 0x12
354 LIBGOBLIN_API_PROGINFO
356 LibGoblin_FreeProgInfo(
360 LibGoblin_ProgramInfo *p_pginfo;
362 p_pginfo = ProgInfo_GetProgInfo( i_pgid );
363 if( NULL == p_pginfo ) {
364 LibBrownie_Error_SetErrorInfo(
365 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
366 LOCATION( FUNCID_LibGoblin_FreeProgInfo ),
367 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
370 assert( p_pginfo->i_id == i_pgid );
372 ObjectInfo_Term( p_pginfo ); // None use retrun value.
374 i_result = ProgInfo_FreeProgInfo( p_pginfo );
375 if( 0x00 != i_result ) {
376 LibBrownie_Error_SetErrorInfo(
377 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
378 LOCATION( FUNCID_LibGoblin_FreeProgInfo ),
379 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
386 /***********************************************************************
387 ***********************************************************************/
388 #define FUNCID_LibGoblin_Init 0x01
396 i_err = LibBrownie_Init();
397 if( 0x00 != i_err ) { return i_err; }
399 i_err = LibFileType_Init();
400 if( 0x00 != i_err ) {
401 LibBrownie_Error_SetErrorInfo(
402 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
403 LOCATION( FUNCID_LibGoblin_Init ),
404 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
408 i_err = ProgInfo_Init();
409 if( 0x00 != i_err ) {
410 LibBrownie_Error_SetErrorInfo(
411 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
412 LOCATION( FUNCID_LibGoblin_Init ),
413 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
417 i_err = BinaryInfo_Init();
418 if( 0x00 != i_err ) {
419 LibBrownie_Error_SetErrorInfo(
420 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
421 LOCATION( FUNCID_LibGoblin_Init ),
422 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
430 /***********************************************************************
431 ***********************************************************************/
432 #define FUNCID_LibGoblin_Term 0x02
440 i_err = BinaryInfo_Term();
441 if( 0x00 != i_err ) {
442 LibBrownie_Error_SetErrorInfo(
443 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
444 LOCATION( FUNCID_LibGoblin_Term ),
445 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
449 i_err = ProgInfo_Term();
450 if( 0x00 != i_err ) {
451 LibBrownie_Error_SetErrorInfo(
452 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
453 LOCATION( FUNCID_LibGoblin_Term ),
454 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
458 i_err = LibFileType_Term();
459 if( 0x00 != i_err ) {
460 LibBrownie_Error_SetErrorInfo(
461 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
462 LOCATION( FUNCID_LibGoblin_Term ),
463 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
473 /* EOF of drd64_.c ----------------------------------- */