readfile.c

来自「操作系统SunOS 4.1.3版本的源码」· C语言 代码 · 共 102 行

C
102
字号
/* * @(#)readfile.c 1.1 92/07/30 Copyright (c) 1985 by Sun Microsystems, Inc. */#include <stand/saio.h>#include <a.out.h>/* * Read in a Unix executable file and return its entry point. * Handle the various a.out formats correctly. * "Io" is the standalone file descriptor to read from. * Print informative little messages if "print" is on. * Returns -1 for errors. * * The parameter <LOAD> must be set in the command line to cc, e.g. * 	cc -DLOAD=0x4000 -o readfile.c * The makefile takes care of this. */int (*readfile(io, print))()	register int io;	int print;{	struct exec x;	register int i;	register char *addr;	register int shared = 0;	register int loadaddr;	register int segsiz;	register int datasize;	extern char start[];	i = read(io, (char *)&x, sizeof x);	if (x.a_magic == ZMAGIC || x.a_magic == NMAGIC)		shared = 1;	if (i != sizeof x || (!shared && x.a_magic != OMAGIC)) {		printf("Not executable\n");		return ((int (*)()) -1);	}	if (print)		printf("Size: %d", x.a_text);	datasize = x.a_data;	if (!shared) {		x.a_text = x.a_text + x.a_data;		x.a_data = 0;	}	if (lseek(io, N_TXTOFF(x), 0) == -1)		goto shread;	addr = (char *)(x.a_text + LOAD);	if (addr  > (char *)start) {		printf("\nProgram text overlaps boot code! 0x%x > 0x%x\n",			addr, start);		goto shread;	}#ifdef	NFS_BOOT#define	FUDGE	(0x2000-0x20)	if (read(io, (char *)LOAD, FUDGE) != FUDGE)		goto shread;	if (read(io, (char *)(LOAD+FUDGE), (int)x.a_text-FUDGE) !=		(x.a_text-FUDGE))		goto shread;#else	if (read(io, (char *)LOAD, (int)x.a_text) != x.a_text)		goto shread;#endif NFS_BOOT	if (x.a_machtype == M_OLDSUN2)		segsiz = OLD_SEGSIZ;	else		segsiz = SEGSIZ;	if (shared)		while ((int)addr & (segsiz-1))			*addr++ = 0;	if (addr + x.a_data > (char *)start) {		printf("\nProgram data overlaps boot code!\n");		goto shread;	}	if (print)		printf("+%d", datasize);	if ((int)x.a_data != 0)		/* Avoid zero length read */		if (read(io, addr, (int)x.a_data) < x.a_data)			goto shread;	close(io);		/* Done with it. */	if (print)		printf("+%d", x.a_bss);	addr += x.a_data;	for (i = 0; i < x.a_bss && addr < (char *)start; i++)		*addr++ = 0;	if (print)		printf(" bytes\n");	if (x.a_machtype != M_OLDSUN2 && x.a_magic == ZMAGIC)		loadaddr = LOAD + sizeof (struct exec);	else		loadaddr = LOAD;	return (int (*)()) (loadaddr);shread:	printf("Truncated file\n");	return ((int (*)()) -1);}

⌨️ 快捷键说明

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