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

📄 cygnus.c

📁 mips架构的bootloader,99左右的版本 但源代码现在没人更新了
💻 C
字号:
/************************************************************* * File: tools/cygnus.c * Purpose: compiler driver for pmcc command for GNU tools from  *          Cygnus (ECOFF format). * Author: Phil Bunce (pjb@carmel.com) * Revision History: *	970304	Added -driver and -ice *	970313	Added -ssyms option (separate symbols) *	970314	Removed $LSIPKG refs in crtn pathnames *	970417	Added check for nfiles==0 *	970902	Removed -ice */#include <stdio.h>#include <malloc.h>#include <string.h>#include "../include/defines.h"#include "misc.h"/* set various defaults */int vflag = 0;	/* verbose flag */char *prom = "";int fast = 1;int ssyms_flag;char *syms = "-s";char *chksum = "";char *ofile = "a";char LIBM[100] = "/usr/lib/cmplrs/cc";int driver;char tmp[400],tmp2[400];char *ENDIAN,*Gnum,*LSIPMCC;char *COMP_HOST_ROOT;Str flags,cflags,asflags,ldflags,ppflags,rflags,llist,ilist,ofiles,LIBS;Str *strlst[] = {&flags,&cflags,&asflags,&ldflags,&ppflags,&rflags,&llist,	&ilist,&ofiles,&LIBS,0};char *LSIPKG,*CYGROOT;char LIBC[100];char objfile[100];char tstart[10];char *dstart;char *files[100];char *CC;int nfiles,msim;char stoppoint;char crt0[100];char tmppath[200],cpppath[200];char mname[32]; /* module object name */char *ld_cmd_file1[] = {	"OUTPUT_FORMAT(\"ecoff-bigmips\")",	"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) }",	0};	/*  .data     0x00d88000 :  */char *ld_cmd_file3[] = {	"  {",	"    _fdata = .;",	"    *(.data)",	"  }",	"  .rdata   . : { *(.rdata)   }",	"  .rodata  . : { *(.rodata)  }",	"  .rodata1 . : { *(.rodata1) }",	"  .data1   . : { *(.data1) }",	"  __gp_start = .;",	"  .lit8    . : { *(.lit8) }",	"  .lit4    . : { *(.lit4) }",	"  .sdata   . : { *(.sdata) }",	"  _edata  =  .;",	"  edata   =  .;",	"  .sbss    . : {",	"    *(.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,};/**************************************************************  main(argc,argv)*/main(argc,argv)int argc;char *argv[];{int i,status,SZ,sz;char *e,*p,h[20],*vtmp;FILE *cfp,*sfp;char tmp2[100];Str *f;SZ = 0;if (! (LSIPKG=getenv("LSIPKG"))) {	fprintf(stderr,"pmcc: LSIPKG not set\n");	exit(1);	}if (! (CYGROOT=getenv("CYGROOT"))) {	fprintf(stderr,"pmcc: CYGROOT not set\n");	exit(1);	}/* for backward compatability we set LSIPMCC */if (! (LSIPMCC=getenv("LSIPMCC"))) LSIPMCC = "";#ifdef SRECfast = 0;#endif#ifdef CLIENTPCsprintf(tmp,"%08x",CLIENTPC);strcpy(tstart,tmp);#elsestrcpy(tstart,"80020000");#endifstrcpy(tmppath,"/tmp/PMXXXXXX");mktemp(&tmppath[5]);#ifdef LENDEFENDIAN = "l";#elseENDIAN = "b";#endifGnum = "o";CC = "mips-idt-ecoff-gcc";strcpy(cpppath,CPPPATH);Strcpy(&LIBS,"");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(&ppflags,tmp);Strcpy(&flags,"");#ifdef MSIMmsim = 1;strcpy(crt0,"$LSIPKG/lib/bo/crt2.o");strcpy(tstart,"9fc00000");fast = 0;#endif/*# 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],"-fast")) fast = 1;	else if (!strncmp(argv[i],"-mips",5)) addarg(&flags,argv[i]);	else if (strequ(argv[i],"-msoft-float")) {		addarg(&flags,argv[i]);		}	else if (strequ(argv[i],"-driver")) {		driver = 1;		syms = 0;		sprintf(crt0,"%s/lib/%sg/crt3.o",LSIPKG,ENDIAN);		}#if 0 /* 970902 */	else if (strequ(argv[i],"-ice")) {		sprintf(crt0,"%s/lib/%so/crt4.o",LSIPKG,ENDIAN);		}#endif	else if (strequ(argv[i],"-prom")) {		prom = "-p";		fast = 0;		}	else if (strequ(argv[i],"-msim")) {		msim = 1;		strcpy(crt0,"$LSIPKG/lib/bo/crt2.o");		strcpy(tstart,"9fc00000");		fast = 0;		}	else if (strequ(argv[i],"-crt0")) strcpy(crt0," ");	else if (strequ(argv[i],"-T")) {		i++;		strcpy(tstart,argv[i]);		}	else if (strequ(argv[i],"-D")) {		i++;		dstart = argv[i];		}	else if (!strncmp(argv[i],"-D",2)) addarg(&ppflags,argv[i]);	else if (strequ(argv[i],"-target")) {		/* just to keep Sun make happy */		i++;		}	else if (strequ(argv[i],"-L")) Strcpy(&llist,"");	else if (!strncmp(argv[i],"-L",2)) addarg(&llist,argv[i]);	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(&flags,"-G");		addarg(&flags,argv[i]);		if (strequ(argv[i],"0")) Gnum = "g";		else Gnum = "o";		}	else if (strequ(argv[i],"-I")) Strcpy(&ilist,"");	else if (!strncmp(argv[i],"-I",2)) addarg(&ppflags,argv[i]);	else if (strequ(argv[i],"-g")) addarg(&flags,argv[i]);	else if (strequ(argv[i],"-c")) {		stoppoint = 'c';		addarg(&cflags,argv[i]);		}	else if (strequ(argv[i],"-S")) {		stoppoint = 'S';		addarg(&cflags,argv[i]);		}	else if (strequ(argv[i],"-v")) {		vflag = 1;		addarg(&flags,argv[i]);		}	else if (strequ(argv[i],"-srec")) fast = 0;	else if (strequ(argv[i],"-chksum")) chksum = "-c";	else if (strequ(argv[i],"-syms")) syms = "";	else if (strequ(argv[i],"-ssyms")) {		syms = "";		ssyms_flag = 1;		}	else if (!strncmp(argv[i],"-O",2)) addarg(&cflags,argv[i]);	else if (strequ(argv[i],"-float")) {		addarg(&flags,argv[i]);		addarg(&ppflags,"-DFLOAT");		SZ = 1; }	else if (strequ(argv[i],"-double")) SZ = 1;	else if (strequ(argv[i],"-EB")) ENDIAN = "b";	else if (strequ(argv[i],"-EL")) ENDIAN = "l";	else if (!strncmp(argv[i],"-W",2)) {		for (p=argv[i];*p;p++) if (*p == ',') *p = ' ';		switch (argv[i][2]) {			case 'c' : f = &cflags; break;			case 'a' : f = &asflags; break;			case 'l' : f = &ldflags; break;			}		addarg(f,&argv[i][4]);		}	else if (strequ(argv[i],"-o")) {		i++;		ofile = argv[i];		}	else if (strequ(argv[i],"-lm")) {		fprintf(stderr,"-lm Not supported by this toolset\n");		Exit(1);		}	else if (argv[i][0] == '-') {		fprintf(stderr,"%s: bad arg\n",argv[i]);		Exit(1);		}	else files[nfiles++] = argv[i];	}if (strequ(ENDIAN,"b")) {	addarg(&asflags,"-EB");	addarg(&cflags,"-EB");	addarg(&ppflags,"-DMIPSEB");	}else {	addarg(&asflags,"-EL");	addarg(&cflags,"-EL");	addarg(&ppflags,"-DMIPSEL");	}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(&ldflags,"-o");	addarg(&ldflags,objfile);	}else if (nfiles == 1) {	e = extent(files[0]);	getHead(h,files[0]);	if (strequ(e,"c")) {		addarg(&cflags,"-o");		if (!strequ(ofile,"a")) addarg(&cflags,ofile);		else {			if (stoppoint == 'c') sprintf(tmp,"%s.o",h);			else sprintf(tmp,"%s.s",h);			addarg(&cflags,tmp);			}		}	else if (strequ(e,"s")) {		addarg(&asflags,"-o");		if (!strequ(ofile,"a")) addarg(&asflags,ofile);		else {			sprintf(tmp,"%s.o",h);			addarg(&asflags,tmp);			}		}	}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 (nfiles == 0) {	printf("Fatal error: no files specified.\n"); 	exit(1); 	} /* now invoke the compiler */for (i=0;i<nfiles;i++) {	e = extent(files[i]);	getHead(h,files[i]);        if (nfiles == 1 && !strequ(ofile,"a") && stoppoint != 0)                strcpy(mname,ofile);        else sprintf(mname,"%s.o",h);	if (strequ(e,"s")) {		sprintf(tmp,"fixhash(%s,%s.t1)",files[i],tmppath);		if (vflag) fprintf(stderr,"%s\n",tmp);		sprintf(tmp,"%s.t1",tmppath);		fixhash(files[i],tmp);		getRoot(tmp2,files[i]);		sz = strlen(cpppath)+strlen(tmp2)+strlen(ppflags.str)+		     strlen(tmppath)+strlen(tmppath);		vtmp = malloc(sz+40);		sprintf(vtmp,"%s/cpp -I%s %s %s %s.t1 %s.t2",			cpppath,tmp2,ppflags.str,"-DLANGUAGE_ASSEMBLY",			tmppath,tmppath); 		if (vflag) fprintf(stderr,"%s\n",vtmp);		if (status=System(vtmp)) Exit(status);		free(vtmp);		sprintf(tmp,"%s.t2",tmppath);		sprintf(tmp2,"%s.S",tmppath);		if (vflag) fprintf(stderr,"fixstruct(%s,%s)\n",tmp,tmp2);		fixstruct(tmp,tmp2);		sz = strlen(CC)+strlen(flags.str)+strlen(ppflags.str)+		     strlen(tmp2)+ strlen(asflags.str)+strlen(mname)+		     strlen(tmppath);		vtmp = malloc(sz+20);		sprintf(vtmp,"%s -c %s %s -I%s %s -o %s %s.S",CC,flags.str,			ppflags.str,tmp2,asflags.str,mname,tmppath);		if (vflag) fprintf(stderr,"%s\n",vtmp);		if (status=System(vtmp)) Exit(status);		free(vtmp);		getHead(tmp,files[i]);		strcat(tmp,".o");		addarg(&ofiles,tmp);		}	else if (strequ(e,"c")) {		sz = strlen(CC)+strlen(ppflags.str)+strlen(flags.str)+		     strlen(cflags.str)+ strlen(files[i]);		vtmp = malloc(sz+10);		sprintf(vtmp,"%s %s %s %s %s",CC,ppflags.str,flags.str,			cflags.str,files[i]);		if (vflag) fprintf(stderr,"%s\n",vtmp);		if (status=System(vtmp)) Exit(status);		free(vtmp);		getHead(tmp,files[i]);		strcat(tmp,".o");		addarg(&ofiles,tmp);		}	else if (strequ(e,"o")) {		addarg(&ofiles,files[i]);		}	else {		fprintf(stderr,"%s: bad extent\n",e);		Exit(1);		}	}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 (crt0[0]==0) sprintf(crt0,"%s/crt0x.o",LIBC);/* -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) fprintf(sfp,".data 0x%s :\n",dstart);else fprintf(sfp,".data ALIGN(8) :\n");wrfile(sfp,ld_cmd_file3);sprintf(tmp,"mips-idt-ecoff-ld -N -M -T %s.lk %s %s %s -lxc %s > %s.map",	ofile,ldflags.str,crt0,ofiles.str,LIBS.str,ofile);fclose(sfp);if (status=System(tmp)) Exit(status);if (driver) {	sprintf(tmp,"%s.rec",ofile);	str2file(tmp,"SD");	sprintf(tmp,"gensrec %s >> %s.rec",objfile,ofile);	if (status=System(tmp)) Exit(status);	Exit(0);	}/* now make the appropriate download records */if (fast) sprintf(tmp,"genfrec %s %s %s > %s.rec",syms,chksum,objfile,ofile);else sprintf(tmp,"gensrec %s %s %s > %s.rec",prom,syms,objfile,ofile);if (status=System(tmp)) Exit(status);if (!ssyms_flag) Exit(0);if (fast) sprintf(tmp,"genfrec -e %s > %s.sym",objfile,ofile);else sprintf(tmp,"gensrec -e %s > %s.sym",objfile,ofile);if (status=System(tmp)) Exit(status);Exit(0);}/**************************************************************  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(f)*/mksyms(f)char *f;{FILE *mfp,*ofp;char buf[100],*field[10];int nf,flag,csum,len;if (vflag) fprintf(stderr,"mksyms %s.map > %s.rec\n",f,f);flag = 0;sprintf(tmp,"%s.map",f);mfp = fopen(tmp,"r");if (mfp == 0) {	fprintf(stderr,"Can't open %s\n",tmp);	Exit(1);	}sprintf(tmp,"%s.rec",f);ofp = fopen(tmp,"w");if (ofp == 0) {	fprintf(stderr,"Can't open %s\n",tmp);	Exit(1);	}for (;;) {	if (!fgets(buf,100,mfp)) 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]) != 8) continue;	csum = 0;	len = strlen(field[1])+8+2;	fprintf(ofp,"S4%02X%s%s,%02x\n",len,field[0],field[1],csum);	}fclose(mfp);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.S",tmppath);if (fileExists(tmp)) unlink(tmp);sprintf(tmp,"%s.t1",tmppath);if (fileExists(tmp)) unlink(tmp);sprintf(tmp,"%s.t2",tmppath);if (fileExists(tmp)) unlink(tmp);exit(((x)>127)?1:(x));}#endif

⌨️ 快捷键说明

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