📄 dyninfo.c
字号:
/* *---------------------------------------------------------------------- * T-Kernel / Standard Extension * * Copyright (C) 2006 by Ken Sakamura. All rights reserved. * T-Kernel / Standard Extension is distributed * under the T-License for T-Kernel / Standard Extension. *---------------------------------------------------------------------- * * Version: 1.00.00 * Released by T-Engine Forum(http://www.t-engine.org) at 2006/8/11. * *---------------------------------------------------------------------- *//* * @(#)dyninfo.c (solib) * * Shared object(SO)support library * Dynamic section information relation */#include "../../so.h"#define TSD_SGD_HAS_2 2/* * Acquire the needed information from dynamic section */EXPORT ER __so_getdynamicinfo( DLInfo *dlp ){#define TAGF(tag) ( ( (tag) < 32 )? 1U << (tag): 0U )#define NeededTAGs ( TAGF(DT_HASH) \ | TAGF(DT_STRTAB) \ | TAGF(DT_SYMTAB) \ ) Elf32_Dyn *dyn; UW *p; UW found = 0; B *errmsg; for ( dyn = dlp->dyn; dyn->d_tag != DT_NULL; dyn++ ) { switch ( dyn->d_tag ) { case DT_PLTGOT: dlp->got = (VP*)LDADR(dlp, dyn->d_un.d_ptr); break; case DT_HASH: p = (UW*)LDADR(dlp, dyn->d_un.d_ptr); dlp->hash.nbucket = p[0]; dlp->hash.bucket = &p[TSD_SGD_HAS_2]; dlp->hash.chain = &p[TSD_SGD_HAS_2] + dlp->hash.nbucket; break; case DT_STRTAB: dlp->strtab = (UB*)LDADR(dlp, dyn->d_un.d_ptr); break; case DT_SYMTAB: dlp->symtab = (Elf32_Sym*)LDADR(dlp, dyn->d_un.d_ptr); break; case DT_REL: dlp->reltab = (Elf32_Rel*)LDADR(dlp, dyn->d_un.d_ptr); break; case DT_RELSZ: dlp->relsz = dyn->d_un.d_val; break; case DT_RELA: dlp->relatab = (Elf32_Rela*)LDADR(dlp, dyn->d_un.d_ptr); break; case DT_RELASZ: dlp->relasz = dyn->d_un.d_val; break; case DT_JMPREL: dlp->jreltab = (Elf32_Rel*)LDADR(dlp, dyn->d_un.d_ptr); break; case DT_PLTRELSZ: dlp->jrelsz = dyn->d_un.d_val; break; case DT_PLTREL: if ( dyn->d_un.d_val != DT_REL ) { goto err_ret1; } break; case DT_INIT: dlp->init = (FP)LDADR(dlp, dyn->d_un.d_ptr); break; case DT_FINI: dlp->fini = (FP)LDADR(dlp, dyn->d_un.d_ptr); break; case DT_TEXTREL: errmsg = "text relocation is not supported"; goto err_ret2; case DT_MIPS_GOTSYM: dlp->mips_gotsym = dyn->d_un.d_val; break; case DT_MIPS_LOCAL_GOTNO: dlp->mips_local_gotno = dyn->d_un.d_val; break; case DT_MIPS_SYMTABNO: dlp->mips_symtabno = dyn->d_un.d_val; break; default: /* nothing to do */ break; } found |= TAGF(dyn->d_tag); } if ( (found & NeededTAGs) != NeededTAGs ) { goto err_ret1; } return E_OK;err_ret2: BMS_DEBUG_PRINT(errmsg);err_ret1: DEBUG_PRINT(("getdynamicinfo err = %d\n", E_REC)); return E_REC;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -