⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dyninfo.c

📁 T-kernel 的extension源代码
💻 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;	DM("__so_getdynamicinfo\n");	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;		  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 + -