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

📄 ldelf.c

📁 T-kernel 的extension源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
err_ret:	DEBUG_PRINT(("elf_get_gp err = %d (%d)\n", err, (UH)err));	return err;}/* * ELF relocation */LOCAL ER elf_relocation( LDINFO *li, ELF_LoadInfo *eli, W lofs, BzRead *bzr ){	Elf32_Sym	*symtbl;	W		n;	ER		err;	if ( eli->symtbl_size == 0U ) {		return E_OK;  /* There is no relocation information. */	}	/* Load symbol table. */	n = (W)eli->symtbl_size;	symtbl = Vmalloc((size_t)n);	if ( symtbl == NULL ) {		err = E_NOMEM;		goto err_ret1;	}	err = ReadProgFile(&(li->pohdr), (W)eli->symtbl_fofs, (VB*)symtbl, n, bzr);	if ( err < E_OK ) {		goto err_ret2;	}	n /= (W)sizeof(Elf32_Sym);	err = elf_get_gp(&(li->pohdr), eli, bzr); /* Obtain gp */	if ( err < E_OK ) {		goto err_ret2;	}	/* Relocate text area */	err = reloc1(eli, &(li->pohdr), (W)eli->rel_text_fofs, (W)eli->rel_text_size, lofs,			eli->text_ladr + lofs, (W)eli->text_size, symtbl, n, bzr);	if ( err < E_OK ) {		goto err_ret2;	}	/* Relocate data area */	err = reloc1(eli, &(li->pohdr), (W)eli->rel_data_fofs, (W)eli->rel_data_size, lofs,			eli->data_ladr + lofs, (W)eli->data_size, symtbl, n, bzr);	if ( err < E_OK ) {		goto err_ret2;	}	Vfree(symtbl);	return E_OK;err_ret2:	Vfree(symtbl);err_ret1:	DEBUG_PRINT(("elf_relocation err = %d (%d)\n", err, (UH)err));	return err;}/* * Load all ELF-format objects at once from the file. *	lsid == 0	Load into system space,  Relocated/not relocated *	lsid != 0	Load into local space,  Not relocated */EXPORT ER DirectLoad_elf( LDINFO *li, UW lsid, UW ldmode, Elf32_Ehdr *hdr, FP *entry, BzRead *bzr ){	ELF_LoadInfo	eli;	VB		*ladr, *top_adr;	UW		npage;	W		lofs, sz;	BOOL		sys = ( (ldmode & LDMD_SYS) != 0U )? TRUE: FALSE;	BOOL		dyn = ( (ldmode & LDMD_DYN) != 0U )? TRUE: FALSE;	BOOL		relsec;	ER		err;	if ( hdr->e_type == ET_EXEC ) {		relsec = (HasDynSeg(hdr, &(li->pohdr), bzr) != 0) ? FALSE: HasRelSec(hdr, &(li->pohdr), bzr);	} else {		relsec = FALSE;	}	if ( dyn != 0 ) {		/* Only relocatable format cannot be  used for dynamic loading. */		if ( (hdr->e_type == ET_REL)		  || ((hdr->e_type == ET_EXEC) && relsec) ) {			err = _ER_REC(TSD_LDE_ERR_1);			goto err_ret1;		}	} else {		/* Shared object format cannot be used for normal loading. */		if ( hdr->e_type == ET_DYN ) {			err = _ER_REC(TSD_LDE_ERR_2);			goto err_ret1;		}	}	/* Obtain ELF loading information */	err = GetELFLoadInfo(&eli, hdr, &(li->pohdr), bzr, relsec);	if ( err < E_OK ) {		goto err_ret1;	}	top_adr = PageAlignL(eli.text_ladr);	/* Load size */	npage = PageCount((UW)eli.bss_ladr + eli.bss_size - (UW)top_adr);	sz = 0;	if ( !dyn ) {		/* Examine loading address */		if ( lsid == 0U ) {			if ( (hdr->e_type == ET_EXEC) && !eli.vir_or_off ) {				err = CheckSysLoadAddress(&eli);				if ( err < E_OK ) {					goto err_ret1;				}			}		} else {			if ( (hdr->e_type == ET_EXEC) && eli.vir_or_off ) {				err = _ER_REC(TSD_LDE_ERR_3);				goto err_ret1;			}			err = CheckLoadAddress(&eli);			if ( err < E_OK ) {				goto err_ret1;			}			sz = (W)PageCount(eli.stack_size);		}	}	/* Check remaining memory */	err = ChkSysRsvMem((W)npage + sz);	if ( err < E_OK ) {		err = ERtoERR(err);		goto err_ret1;	}	ladr = top_adr;	if ( dyn || ((lsid == 0U) && ( (hdr->e_type != ET_EXEC)			       || ( (hdr->e_type == ET_EXEC) && eli.vir_or_off)))) {		/* Reserve memory space for loading */		ladr = AllocMemorySpace((W)npage, lsid);		if ( ladr == NULL ) {			err = E_NOMEM;			goto err_ret1;		}	}	li->topadr = ladr;	/* Loading address */	li->dpage = 0;		/* Number of disk map pages */	li->mpage = npage;	/* Number of memory map pages */	/* Set memory space	   Set text data to "Not cleared"; bss to "Cleared". */	sz = (eli.data_ladr + eli.data_size - top_adr) / PAGESIZE;	err = MakeSpace(ladr, sz, (W)lsid,				( sys != 0 )? PTE_SMEM_NC: PTE_UMEM_NC);	if ( err < E_OK ) {		err = ERtoERR(err);		goto err_ret2;	}	err = MakeSpace(ladr + (sz * PAGESIZE), (W)npage - sz, (W)lsid,				( sys != 0 )? PTE_SMEM_CL: PTE_UMEM_CL);	if ( err < E_OK ) {		err = ERtoERR(err);		goto err_ret3;	}	lofs = ladr - top_adr;	/* Load text area from file */	err = ReadProgFile(&(li->pohdr), (W)eli.text_fofs,				eli.text_ladr + lofs, (W)eli.text_size, bzr);	if ( err < E_OK ) {		goto err_ret4;	}	/* Load data area from file */	err = ReadProgFile(&(li->pohdr), (W)eli.data_fofs,				eli.data_ladr + lofs, (W)eli.data_size, bzr);	if ( err < E_OK ) {		goto err_ret4;	}	if ( (hdr->e_type == ET_REL) || ( (hdr->e_type == ET_EXEC) && eli.vir_or_off)) {		/* Relocation */		err = elf_relocation(li, &eli, lofs, bzr);		if ( err < E_OK ) {			goto err_ret4;		}	}	/* Set text area to not writable */	sz = eli.text_ladr + eli.text_size - top_adr;	err = ChangeSpace(ladr, (INT)PageCount((UW)sz), (INT)lsid,				( sys != 0 )? PTE_SMEM_RO: PTE_UMEM_RO);	if ( err < E_OK ) {		err = ERtoERR(err);		goto err_ret4;	}	/* Synchronize cache memory */	SyncIDCacheArea(ladr, sz, lsid);	/* Stack size */	li->stacksz = eli.stack_size;	/* Start address */	*entry = (FP)((VB*)hdr->e_entry + lofs);	return E_OK;err_ret4:	sz = (W)npage;err_ret3:	UnmakeSpace(ladr, sz, (W)lsid);err_ret2:	if ( dyn || ((lsid == 0U) && ( (hdr->e_type != ET_EXEC)			       || ( (hdr->e_type == ET_EXEC) && eli.vir_or_off)))) {		FreeMemorySpace(ladr, 0);	}err_ret1:	DEBUG_PRINT(("DirectLoad_elf err = %d (%d)\n", err, (UH)err));	return err;}/* * Load ELF-format objects on demand from the file. *	lsid == 0	Load into system space,  Not relocated *	lsid != 0	Load into local space,  Not relocated */EXPORT ER DemandLoad_elf( LDINFO *li, UW lsid, UW ldmode, Elf32_Ehdr *hdr, ID did, PhyBlk *pb, FP *entry, BzRead *bzr ){	ELF_LoadInfo	eli;	MapMode		mode;	PhyBlk		*mpb;	UW		top, npg, ofs, n, loadofs;	VB		*ladr, *loadaddr = NULL;	BOOL		sys = ( (ldmode & LDMD_SYS) != 0U )? TRUE: FALSE;	BOOL		dyn = ( (ldmode & LDMD_DYN) != 0U )? TRUE: FALSE;	BOOL		relsec;	ER		err;	if ( hdr->e_type == ET_EXEC ) {		relsec = (HasDynSeg(hdr, &(li->pohdr), bzr) != 0) ? FALSE: HasRelSec(hdr, &(li->pohdr), bzr);	} else {		relsec = FALSE;	}	if ( dyn != 0 ) {		/* Only relocatable format cannot be used for dynamic loading. */		if ( (hdr->e_type == ET_REL)		  || ((hdr->e_type == ET_EXEC) && relsec) ) {			err = _ER_REC(TSD_LDE_ERR_1);			goto err_ret1;		}	} else {		/* Only fixed-address format can be used for normal loading. */		if ( (hdr->e_type != ET_EXEC) || relsec ) {			err = _ER_REC(TSD_LDE_ERR_2);			goto err_ret1;		}	}	/* Obtain ELF loading information */	err = GetELFLoadInfo(&eli, hdr, &(li->pohdr), bzr, relsec);	if ( err < E_OK ) {		goto err_ret1;	}	n = 0;	if ( !dyn ) {		/* Examine loading address */		if ( lsid == 0U ) {			err = CheckSysLoadAddress(&eli);			if ( err < E_OK ) {				goto err_ret1;			}		} else {			err = CheckLoadAddress(&eli);			if ( err < E_OK ) {				goto err_ret1;			}			n = PageCount(eli.stack_size);		}	}	/* Check remaining memory */	err = ChkSysRsvMem((W)(PageCount(eli.data_size + eli.bss_size) + n));	if ( err < E_OK ) {		err = ERtoERR(err);		goto err_ret1;	}	loadofs = 0;	if ( dyn != 0 ) {		/* Reserve memory space for loading */		n = ofs = PageOffset((VP)eli.text_fofs);		npg = PageCount(ofs + eli.text_size);		ofs = PageOffset((VP)eli.data_fofs);		npg += PageCount(ofs + eli.data_size + eli.bss_size);		loadaddr = AllocMemorySpace((W)npg, lsid);		if ( loadaddr == NULL ) {			err = E_NOMEM;			goto err_ret1;		}		loadofs = (UW)loadaddr - ((UW)eli.text_ladr - n);	}	/* Map attribute */	mode.resv  = 0;	mode.rank  = MapRankPROG;	mode.real  = 0;	mode.clear = MapNoClr;	mode.level = ( sys != 0 )?	(MapSystem | MapExecute | MapRead):				(MapUser | MapExecute | MapRead);	mode.space = lsid;	mode.info  = MAP_LOADPROG;	/* Text area mapping */	top = eli.text_fofs / (UW)PAGESIZE;	ofs = PageOffset((VP)eli.text_fofs);	npg = PageCount(ofs + eli.text_size);	mpb = CutPhyBlks(did, pb, top, npg);	if ( mpb == NULL ) {		err = _ER_REC(TSD_LDE_ERR_3);		goto err_ret2;	}	mode.addr = eli.text_ladr - ofs + loadofs;	err = MapDisk(did, mpb, &mode);	Ifree(mpb);	if ( err < E_OK ) {		goto err_ret2;	}	li->mid[0] = (ID)err;		/* Map ID */	li->topadr = mode.addr;		/* Loading address */	li->dpage = npg;		/* Number of disk map pages */	if ( isValidCopyOnWrite(did) != 0 ) {		/* Data area mapping */		top = eli.data_fofs / (UW)PAGESIZE;		ofs = PageOffset((VP)eli.data_fofs);		npg = PageCount(ofs + eli.data_size);		mpb = CutPhyBlks(did, pb, top, npg);		if ( mpb == NULL ) {			err = _ER_REC(TSD_LDE_ERR_4);			goto err_ret3;		}		mode.addr = eli.data_ladr - ofs + loadofs;		err = MapDisk(did, mpb, &mode);		Ifree(mpb);		if ( err < E_OK ) {			goto err_ret3;		}		li->mid[1] = (ID)err;		/* Map ID */		li->dpage += npg;		/* Number of disk map pages */		/* Set data area memory space to copy-on-write. */		err = ChangeSpace(mode.addr, (W)npg, (W)lsid,					( sys != 0 )? PTE_SMEM_CW: PTE_UMEM_CW);		if ( err < E_OK ) {			err = ERtoERR(err);			goto err_ret4;		}		/* Set memory space in bss area */		n = (UW)((VB*)PageAlignU(eli.bss_ladr) - eli.bss_ladr);		li->mpage = ( eli.bss_size > n )?  /* Number of memory map pages */				PageCount(eli.bss_size - n): 0;		ladr = eli.bss_ladr + loadofs;		err = MakeSpace(ladr + n, (W)li->mpage, (W)lsid,					( sys != 0 )? PTE_SMEM_CL: PTE_UMEM_CL);		if ( err < E_OK ) {			err = ERtoERR(err);			goto err_ret4;		}		/* Since the boundary between data and bss areas is not a page boundary,		   clear the part of bss area included in the data area. */		if ( n > 0U ) {			bzero(ladr, (size_t)n);		}	} else {		/* Load data area */		ofs = PageOffset(eli.data_ladr);		li->mpage = PageCount(ofs + eli.data_size + eli.bss_size);		ladr = eli.data_ladr - ofs + loadofs;		/* Set memory space			Set data to "Not cleared"; bss to "Cleared". */		npg = (ofs + eli.data_size) / (UW)PAGESIZE;		err = MakeSpace(ladr, (W)npg, (W)lsid,					( sys != 0 )? PTE_SMEM_NC: PTE_UMEM_NC);		if ( err < E_OK ) {			err = ERtoERR(err);			goto err_ret4;		}		err = MakeSpace(ladr + (npg * (UW)PAGESIZE), (W)li->mpage - (W)npg, (W)lsid,					( sys != 0 )? PTE_SMEM_CL: PTE_UMEM_CL);		if ( err < E_OK ) {			err = ERtoERR(err);			goto err_ret5;		}		/* Load data area from file */		err = ReadProgFile(&(li->pohdr), (W)eli.data_fofs,				eli.data_ladr + loadofs, (W)eli.data_size, bzr);		if ( err < E_OK ) {			goto err_ret6;		}	}	/* Stack size */	li->stacksz = eli.stack_size;	/* Start address */	*entry = (FP)((VB*)hdr->e_entry + loadofs);	return E_OK;err_ret6:	npg = li->mpage;err_ret5:	UnmakeSpace(ladr, (W)npg, (W)lsid);err_ret4:	if ( li->mid[1] > 0 ) {		UnmapDisk(li->mid[1], MD_RDONLY);	}err_ret3:	UnmapDisk(li->mid[0], MD_RDONLY);err_ret2:	if ( dyn != 0 ) {		FreeMemorySpace(loadaddr, lsid);	}err_ret1:	DEBUG_PRINT(("DemandLoad_elf err = %d (%d)\n", err, (UH)err));	return err;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -