/* * rdf2bin.c - convert an RDOFF object file to flat binary */ #include #include #include #include "rdfload.h" #include "nasmlib.h" long origin = 0; int align = 16; char *getfilename(char * pathname) { char * lastslash = pathname - 1; char * i = pathname; while ( *i ) { if (*i == '/') lastslash = i; i++; } return lastslash + 1; } int main(int argc, char **argv) { rdfmodule * m; int tmp; FILE *of; char * padding; int codepad, datapad, bsspad=0; if (argc < 2) { puts("Usage: rdf2bin [-o relocation-origin] [-p segment-alignment] " "input-file output-file"); puts(" rdf2com [-p segment-alignment] input-file output-file"); return 1; } if (! nasm_stricmp(getfilename(*argv),"rdf2com")) { origin = 0x100; } argv++, argc--; while (argc > 2) { if (! strcmp(*argv,"-o")) { argv++, argc--; origin = readnum(*argv, &tmp); if (tmp) { fprintf(stderr,"rdf2bin: invalid parameter: %s\n",*argv); return 1; } } else if (! strcmp(*argv,"-p")) { argv++, argc--; align = readnum(*argv, &tmp); if (tmp) { fprintf(stderr,"rdf2bin: invalid parameter: %s\n",*argv); return 1; } } else if (! strcmp(*argv,"-b")) { argv++, argc--; bsspad = readnum(*argv, &tmp); if (tmp) { fprintf(stderr,"rdf2bin: invalid parameter: %s\n",*argv); return 1; } } else break; argv++, argc--; } if (argc < 2) { puts("rdf2bin: required parameter missing"); return -1; } m = rdfload(*argv); if (! m) { rdfperror("rdf2bin",*argv); return 1; } printf("relocating %s: origin=%lx, align=%d\n",*argv,origin,align); m->textrel = origin; m->datarel = origin + m->f.seg[0].length; if (m->datarel % align != 0) { codepad = align - (m->datarel % align); m->datarel += codepad; } else codepad = 0; m->bssrel = m->datarel + m->f.seg[1].length; if (m->bssrel % align != 0) { datapad = align - (m->bssrel % align); m->bssrel += datapad; } else datapad = 0; printf("code: %08lx\ndata: %08lx\nbss: %08lx\n", m->textrel, m->datarel, m->bssrel); rdf_relocate(m); argv++; of = fopen(*argv,"wb"); if (!of) { fprintf(stderr,"rdf2bin: could not open output file %s\n",*argv); return 1; } padding = malloc(align); if (!padding) { fprintf(stderr,"rdf2bin: out of memory\n"); return 1; } if (fwrite(m->t,1,m->f.seg[0].length,of) != m->f.seg[0].length || fwrite(padding,1,codepad,of) != codepad || fwrite(m->d,1,m->f.seg[1].length,of) != m->f.seg[1].length) { fprintf(stderr,"rdf2bin: error writing to %s\n", *argv); return 1; } if (bsspad) { void *p = calloc(bsspad-=(m->bssrel - origin),1); fwrite(p,1,bsspad,of); } fclose(of); return 0; }