diff options
author | Frank Kotler <fbkotler@users.sourceforge.net> | 2003-12-12 06:18:07 +0000 |
---|---|---|
committer | Frank Kotler <fbkotler@users.sourceforge.net> | 2003-12-12 06:18:07 +0000 |
commit | b4a1735c47570183b9ba6746a1e0b11a0e29513f (patch) | |
tree | 655fcc59f7c1c88a8127f1c80702c8a9b2368e50 | |
parent | f7956c4072428edd2cace7dadd0f5bb8826a0e8b (diff) | |
download | nasm-b4a1735c47570183b9ba6746a1e0b11a0e29513f.tar.gz nasm-b4a1735c47570183b9ba6746a1e0b11a0e29513f.tar.bz2 nasm-b4a1735c47570183b9ba6746a1e0b11a0e29513f.zip |
Update rdoff
-rw-r--r-- | doc/nasmdoc.src | 20 | ||||
-rw-r--r-- | output/outrdf2.c | 37 | ||||
-rw-r--r-- | rdoff/doc/rdoff.texi | 4 | ||||
-rw-r--r-- | rdoff/ldrdf.c | 250 | ||||
-rw-r--r-- | rdoff/rdfdump.c | 192 | ||||
-rw-r--r-- | rdoff/rdflib.c | 2 | ||||
-rw-r--r-- | rdoff/rdfload.c | 1 | ||||
-rw-r--r-- | rdoff/rdoff.c | 2 | ||||
-rw-r--r-- | rdoff/rdoff.h | 8 |
9 files changed, 269 insertions, 247 deletions
diff --git a/doc/nasmdoc.src b/doc/nasmdoc.src index a1253bf..0c61fc1 100644 --- a/doc/nasmdoc.src +++ b/doc/nasmdoc.src @@ -119,6 +119,7 @@ in \c{elf} \IR{elf shared libraries} ELF, shared libraries \IR{executable and linkable format} Executable and Linkable Format \IR{extern, obj extensions to} \c{EXTERN}, \c{obj} extensions to +\IR{extern, rdf extensions to} \c{EXTERN}, \c{rdf} extensions to \IR{freebsd} FreeBSD \IR{freelink} FreeLink \IR{functions, c calling convention} functions, C calling convention @@ -4543,6 +4544,25 @@ or \i\c{object} to the directive: \c global kernel_ticks:export data +\S{rdfimpt} \c{rdf} Extensions to the \c{EXTERN} directive\I{EXTERN, +rdf extensions to} + +By default the \c{EXTERN} directive in \c{RDOFF} declares a "pure external" +symbol (i.e. the static linker will complain if such a symbol is not resolved). +To declare an "imported" symbol, which must be resolved later during a dynamic +linking phase, \c{RDOFF} offers an additional \c{import} modifier. As in +\c{GLOBAL}, you can also specify whether an imported symbol is a procedure +(function) or data object. For example: + +\c library $libc +\c extern _open:import +\c extern _printf:import proc +\c extern _errno:import data + +Here the directive \c{LIBRARY} is also included, which gives the dynamic linker +a hint as to where to find requested symbols. + + \H{dbgfmt} \i\c{dbg}: Debugging Format The \c{dbg} output format is not built into NASM in the default diff --git a/output/outrdf2.c b/output/outrdf2.c index 1dfef93..931f872 100644 --- a/output/outrdf2.c +++ b/output/outrdf2.c @@ -70,6 +70,7 @@ struct RelocRec { struct ImportRec { byte type; /* must be 2, or 7 for FAR import */ byte reclen; /* equals 3+label length */ + byte flags; /* SYM_* flags (see below) */ int16 segment; /* segment number allocated to the label for reloc * records - label is assumed to be at offset zero * in this segment, so linker must fix up with offset @@ -109,9 +110,10 @@ struct CommonRec { }; /* Flags for ExportRec */ -#define SYM_DATA 0x01 -#define SYM_FUNCTION 0x02 -#define SYM_GLOBAL 0x04 +#define SYM_DATA 1 +#define SYM_FUNCTION 2 +#define SYM_GLOBAL 4 +#define SYM_IMPORT 8 #define COUNT_SEGTYPES 9 @@ -124,7 +126,7 @@ static int segmenttypenumbers[COUNT_SEGTYPES] = { 0, 1, 1, 2, 3, 4, 5, 6, 7 }; -/* code for managing buffers needed to seperate code and data into individual +/* code for managing buffers needed to separate code and data into individual * sections until they are ready to be written to the file. * We'd better hope that it all fits in memory else we're buggered... */ @@ -332,6 +334,7 @@ static void write_import_rec(struct ImportRec *r) saa_wbytes(header,&r->type,1); saa_wbytes(header,&r->reclen,1); + saa_wbytes(header,&r->flags,1); b = buf; WRITESHORT(b,r->segment); saa_wbytes(header,buf,2); saa_wbytes(header,r->label,strlen(r->label) + 1); @@ -389,7 +392,7 @@ static void rdf2_deflabel(char *name, long segment, long offset, struct CommonRec ci; static int farsym = 0; static int i; - byte export_flags = 0; + byte symflags = 0; if (is_global == 2) { /* Common variable */ @@ -425,7 +428,11 @@ static void rdf2_deflabel(char *name, long segment, long offset, if (!nasm_strnicmp(special, "export", 6)) { special += 6; - export_flags |= SYM_GLOBAL; + symflags |= SYM_GLOBAL; + } + else if (!nasm_strnicmp(special, "import", 6)) { + special += 6; + symflags |= SYM_IMPORT; } if (*special) { @@ -438,11 +445,11 @@ static void rdf2_deflabel(char *name, long segment, long offset, } else if (!nasm_stricmp(special, "proc") || !nasm_stricmp(special, "function")) { - export_flags |= SYM_FUNCTION; + symflags |= SYM_FUNCTION; } else if (!nasm_stricmp(special, "data") || !nasm_stricmp(special, "object")) { - export_flags |= SYM_DATA; + symflags |= SYM_DATA; } else error(ERR_NONFATAL, "unrecognised symbol type `%s'", special); @@ -458,18 +465,20 @@ static void rdf2_deflabel(char *name, long segment, long offset, if (segments[i].segnumber == segment>>1) break; } if (i >= nsegments) { /* EXTERN declaration */ - if (farsym) - ri.type = RDFREC_FARIMPORT; - else - ri.type = RDFREC_IMPORT; + ri.type = farsym ? RDFREC_FARIMPORT : RDFREC_IMPORT; + if (symflags & SYM_GLOBAL) + error(ERR_NONFATAL, "symbol type conflict - EXTERN cannot be EXPORT"); + ri.flags = symflags; ri.segment = segment; strncpy(ri.label,name,32); ri.label[32] = 0; - ri.reclen = 3 + strlen(ri.label); + ri.reclen = 4 + strlen(ri.label); write_import_rec(&ri); } else if (is_global) { r.type = RDFREC_GLOBAL; - r.flags = export_flags; + if (symflags & SYM_IMPORT) + error(ERR_NONFATAL, "symbol type conflict - GLOBAL cannot be IMPORT"); + r.flags = symflags; r.segment = segment; r.offset = offset; strncpy(r.label,name,32); diff --git a/rdoff/doc/rdoff.texi b/rdoff/doc/rdoff.texi index 8d3c1f3..c958cc3 100644 --- a/rdoff/doc/rdoff.texi +++ b/rdoff/doc/rdoff.texi @@ -12,7 +12,7 @@ @end titlepage @ifinfo -Copyright @copyright{} 2002 Netwide Assembler Project. +Copyright @copyright{} 2002-2003 Netwide Assembler Project. Written by Yuri Zaporogets @email{yuriz@@ukr.net} Based on various sources and notes written by Julian Hall @email{jules@@dsf.org.uk} Distributed under GNU documentation license. @@ -81,7 +81,7 @@ by a section header. @subsection Relocation records @node Import -@subsection Declaring external symbols +@subsection Declaring external and imported symbols @node Export @subsection Declaring public and exported symbols diff --git a/rdoff/ldrdf.c b/rdoff/ldrdf.c index 26c991e..f2ac92a 100644 --- a/rdoff/ldrdf.c +++ b/rdoff/ldrdf.c @@ -1,9 +1,12 @@ -/* ldrdf.c RDOFF Object File linker/loader main program +/* + * ldrdf.c - RDOFF Object File linker/loader main program. + * + * Copyright (c) 1996,99 Julian Hall. All rights reserved. + * Copyright (c) 2000-2003 RET & COM Research. * - * The Netwide Assembler is copyright (C) 1996 Simon Tatham and - * Julian Hall. All rights reserved. The software is - * redistributable under the licence given in the file "Licence" - * distributed in the NASM archive. + * This file is distributed under the terms and conditions of the + * GNU Lesser Public License (LGPL), version 2.1. + * See http://www.gnu.org/copyleft/lgpl.html for details. */ /* @@ -31,7 +34,7 @@ #include "rdlib.h" #include "segtab.h" -#define LDRDF_VERSION "1.05" +#define LDRDF_VERSION "1.07" #define RDF_MAXSEGS 64 /* #define STINGY_MEMORY */ @@ -114,7 +117,7 @@ long bss_length; struct ldrdfoptions { int verbose; int align; - int warnUnresolved; + int dynalink; int strip; int respfile; int stderr_redir; @@ -129,13 +132,11 @@ int errorcount = 0; /* determines main program exit status */ * Utility functions */ - /* * initsegments() * * sets up segments 0, 1, and 2, the initial code data and bss segments */ - void initsegments() { nsegs = 3; @@ -154,6 +155,7 @@ void initsegments() bss_length = 0; } + /* * loadmodule * @@ -161,34 +163,27 @@ void initsegments() * each segment it contains (including determining destination segments and * relocation factors for segments that are kept). */ - void loadmodule(const char * filename) { if (options.verbose) printf("loading `%s'\n", filename); /* allocate a new module entry on the end of the modules list */ - if (!modules) - { + if (!modules) { modules = malloc (sizeof(*modules)); lastmodule = modules; - } - else - { + } else { lastmodule->next = malloc (sizeof(*modules)); lastmodule = lastmodule->next; } - if ( ! lastmodule) - { + if (!lastmodule) { fprintf(stderr, "ldrdf: out of memory\n"); exit(1); } /* open the file using 'rdfopen', which returns nonzero on error */ - - if (rdfopen(&lastmodule->f, filename) != 0) - { + if (rdfopen(&lastmodule->f, filename) != 0) { rdfperror("ldrdf", filename); exit(1); } @@ -198,13 +193,13 @@ void loadmodule(const char * filename) * it contains, and what we should do with them (determine relocation * factor if we decide to keep them) */ - lastmodule->header = NULL; lastmodule->name = strdup(filename); lastmodule->next = NULL; processmodule(filename, lastmodule); } + /* * processmodule() @@ -215,7 +210,6 @@ void loadmodule(const char * filename) * (b) is fairly easy, because we're now keeping track of how big each * segment in our output file is... */ - void processmodule(const char * filename, struct modulenode * mod) { struct segconfig sconf; @@ -315,35 +309,35 @@ void processmodule(const char * filename, struct modulenode * mod) case RDFREC_IMPORT: /* imported symbol */ case RDFREC_FARIMPORT: /* Define with seg = -1 */ - symtab_add(hr->i.label, -1, 0); - break; + symtab_add(hr->i.label, -1, 0); + break; case RDFREC_GLOBAL: { /* exported symbol */ - int destseg; - long destreloc; + int destseg; + long destreloc; if (hr->e.segment == 2) { bss_was_referenced = 1; - destreloc = bss_length; - if (destreloc % options.align != 0) - destreloc += options.align - (destreloc % options.align); - destseg = 2; + destreloc = bss_length; + if (destreloc % options.align != 0) + destreloc += options.align - (destreloc % options.align); + destseg = 2; } else { - if ((destseg = mod->seginfo[(int)hr->e.segment].dest_seg) == -1) - continue; - destreloc = mod->seginfo[(int)hr->e.segment].reloc; - } - symtab_add(hr->e.label, destseg, destreloc + hr->e.offset); - break; - } + if ((destseg = mod->seginfo[(int)hr->e.segment].dest_seg) == -1) + continue; + destreloc = mod->seginfo[(int)hr->e.segment].reloc; + } + symtab_add(hr->e.label, destseg, destreloc + hr->e.offset); + break; + } case RDFREC_BSS: /* BSS reservation */ - /* - * first, amalgamate all BSS reservations in this module - * into one, because we allow this in the output format. - */ - bssamount += hr->b.amount; - break; + /* + * first, amalgamate all BSS reservations in this module + * into one, because we allow this in the output format. + */ + bssamount += hr->b.amount; + break; case RDFREC_COMMON: { /* Common variable */ symtabEnt *ste = symtabFind(symtab, hr->c.label); @@ -366,7 +360,7 @@ void processmodule(const char * filename, struct modulenode * mod) } } } - + if (bssamount != 0 || bss_was_referenced) { /* * handle the BSS segment - first pad the existing bss length @@ -375,7 +369,7 @@ void processmodule(const char * filename, struct modulenode * mod) * bss_length. */ if (bss_length % options.align != 0) - bss_length += options.align - (bss_length % options.align); + bss_length += options.align - (bss_length % options.align); mod->bss_reloc = bss_length; if (options.verbose > 1) { @@ -400,18 +394,18 @@ void processmodule(const char * filename, struct modulenode * mod) /* - * Look in the list for module by its name. + * Return 1 if a given module is in the list, 0 otherwise. */ int lookformodule(const char *name) - { - struct modulenode *curr=modules; +{ + struct modulenode *curr = modules; - while(curr) { - if (!strcmp(name,curr->name)) return 1; - curr = curr->next; - } - return 0; - } + while(curr) { + if (!strcmp(name, curr->name)) return 1; + curr = curr->next; + } + return 0; +} /* @@ -446,6 +440,7 @@ int findsegment(int16 type,int16 reserved) return allocnewseg(type,reserved); } + /* * symtab_add() * @@ -463,7 +458,6 @@ int findsegment(int16 type,int16 reserved) * routine won't change a previously existing symbol. It will change * to segment = -2 only if the segment was previously < 0. */ - void symtab_add(const char * symbol, int segment, long offset) { symtabEnt * ste; @@ -515,7 +509,6 @@ void symtab_add(const char * symbol, int segment, long offset) * are assumed to have -1:0 associated. Returns 1 if the symbol was * successfully located. */ - int symtab_get(const char * symbol, int * segment, long * offset) { symtabEnt * ste = symtabFind(symtab, symbol); @@ -532,13 +525,13 @@ int symtab_get(const char * symbol, int * segment, long * offset) } } + /* * add_library() * * checks that a library can be opened and is in the correct format, * then adds it to the linked list of libraries. */ - void add_library(const char * name) { if (rdl_verify(name)) { @@ -571,6 +564,7 @@ void add_library(const char * name) } } + /* * search_libraries() * @@ -581,7 +575,6 @@ void add_library(const char * name) * returns 1 if any extra library modules are included, indicating that * another pass through the library list should be made (possibly). */ - int search_libraries() { struct librarynode * cur; @@ -634,13 +627,13 @@ int search_libraries() * otherwise the symbol is just public. Find it in * the symbol table. If the symbol isn't defined, we * aren't interested, so go on to the next. - * If it is defined as anything but -1, we're also not - * interested. But if it is defined as -1, insert this - * module into the list of modules to use, and go - * immediately on to the next module... - */ + * If it is defined as anything but -1, we're also not + * interested. But if it is defined as -1, insert this + * module into the list of modules to use, and go + * immediately on to the next module... + */ if (!symtab_get(hr->e.label, &segment, &offset) || segment != -1) - continue; + continue; } doneanything = 1; @@ -664,10 +657,10 @@ int search_libraries() break; } if (!keepfile) { - free(f.name); - f.name = NULL; - f.fp = NULL; - } + free(f.name); + f.name = NULL; + f.fp = NULL; + } } if (rdl_error != 0 && rdl_error != RDL_ENOTFOUND) rdl_perror("ldrdf", cur->name); @@ -682,6 +675,7 @@ int search_libraries() return doneanything; } + /* * write_output() * @@ -719,10 +713,10 @@ void write_output(const char * filename) */ if (generic_rec_file) { FILE *ff; - + if (options.verbose) printf("\nadding generic record from binary file %s\n", generic_rec_file); - + hr = (rdfheaderrec *) malloc(sizeof(struct GenericRec)); if ((ff = fopen(generic_rec_file, "r")) == NULL) { fprintf(stderr, "ldrdf: couldn't open %s for input\n", generic_rec_file); @@ -734,10 +728,10 @@ void write_output(const char * filename) fprintf (error_file, "warning: maximum generic record size is %d, rest of file ignored\n", sizeof(hr->g.data)); } fclose(ff); - + hr->g.type = 0; hr->g.reclen = i; - rdfaddheader(rdfheader,hr); + rdfaddheader(rdfheader, hr); free(hr); } @@ -941,17 +935,10 @@ void write_output(const char * filename) */ se = symtabFind(symtab, hr->i.label); if (!se || se->segment == -1) { - if (options.warnUnresolved) { - switch (options.warnUnresolved) { - case 1: - fprintf(error_file, "warning"); - break; - case 2: - fprintf(error_file, "error"); - errorcount++; - } - fprintf(error_file, ": unresolved reference to `%s'" + if (!options.dynalink && !(hr->i.flags & SYM_IMPORT)) { + fprintf(error_file, "error: unresolved reference to `%s'" " in module `%s'\n", hr->i.label, cur->name); + errorcount++; } /* * we need to allocate a segment number for this @@ -984,7 +971,6 @@ void write_output(const char * filename) } add_seglocation(&segs, hr->i.segment, se->segment, se->offset); - break; case RDFREC_GLOBAL: /* export symbol */ @@ -1023,7 +1009,7 @@ void write_output(const char * filename) * Insert module name record if export symbols * are not stripped. * If module name begins with '$' - insert it anyway. - */ + */ if (options.strip && hr->m.modname[0] != '$') break; rdfaddheader(rdfheader, hr); break; @@ -1144,10 +1130,10 @@ void usage() " ldrdf [options] object modules ... [-llibrary ...]\n" " ldrdf -r\n" "options:\n" - " -v[=n] increases verbosity by 1, or sets it to n\n" - " -a nn sets segment alignment value (default 16)\n" - " -s strips exported symbols\n" - " -x warn about unresolved symbols\n" + " -v[=n] increase verbosity by 1, or set it to n\n" + " -a nn set segment alignment value (default 16)\n" + " -s strip public symbols\n" + " -dy Unix-style dynamic linking\n" " -o name write output in file 'name'\n" " -j path specify objects search path\n" " -L path specify libraries search path\n" @@ -1163,7 +1149,7 @@ int main(int argc, char ** argv) options.verbose = 0; options.align = 16; - options.warnUnresolved = 0; + options.dynalink = 0; options.strip = 0; error_file = stderr; @@ -1201,10 +1187,8 @@ int main(int argc, char ** argv) case 's': options.strip = 1; break; - case 'x': - options.warnUnresolved = 1; - if (argv[0][2]=='e') - options.warnUnresolved++; + case 'd': + if (argv[0][2] == 'y') options.dynalink = 1; break; case 'o': outname = argv[1]; @@ -1212,40 +1196,40 @@ int main(int argc, char ** argv) break; case 'j': if (!objpath) { - options.objpath = 1; - objpath = argv[1]; - argv++, argc--; - break; + options.objpath = 1; + objpath = argv[1]; + argv++, argc--; + break; } else { - fprintf(stderr,"ldrdf: more than one objects search path specified\n"); - exit(1); + fprintf(stderr,"ldrdf: more than one objects search path specified\n"); + exit(1); } case 'L': if (!libpath) { - options.libpath = 1; - libpath = argv[1]; - argv++, argc--; - break; + options.libpath = 1; + libpath = argv[1]; + argv++, argc--; + break; } else { - fprintf(stderr,"ldrdf: more than one libraries search path specified\n"); - exit(1); + fprintf(stderr,"ldrdf: more than one libraries search path specified\n"); + exit(1); } case '@': { - int i=0; - char buf[256]; - FILE *f; + int i=0; + char buf[256]; + FILE *f; - options.respfile = 1; - if (argv[1] != NULL) f = fopen(argv[1],"r"); + options.respfile = 1; + if (argv[1] != NULL) f = fopen(argv[1],"r"); else { fprintf(stderr,"ldrdf: no response file name specified\n"); exit(1); - } + } if (f == NULL) { fprintf(stderr,"ldrdf: unable to open response file\n"); exit(1); - } + } argv++, argc--; while (fgets(buf, sizeof(buf), f) != NULL) { @@ -1253,14 +1237,14 @@ int main(int argc, char ** argv) if (buf[0]=='\n') continue; if ((p = strchr(buf,'\n')) != NULL) *p = '\0'; if (i >= 128) { - fprintf(stderr,"ldrdf: too many input files\n"); - exit(1); - } - *(respstrings+i) = newstr(buf); + fprintf(stderr,"ldrdf: too many input files\n"); + exit(1); + } + *(respstrings + i) = newstr(buf); argc++, i++; - } + } break; - } + } case '2': options.stderr_redir = 1; error_file = stdout; @@ -1268,7 +1252,7 @@ int main(int argc, char ** argv) case 'g': generic_rec_file = argv[1]; argv++, argc--; - break; + break; default: usage(); } @@ -1281,14 +1265,12 @@ int main(int argc, char ** argv) printf(" output name: `%s'\n", outname); if (options.strip) printf(" strip symbols\n"); - if (options.warnUnresolved == 1) - printf(" warn about unresolved symbols\n"); - if (options.warnUnresolved == 2) - printf(" error if unresolved symbols\n"); + if (options.dynalink) + printf(" Unix-style dynamic linking\n"); if (options.objpath) - printf(" objects search path: %s\n",objpath); + printf(" objects search path: %s\n", objpath); if (options.libpath) - printf(" libraries search path: %s\n",libpath); + printf(" libraries search path: %s\n", libpath); printf("\n"); } @@ -1303,14 +1285,16 @@ int main(int argc, char ** argv) while (argc) { if (!*argv) argv = respstrings; if (!*argv) break; - if (!strncmp(*argv, "-l", 2)) /* library */ - { - if(libpath) add_library(newstrcat(libpath,*argv + 2)); - else add_library(*argv + 2); - } - else { - if(objpath) loadmodule(newstrcat(objpath,*argv)); - else loadmodule(*argv); + if (!strncmp(*argv, "-l", 2)) { + if(libpath && (*argv[2] != '/')) + add_library(newstrcat(libpath,*argv + 2)); + else + add_library(*argv + 2); + } else { + if(objpath && (*argv[0] != '/')) + loadmodule(newstrcat(objpath, *argv)); + else + loadmodule(*argv); moduleloaded = 1; } argv++, argc--; diff --git a/rdoff/rdfdump.c b/rdoff/rdfdump.c index d8690d2..09f2d80 100644 --- a/rdoff/rdfdump.c +++ b/rdoff/rdfdump.c @@ -10,8 +10,9 @@ FILE *infile; -long translatelong(long in) { /* translate from little endian to - local representation */ +/* Translate from little endian to local representation */ +long translatelong(long in) +{ long r; unsigned char *i; @@ -24,7 +25,8 @@ long translatelong(long in) { /* translate from little endian to return r; } -int16 translateshort(int16 in) { +int16 translateshort(int16 in) +{ int r; unsigned char *i; @@ -37,16 +39,16 @@ int16 translateshort(int16 in) { void print_header(long length, int rdf_version) { char buf[129],t,l,s,flags; - unsigned char reclen; - long o,ll; - int16 rs; - - while (length > 0) { - fread(&t,1,1,infile); - if (rdf_version >= 2) { - fread(&reclen,1,1,infile); - } - switch(t) { + unsigned char reclen; + long o,ll; + int16 rs; + + while (length > 0) { + fread(&t,1,1,infile); + if (rdf_version >= 2) { + fread(&reclen,1,1,infile); + } + switch(t) { case RDFREC_GENERIC: /* generic record */ printf(" generic record (length=%d)\n", (int)reclen); fseek(infile, reclen, SEEK_CUR); @@ -54,90 +56,92 @@ void print_header(long length, int rdf_version) case RDFREC_RELOC: /* relocation record */ case RDFREC_SEGRELOC: /* segment relocation */ - fread(&s,1,1,infile); - fread(&o,4,1,infile); - fread(&l,1,1,infile); - fread(&rs,2,1,infile); - printf(" %s: location (%04x:%08lx), length %d, " - "referred seg %04x\n", t == 1 ? "relocation" : "seg relocation", - (int)s,translatelong(o),(int)l, - translateshort(rs)); - if (rdf_version >= 2 && reclen != 8) - printf(" warning: reclen != 8\n"); - if (rdf_version == 1) length -= 9; - if (rdf_version == 1 && t == 6) - printf(" warning: seg relocation not supported in RDOFF1\n"); - break; + fread(&s,1,1,infile); + fread(&o,4,1,infile); + fread(&l,1,1,infile); + fread(&rs,2,1,infile); + printf(" %s: location (%04x:%08lx), length %d, " + "referred seg %04x\n", t == 1 ? "relocation" : "seg relocation", + (int)s,translatelong(o),(int)l, + translateshort(rs)); + if (rdf_version >= 2 && reclen != 8) + printf(" warning: reclen != 8\n"); + if (rdf_version == 1) length -= 9; + if (rdf_version == 1 && t == 6) + printf(" warning: seg relocation not supported in RDOFF1\n"); + break; case RDFREC_IMPORT: /* import record */ case RDFREC_FARIMPORT: /* import far symbol */ - fread(&rs,2,1,infile); - ll = 0; - - if (rdf_version == 1) { - do { - fread(&buf[ll],1,1,infile); - } while (buf[ll++]); + fread(&flags, 1, 1, infile); + fread(&rs, 2, 1, infile); + ll = 0; + + if (rdf_version == 1) { + do { + fread(&buf[ll], 1, 1, infile); + } while (buf[ll++]); } else { - for (;ll < reclen - 2; ll++) - fread(&buf[ll],1,1,infile); - } - - printf(" %simport: segment %04x = %s\n",t == 7 ? "far " : "", - translateshort(rs),buf); - if (rdf_version == 1) length -= ll + 3; - if (rdf_version == 1 && t == 7) - printf (" warning: far import not supported in RDOFF1\n"); - break; + for (;ll < reclen - 3; ll++) + fread(&buf[ll], 1, 1, infile); + } + + if (t == 7) + printf("far "); + printf((flags & SYM_IMPORT) ? " import" : " extern"); + if (flags & SYM_FUNCTION) printf(" proc"); + if (flags & SYM_DATA) printf(" data"); + printf(": segment %04x = %s\n", translateshort(rs), buf); + if (rdf_version == 1) length -= ll + 3; + if (rdf_version == 1 && t == 7) + printf (" warning: far import not supported in RDOFF1\n"); + break; case RDFREC_GLOBAL: /* export record */ - fread(&flags,1,1,infile); - fread(&s,1,1,infile); - fread(&o,4,1,infile); - ll = 0; - - if (rdf_version == 1) { - do { - fread(&buf[ll],1,1,infile); - } while (buf[ll++]); + fread(&flags, 1, 1, infile); + fread(&s, 1, 1, infile); + fread(&o, 4, 1, infile); + ll = 0; + + if (rdf_version == 1) { + do { + fread(&buf[ll], 1, 1, infile); + } while (buf[ll++]); } else { - for (; ll < reclen - 6; ll ++) - fread(&buf[ll],1,1,infile); - } - if (flags & SYM_GLOBAL) - printf(" export"); - else - printf(" global"); - if (flags & SYM_FUNCTION) printf(" proc"); - if (flags & SYM_DATA) printf(" data"); - printf(": (%04x:%08lx) = %s\n",(int)s,translatelong(o),buf); - if (rdf_version == 1) length -= ll + 6; - break; + for (; ll < reclen - 6; ll ++) + fread(&buf[ll], 1, 1, infile); + } + printf((flags & SYM_GLOBAL) ? " export" : " public"); + if (flags & SYM_FUNCTION) printf(" proc"); + if (flags & SYM_DATA) printf(" data"); + printf(": (%04x:%08lx) = %s\n", (int)s, translatelong(o), buf); + if (rdf_version == 1) length -= ll + 6; + break; case RDFREC_DLL: /* DLL and Module records */ case RDFREC_MODNAME: - ll = 0; - - if (rdf_version == 1) { - do { - fread(&buf[ll],1,1,infile); - } while (buf[ll++]); + ll = 0; + if (rdf_version == 1) { + do { + fread(&buf[ll],1,1,infile); + } while (buf[ll++]); } else { - for (; ll < reclen; ll++) - fread(&buf[ll],1,1,infile); - } - if (t==4) printf(" dll: %s\n",buf); - else printf(" module: %s\n",buf); - if (rdf_version == 1) length -= ll + 1; - break; + for (; ll < reclen; ll++) + fread(&buf[ll], 1, 1, infile); + } + if (t==4) printf(" dll: %s\n",buf); + else printf(" module: %s\n",buf); + if (rdf_version == 1) + length -= ll + 1; + break; case RDFREC_BSS: /* BSS reservation */ - fread(&ll,4,1,infile); - printf(" bss reservation: %08lx bytes\n",translatelong(ll)); - if (rdf_version == 1) length -= 5; - if (rdf_version > 1 && reclen != 4) - printf(" warning: reclen != 4\n"); - break; + fread(&ll,4,1,infile); + printf(" bss reservation: %08lx bytes\n",translatelong(ll)); + if (rdf_version == 1) length -= 5; + if (rdf_version > 1 && reclen != 4) + printf(" warning: reclen != 4\n"); + break; case RDFREC_COMMON: { unsigned short seg, align; @@ -150,19 +154,19 @@ void print_header(long length, int rdf_version) fread(buf+ll, 1, 1, infile); printf(" common: segment %04x = %s, %ld:%d\n", translateshort(seg), buf, translatelong(size), translateshort(align)); - break; + break; } - default: + default: printf(" unrecognized record (type %d", (int)t); - if (rdf_version > 1) { - printf(", length %d",(int)reclen); - fseek(infile,reclen,SEEK_CUR); + if (rdf_version > 1) { + printf(", length %d",(int)reclen); + fseek(infile,reclen,SEEK_CUR); } else length --; - printf(")\n"); + printf(")\n"); + } + if (rdf_version != 1) length -= 2 + reclen; } - if (rdf_version != 1) length -= 2 + reclen; - } } char * knowntypes[8] = {"NULL", "text", "data", "object comment", @@ -192,7 +196,9 @@ int main(int argc,char **argv) { long headerlength = 0; long objectlength = 0; - puts("RDOFF Dump utility v2.1\n(c) Copyright 1996,99,2000 Julian R Hall, Yuri M Zaporogets"); + puts("RDOFF Dump utility v2.2\n"\ + "Copyright (c) 1996,99 Julian R Hall\n" + "Copyright (c) 2000-2002 RET & COM Research."); if (argc < 2) { fputs("Usage: rdfdump [-v] <filename>\n",stderr); diff --git a/rdoff/rdflib.c b/rdoff/rdflib.c index 1ed22d4..41f92d2 100644 --- a/rdoff/rdflib.c +++ b/rdoff/rdflib.c @@ -25,9 +25,9 @@ #include <stdio.h> #include <stdlib.h> +#include <unistd.h> #include <errno.h> #include <string.h> -#include <unistd.h> #include <time.h> /* functions supported: diff --git a/rdoff/rdfload.c b/rdoff/rdfload.c index 6928ca2..4737282 100644 --- a/rdoff/rdfload.c +++ b/rdoff/rdfload.c @@ -19,7 +19,6 @@ #include <stdlib.h> #include <stdio.h> -#include <string.h> #include "rdfload.h" #include "symtab.h" diff --git a/rdoff/rdoff.c b/rdoff/rdoff.c index 43e3d65..504d842 100644 --- a/rdoff/rdoff.c +++ b/rdoff/rdoff.c @@ -377,6 +377,7 @@ rdfheaderrec *rdfgetheaderrec(rdffile *f) case RDFREC_IMPORT: /* Imported symbol record */ case RDFREC_FARIMPORT: + RI8(r.i.flags); RI16(r.i.segment); RS(r.i.label,32); break; @@ -464,6 +465,7 @@ int rdfaddheader(rdf_headerbuf * h, rdfheaderrec * r) case RDFREC_IMPORT: /* import */ case RDFREC_FARIMPORT: + membufwrite(h->buf,&r->i.flags,1); membufwrite(h->buf,&r->i.segment,-2); membufwrite(h->buf,&r->i.label,strlen(r->i.label) + 1); break ; diff --git a/rdoff/rdoff.h b/rdoff/rdoff.h index ee00c34..c6957dc 100644 --- a/rdoff/rdoff.h +++ b/rdoff/rdoff.h @@ -47,6 +47,7 @@ struct RelocRec { struct ImportRec { byte type; /* must be 2 */ byte reclen; /* content length */ + byte flags; /* SYM_* flags (see below) */ int16 segment; /* segment number allocated to the label for reloc records - label is assumed to be at offset zero in this segment, so linker must fix up with offset @@ -92,9 +93,10 @@ struct CommonRec { }; /* Flags for ExportRec */ -#define SYM_DATA 0x01 -#define SYM_FUNCTION 0x02 -#define SYM_GLOBAL 0x04 +#define SYM_DATA 1 +#define SYM_FUNCTION 2 +#define SYM_GLOBAL 4 +#define SYM_IMPORT 8 /* * GenericRec - contains the type and length field, plus a 128 byte |