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

📄 cygelf.c

📁 mips架构的bootloader,99左右的版本 但源代码现在没人更新了
💻 C
字号:
/************************************************************* * File: tools/cygelf.c * Purpose: The pmcc compiler driver for the Cygnus Elf toolset * Author: Phil Bunce (pjb@carmel.com) * Revision History: *	970318	Created from algo.c *	970324	Corrected linker script for promable images *	970325	Changed crt0.o to crt0x.o *	970325	PMON boots on 4001 w/o NVRAM. Ethernet dl not working. *	970327	Changed AT directive *	970327	Changed 'prom' to an int. Used it to turn on AT. *	970327	Changed AT expression to etext. *	970417	Added check for nfiles==0 *      970512  Fixed Solaris2 core dump. Added fmt to size of malloc. *	970526	Added a -mips16 switch *	970618	Added initial_lc to ld command line *	970814	Added -funsigned-char to cc for bsps/d4010 *	970902	Removed -ice option *	980220	Added support for libgcc and liblsi. *	980312	Changed winbootdir to windir. NT doesn't have winbootdir. *	981028	Changed option -msoft-float to -soft-float. *	981028	Moved std opts to misc.c. */#include <stdio.h>#include <malloc.h>#include <string.h>#include "../include/defines.h"#include "misc.h"#define DYNDEFS#ifdef MSDOS#define LINKER "ld"char cmdchar[] = "@";#endif/* set various defaults */int vflag = 0;	/* verbose flag */int fast = 1;int ssyms_flag;int syms = 1;char *chksum = "";char *ofile = "a";char *initial_lc = "-lxc";int driver;char cmdfile[] = "cmdfile";char LIBM[100] = "/usr/lib/cmplrs/cc";int soft_float;char tmp[LNMAX],tmp2[LNMAX];char *ENDIAN,*Gnum,*LSIPMCC;char *COMP_HOST_ROOT,*SDEROOT,*TMPDIR;Str flags,cflags,asflags,ldflags,ppflags,ofiles,llist,ilist,LIBS,files;Str *strlst[] = {&flags,&cflags,&asflags,&ldflags,&ppflags,&ofiles,	&llist,&ilist,&LIBS,&files,0};char *LSIPKG, *COMP_LIBGCC, *COMP_LIBLSI;char LIBC[100], libgcc[400], liblsi[400];char objfile[100];char tstart[10];char *dstart;char *CC;int nfiles;char stoppoint;int SZ;char tmppath[200];char mname[32]; /* module object name */char *clientpc;char *getDef();char *ld_cmd_file1[] = {	"OUTPUT_ARCH(mips)",	"ENTRY(_start)",	"SECTIONS",	"{",	0};	/*  .text 0xa0d80000 :  */char *ld_cmd_file2[] = {	"  {",	"    _ftext = .;",	"    *(.text)",	"    CREATE_OBJECT_SYMBOLS",	"  }",	"  .init    . : { *(.init)    } =0",	"  .fini    . : { *(.fini)    } =0",	"  .ctors   . : { *(.ctors)   }",	"  .dtors   . : { *(.dtors)   }",	"  _etext = .;",	"  etext = .;",/*	"  .reginfo . : { *(.reginfo) }", 970327 */	0};	/*  .data     0x00d88000 :  */char *ld_cmd_file3[] = {	"  {",	"    _fdata = .;",	"    *(.data)",	"    *(.rdata)",	"    *(.rodata)",	"    *(.rodata1)",	"    *(.data1)",	"  __gp_start = .;",	"    *(.lit8)",	"    *(.lit4)",	"    *(.sdata)",	"  }",	"  _edata  =  .;",	"  edata   =  .;",	"  .sbss ALIGN(8) : {",	"    *(.sbss) *(.scommon) ",	"  }",	"  __gp_end = .;",	"  .bss     . : {",	"    *(.bss) *(COMMON) ",	"  }",	"  _fbss = SIZEOF(.sbss) ? ADDR(.sbss) : ADDR(.bss);",	"  __bss_start = _fbss;",	"  _gp = __gp_start + ((__gp_end - __gp_start) / 2);",	"  _end = .;",	"  end  = .;",	"  }",	0,};extern int long_cmds_ok;/**************************************************************  main(argc,argv)*/main(argc,argv)int argc;char *argv[];{int i,status,SZ,sz;char *e,*p,h[20],*redir;char tmp2[100];char *vtmp,*fmt,*file;FILE *sfp;SZ = 0;if (! (LSIPKG=getenv("LSIPKG"))) {	fprintf(stderr,"pmcc: LSIPKG not set\n");	Exit(1);	}COMP_LIBLSI=getenv("COMP_LIBLSI");if (!COMP_LIBLSI) {	fprintf(stderr,"pmcc: COMP_LIBLSI not set\n");	Exit(1);	}strcpy(liblsi,COMP_LIBLSI);COMP_LIBGCC=getenv("COMP_LIBGCC");if (!COMP_LIBGCC) {	fprintf(stderr,"pmcc: COMP_LIBGCC not set\n");	Exit(1);	}strcpy(libgcc,COMP_LIBGCC);#ifdef MSDOSif (getenv("windir")) long_cmds_ok = 1;#elselong_cmds_ok = 1;#endifStrcpy(&LIBS,"");#ifdef DYNDEFSsprintf(tmp,"%s/include/defines.h",LSIPKG);readDefs(tmp);if (getDef("SREC")) fast = 0;if (clientpc=getDef("CLIENTPC")) strcpy(tstart,&clientpc[2]);else strcpy(tstart,"80020000");#else#ifdef SRECfast = 0;#endif#ifdef CLIENTPCsprintf(tstart,"%08lx",CLIENTPC);#elsestrcpy(tstart,"80020000");#endif#endif#ifdef MSDOSif (! (TMPDIR=getenv("TMPDIR"))) {	fprintf(stderr,"pmcc: TMPDIR not set\n");	Exit(1);	}p = tmppath + sprintf(tmppath,"%s",TMPDIR);strcat(tmppath,"/PMXXXXXX");mktemp(p);#endif/* for backward compatability we set LSIPMCC */if (! (LSIPMCC=getenv("LSIPMCC"))) LSIPMCC = "";/* Select default Endianess. */#ifdef LENDEFENDIAN = "l";#elseENDIAN = "b";#endifGnum = "o";CC = "mips-lsi-elf-gcc";stdcrt0 = "%s/lib/%s%s/crt0x.o";sprintf(tmp,"-I%s/include",LSIPKG);Strcpy(&ilist,tmp);sprintf(tmp,"-L%s/lib/%%s%%s",LSIPKG);Strcpy(&llist,tmp);sprintf(tmp,"-DPMCC -DCYGNUS %s",LSIPMCC);Strcpy(&flags,tmp);getargs(argc,argv);if (vflag) addarg(&flags,"-v");if (soft_float) {	strcat(libgcc,"/soft-float");	strcat(liblsi,"/soft-float");	}if (strequ(ENDIAN,"b")) {	addarg(&asflags,"-EB");	addarg(&cflags,"-EB");	}else {	addarg(&ldflags,"-oformat elf32-littlemips");	addarg(&asflags,"-EL");	addarg(&cflags,"-EL");	strcat(libgcc,"/el");	strcat(liblsi,"/el");	}if (mips16) {	strcat(libgcc,"/mips16");	strcat(liblsi,"/mips16");	}sprintf(tmp,"-L%s -L%s",libgcc,liblsi);addarg(&ldflags,tmp);strcpy(objfile,ofile);if (strequ(ofile,"a")) strcpy(objfile,"a.out");if (stoppoint==0) {	addarg(&cflags,"-c"); /* never want the cc driver to call ld */	addarg(&asflags,"-c"); /* never want the cc driver to call ld */	addarg(&ldflags,"-o");	addarg(&ldflags,objfile);	}sprintf(tmp,llist.str,ENDIAN,Gnum,ENDIAN,Gnum);addarg(&ldflags,tmp);addarg(&cflags,ilist.str);addarg(&ppflags,ilist.str);addarg(&asflags,"-DLANGUAGE_ASSEMBLY");addarg(&cflags,"-DLANGUAGE_C");if (strequ(ENDIAN,"l")) {	addarg(&cflags,"-DMIPSEL");	addarg(&ppflags,"-DMIPSEL");	}else {	addarg(&cflags,"-DMIPSEB");	addarg(&ppflags,"-DMIPSEB");	}if (nfiles == 0) {	printf("Fatal error: no files specified.\n"); 	exit(1); 	} /* now invoke the compiler */for (i=0;i<nfiles;i++) {	file = getStrn(&files,i);	e = extent(file);	getHead(h,file);        if (nfiles == 1 && !strequ(ofile,"a") && stoppoint != 0)                strcpy(mname,ofile);        else sprintf(mname,"%s.o",h);	if (strequ(e,"s")) {		fmt = "%s -c -DLANGUAGE_ASSEMBLY -x assembler-with-cpp -traditional %s %s %s -o %s %s";		sz = strlen(CC)+strlen(flags.str)+strlen(ppflags.str)+			strlen(asflags.str)+strlen(mname)+strlen(file)+			strlen(fmt);		vtmp = malloc(sz);		sprintf(vtmp,fmt,CC,flags.str,ppflags.str, asflags.str,			mname,file);		if (status=System(vtmp)) Exit(status);		free(vtmp);		getHead(tmp,file);		strcat(tmp,".o");		addarg(&ofiles,tmp);		}	else if (strequ(e,"rec")) {		fmt = "rdsrec -A dat1 %s -o tmp.s";		sz = strlen(fmt)+strlen(file);		vtmp = malloc(sz);		sprintf(vtmp,fmt,file);		if (status=System(vtmp)) Exit(status);		free(vtmp);		fmt = "%s -c -DLANGUAGE_ASSEMBLY -x assembler-with-cpp -traditional %s %s %s -o %s tmp.s";		sz = strlen(CC)+strlen(flags.str)+strlen(ppflags.str)+			strlen(asflags.str)+strlen(mname)+strlen(file)+			strlen(fmt);		vtmp = malloc(sz);		sprintf(vtmp,fmt,CC,flags.str,ppflags.str, asflags.str,			mname);		if (status=System(vtmp)) Exit(status);		free(vtmp);		getHead(tmp,file);		strcat(tmp,".o");		addarg(&ofiles,tmp);		}	else if (strequ(e,"c")) {		fmt = "%s -funsigned-char %s %s -o %s %s";		sz = strlen(CC)+strlen(flags.str)+strlen(cflags.str)+		     strlen(mname)+strlen(file)+strlen(fmt);		vtmp = malloc(sz);		sprintf(vtmp,fmt,CC,flags.str,cflags.str,mname,file);		if (status=System(vtmp)) Exit(status);		free(vtmp);		getHead(tmp,file);		strcat(tmp,".o");		addarg(&ofiles,tmp);		}	else if (strequ(e,"o")) {		addarg(&ofiles,file);		}	else if (strequ(e,"a")) {		addarg(&ofiles,file);		}	else {		fprintf(stderr,"pmcc: %s: bad extent\n",e);		Exit(1);		}	free(file);	}if (stoppoint != 0) Exit(0);/* Select math library */if (SZ) {	sprintf(tmp,"%s/libm/%s/libm.a",LSIPKG,ENDIAN);	if (fileExists(tmp)) strcpy(LIBM,tmp);	}/* Select C library */sprintf(LIBC,"%s/lib/%s%s",LSIPKG,ENDIAN,Gnum);if (stdcrt0) addcrt0(stdcrt0,LSIPKG,ENDIAN,Gnum);if (crt0.str == 0) Strcpy(&crt0,"");/* -nostdlib */sprintf(tmp,"%s.lk",ofile);sfp = fopen(tmp,"w");if (!sfp) {	fprintf(stderr,"can't open %s\n",tmp);	exit(1);	}wrfile(sfp,ld_cmd_file1);fprintf(sfp,".text 0x%s :\n",tstart);wrfile(sfp,ld_cmd_file2);if (dstart) {	if (prom) fprintf(sfp,".pdata 0x%s :\n AT(etext)\n",dstart);	else fprintf(sfp,".data 0x%s :\n",dstart);	}else fprintf(sfp,".data ALIGN(8) :\n");wrfile(sfp,ld_cmd_file3);fclose(sfp);fmt = "mips-lsi-elf-ld -N -M -T %s.lk %s %s %s %s %s > %s.map";sz = strlen(ofile)+strlen(ldflags.str)+Strlen(&crt0)+strlen(ofiles.str)+	strlen(initial_lc)+strlen(LIBS.str)+strlen(ofile)+strlen(fmt);vtmp = malloc(sz);sprintf(vtmp,fmt, ofile,ldflags.str,crt0.str,ofiles.str,initial_lc,LIBS.str,ofile);if (status=System(vtmp)) Exit(status);free(vtmp);if (syms || driver) fmt = "mips-lsi-elf-objcopy -O srec %s %s.tmp";else fmt = "mips-lsi-elf-objcopy -O srec %s %s.rec";sz = strlen(fmt)+strlen(ofile)+strlen(objfile);vtmp = malloc(sz);sprintf(vtmp,fmt,objfile,ofile);if (status=System(vtmp)) Exit(status);free(vtmp);if (driver) {	sprintf(tmp2,"%s.rec",ofile);	str2file(tmp2,"SD");	sprintf(tmp,"%s.tmp",ofile);	appendFile(tmp2,tmp);	unlink(tmp);	Exit(0);	}if (syms) {	sprintf(tmp,"%s.map",ofile);	sprintf(tmp2,"%s.rec",ofile);	mksyms(tmp,tmp2);	sprintf(tmp,"%s.tmp",ofile);	appendFile(tmp2,tmp);	}if (fast) { /* build fastFormat records */	sprintf(tmp,"%s.tmp",ofile);	sprintf(tmp2,"%s.rec",ofile);	unlink(tmp); /* make sure that there's no .tmp file */	rename(tmp2,tmp); /* rename .rec file as .tmp */	/* convert the srecs in the .tmp file to fastrecs. put the	result in .rec file */	sprintf(tmp,"rdsrec -f %s.tmp -o %s.rec",ofile,ofile);	if (status=System(tmp)) Exit(status); /* execute & exit if error */	}if (ssyms_flag) {	sprintf(tmp,"%s.map",ofile);	sprintf(tmp2,"%s.sym",ofile);	mksyms(tmp,tmp2);	}Exit(0);}/**************************************************************  getargs(argc,argv)*/getargs(argc,argv)int argc;char *argv[];{int i;/*# This while loop does several jobs:# 	1. strips off any pmcc defined options# 	2. some options, if specified, must preceed path specs# 	   so extract them from here, and add them to flags.# 	3. find the output filename, if specified*/for (i=1;i < argc;i++) {	if (strequ(argv[i],"-mips2")) {		addarg(&cflags,argv[i]);		addarg(&cflags,"-mcpu=r4000");		addarg(&asflags,argv[i]);		addarg(&asflags,"-mcpu=r4000");		mips4k = 1;		}	else if (strequ(argv[i],"-mips16")) {		addarg(&cflags,argv[i]);		addarg(&cflags,"-mcpu=r4000");		addarg(&asflags,argv[i]);		addarg(&asflags,"-mcpu=r4000");		mips16 = 1;		}	else if (!strncmp(argv[i],"-l",2)) {		sprintf(tmp,"-lx%s",&argv[i][2]);		addarg(&LIBS,tmp);		}	else if (strequ(argv[i],"-G")) {		i++;		addarg(&cflags,"-G");		addarg(&cflags,argv[i]); 		addarg(&asflags,"-G");		addarg(&asflags,argv[i]);		if (strequ(argv[i],"0")) Gnum = "g";		else Gnum = "o";		}	else if (strequ(argv[i],"-float")) {		addarg(&flags,argv[i]);		addarg(&flags,"-DFLOAT");		SZ = 1; 		}	else if (strequ(argv[i],"-soft-float")) {		addarg(&cflags,"-msoft-float");		addarg(&LIBS,"-lgcc -llsi");		soft_float = 1;		}	else if (getStdArgs(argc,argv,&i)) ;	else if (argv[i][0] == '-') {		fprintf(stderr,"%s: bad arg\n",argv[i]);		exit(1);		}	else {		addarg(&files,argv[i]);		nfiles++;		}	}}/**************************************************************  wrfile(fp,msg)*/wrfile(fp,msg)FILE *fp;char *msg[];{int i;for (i=0;msg[i];i++) fprintf(fp,"%s\n",msg[i]);}/**************************************************************  mksyms(char *ifn,char *ofn)*/mksyms(ifn,ofn)char *ifn,*ofn;{FILE *ifp,*ofp;char buf[100],*field[10];int nf,flag,csum,len;if (vflag) fprintf(stderr,"mksyms %s > %s\n",ifn,ofn);flag = 0;ifp = fopen(ifn,"r");if (ifp == 0) {	fprintf(stderr,"Can't open %s\n",ifn);	Exit(1);	}ofp = fopen(ofn,"w");if (ofp == 0) {	fprintf(stderr,"Can't open %s\n",ofn);	Exit(1);	}for (;;) {	if (!fgets(buf,100,ifp)) break;	buf[strlen(buf)-1] = 0;	if (strlen(buf)==0) continue;	if (buf[0] != ' ') continue;	nf = argvize(field,buf);	if (nf != 2) continue;	if (strlen(field[0]) != 18) continue;	if (strncmp(field[0],"0x00000000",10)) continue;	if (strchr(field[1],'=')) continue;	csum = 0;	len = strlen(field[1])+8+2;	fprintf(ofp,"S4%02X%s%s,%02x\n",len,&field[0][10],field[1],csum);	}fclose(ifp);fclose(ofp);}#ifndef Exit/**************************************************************  Exit(x)*/Exit(x)int x;{int i;for (i=0;strlst[i];i++) {	if (strlst[i]->str) free(strlst[i]->str);	}sprintf(tmp,"%s.t1",tmppath);if (fileExists(tmp)) unlink(tmp);sprintf(tmp,"%s.t2",tmppath);if (fileExists(tmp)) unlink(tmp);sprintf(tmp,"%s.sx",tmppath);if (fileExists(tmp)) unlink(tmp);exit(((x)>127)?1:(x));}#endif

⌨️ 快捷键说明

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