📄 cygelf.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 + -