brickos の makelx が扱えるシンボル長が短い件
とりあえず 80 文字制限はちょっとねーってことで 256 文字にしてみた。
brickos のバージョンは 0.9.0 です。
Index: srecload.c =================================================================== --- srecload.c (revision 19) +++ srecload.c (working copy) @@ -37,7 +37,7 @@ * kekoa@graphics.stanford.edu * 10/3/98 */ - + #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -50,20 +50,20 @@ #define IMG_HIGHEST 0xffff #define IMG_MAXSIZE 0x10000 +static char buf[256]; //! load symbols from symbolsrec file /*! \return current line in file - the symbol section is enclosed in $$ + the symbol section is enclosed in $$ symbol line format is SYMBOL $ADDR */ static int symbols_load(image_t *img,FILE *file) { - char buf[256]; int doubledollar=0; unsigned short text=0, text_end=0, - data=0, - data_end=0, + data=0, + data_end=0, bss=0, bss_end=0, ctors=0, @@ -72,10 +72,10 @@ dtors_end=0, _main=0; int line=0; - + // read in symbols // - while(doubledollar<2 && fgets(buf, 80, file)) { + while(doubledollar<2 && fgets(buf, sizeof(buf)-1, file)) { int i; line++; @@ -84,8 +84,8 @@ for(i=0; buf[i] && isspace(buf[i]); i++) ; if (!buf[i]) - continue; - + continue; + if(buf[i]=='$' && buf[i+1]=='$') { // delimiter? // @@ -95,62 +95,62 @@ // char *symbol; unsigned short address; - + if(doubledollar<1) { - fprintf(stderr,"malformed symbolsrec file at line %d\n",line); - exit(-1); + fprintf(stderr,"malformed symbolsrec file at line %d\n",line); + exit(-1); } - + // read symbol // symbol=buf+i; while(buf[i] && buf[i]!=' ') - i++; + i++; if(buf[i]!=' ' || buf[i+1]!='$') { - fprintf(stderr,"malformed symbolsrec file at line %d\n",line); - exit(-1); + fprintf(stderr,"malformed symbolsrec file at line %d\n",line); + exit(-1); } buf[i]=0; - + address=(unsigned short) strtoul(buf+i+2,NULL,16); - + // retain relevant offsets // if(!strcmp(symbol,"___text")) - text=address; + text=address; else if(!strcmp(symbol,"___text_end")) - text_end=address; + text_end=address; else if(!strcmp(symbol,"___data")) - data=address; + data=address; else if(!strcmp(symbol,"___data_end")) - data_end=address; + data_end=address; else if(!strcmp(symbol,"___bss")) - bss=address; + bss=address; else if(!strcmp(symbol,"___bss_end")) - bss_end=address; + bss_end=address; else if(!strcmp(symbol,"___ctors")) - ctors=address; + ctors=address; else if(!strcmp(symbol,"___ctors_end")) - ctors_end=address; + ctors_end=address; else if(!strcmp(symbol,"___dtors")) - dtors=address; + dtors=address; else if(!strcmp(symbol,"___dtors_end")) - dtors_end=address; + dtors_end=address; else if(!strcmp(symbol,"_main")) - _main=address; - } + _main=address; + } } // save general file information // - img->base =text; + img->base =text; // added ctor/dtor sections for C++. They reside between text and data // so they've been added to text for simplicity. -stephen 14Jan01 img->text_size=(text_end - text) + (ctors_end - ctors) + (dtors_end - dtors); img->data_size=data_end - data; img->bss_size = bss_end - bss; img->offset =_main-text; - + return line; } @@ -158,7 +158,6 @@ void image_load(image_t *img,const char *filename) { FILE *file; - char buf[256]; srec_t srec; int line; unsigned short size,start=0; @@ -172,15 +171,15 @@ // line=symbols_load(img,file); size=img->text_size+img->data_size; - + if((img->text=calloc(size,1))== NULL) { fprintf(stderr, "out of memory\n"); exit(1); } - - // Build an image of the srecord data + + // Build an image of the srecord data // - while (fgets(buf, 80, file)) { + while (fgets(buf, sizeof(buf)-1, file)) { int i,error; line++; @@ -189,34 +188,34 @@ for(i=0; buf[i] && isspace(buf[i]); i++) ; if (!buf[i]) - continue; + continue; // decode line // if ((error = srec_decode(&srec, buf)) < 0) { - char *errstr = NULL; - switch (error) { - case S_NULL: errstr = "null string error"; break; - case S_INVALID_HDR: errstr = "invalid header"; break; - case S_INVALID_CHAR: errstr = "invalid character"; break; - case S_INVALID_TYPE: errstr = "invalid type"; break; - case S_TOO_SHORT: errstr = "line to short"; break; - case S_TOO_LONG: errstr = "line too line"; break; - case S_INVALID_CKSUM: /* ignored */ break; - default: errstr = "unknown error"; break; - } - if (errstr) { - fprintf(stderr, "%s: %s on line %d\n", filename, errstr, line); - exit(1); - } + char *errstr = NULL; + switch (error) { + case S_NULL: errstr = "null string error"; break; + case S_INVALID_HDR: errstr = "invalid header"; break; + case S_INVALID_CHAR: errstr = "invalid character"; break; + case S_INVALID_TYPE: errstr = "invalid type"; break; + case S_TOO_SHORT: errstr = "line to short"; break; + case S_TOO_LONG: errstr = "line too line"; break; + case S_INVALID_CKSUM: /* ignored */ break; + default: errstr = "unknown error"; break; + } + if (errstr) { + fprintf(stderr, "%s: %s on line %d\n", filename, errstr, line); + exit(1); + } } - + // handle lines // if (srec.type == 1) { if (srec.addr < img->base || srec.addr + srec.count > img->base + size) { - fprintf(stderr, "%s: address [0x%4.4lX, 0x%4.4lX] out of bounds [0x%4.4X-0x%4.4X] on line %d\n",filename, srec.addr, (srec.addr + srec.count), img->base, (img->base + size), line); - exit(1); + fprintf(stderr, "%s: address [0x%4.4lX, 0x%4.4lX] out of bounds [0x%4.4X-0x%4.4X] on line %d\n",filename, srec.addr, (srec.addr + srec.count), img->base, (img->base + size), line); + exit(1); } memcpy(img->text + srec.addr - img->base, srec.data, srec.count);