home *** CD-ROM | disk | FTP | other *** search
/ PC-Online 1996 May / PCOnline_05_1996.bin / linux / source / a / bin / modules-.2 / modules- / modules-1.2.8 / depmod / symrev.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-30  |  2.6 KB  |  109 lines

  1. #include <stdio.h>
  2. #include <a.out.h>
  3. #include "link.h"
  4.  
  5. struct SYMBOL_REV {
  6.     struct nlist n;
  7.     struct symbol *child[2];
  8.     char *version;
  9. };
  10.  
  11. /*
  12.     Try to read a module with symbole/version pairs added by genmodinfo
  13. */
  14. PUBLIC int MODULE::loadobj_withrev(
  15.     const char *fname)
  16. {
  17.     int ret = -1;
  18.     FILE *fin = fopen(fname, "r");
  19.     if (fin == NULL) {
  20.         depmod_error("Cannot open %s", fname);
  21.     }else{
  22.         struct exec header;
  23.         if (fread(&header, sizeof header, 1, fp)!=1){
  24.             depmod_error ("Could not read header of %s", fname);
  25.         }else if (N_MAGIC(header) != OMAGIC) {
  26.             depmod_error ("%s: not an object file", fname);
  27.         }else{
  28.             // read in the symbol table
  29.             fseek(fp, 0L, SEEK_END);
  30.             long filesize = ftell(fp);
  31.             fseek(fp, N_SYMOFF(header), SEEK_SET);
  32.             int nbsym = header.a_syms / sizeof (struct nlist);
  33.             SYMBOL_REV *symtab = (SYMBOL_REV*) malloc(nbsym
  34.                 * sizeof (SYMBOL_REV));
  35.             if (symtab == NULL){
  36.                 depmod_error ("Can't allocate memory to read file %s"
  37.                     ,fname);
  38.             }else{
  39.                 SYMBOL_REV *sp = symtab;
  40.                 for (int i = 0; i < nbsym; i++, sp++) {
  41.                     fread(&sp->n, sizeof sp->n, 1, fp);
  42.                     sp->child[0] = sp->child[1] = NULL;
  43.                     sp->version = NULL;
  44.                 }
  45.                 if (feof(fp) || ferror(fp)) {
  46.                     depmod_error ("Error reading %s", fname);
  47.                 }else{
  48.                     long len = filesize - N_STROFF(header);
  49.                     char *stringtab = (char*) malloc(len);
  50.                     if (stringtab != NULL){
  51.                         if (fread(stringtab, 1, len, fp) != len){
  52.                             depmod_error ("Error reading %s", filename);
  53.                         }
  54.         symroot = NULL;
  55.         for (i = nsymbols, sp = symtab ; --i >= 0 ; sp++) {
  56.             pos = sp->n.n_un.n_strx;
  57.             if (pos < 0 || pos >= len) {
  58.                 depmod_error ("Bad nlist entry");
  59.                 exit(2);
  60.             }
  61.             /* look up name and add sp to binary tree */
  62.             findsym(stringtab + sp->n.n_un.n_strx, sp);
  63.             if ((sp->n.n_type & N_EXT) && (sp->n.n_type != N_EXT))
  64.                 sp->n.n_other = DEF_BY_MODULE; /* abuse: mark extdef */
  65.             else
  66.                 sp->n.n_other = 0; /* abuse: mark extref */
  67.         }
  68.  
  69.         /* look for appended modinfo */
  70.         for (i = 0, p = stringtab + len; i < len; --p, ++i) {
  71.             if ((*p == '#') && (strncmp(p, "#modinfo\n", 9) == 0)) {
  72.                 struct symbol *xsp;
  73.                 char *nl;
  74.                 char use[10];
  75.                 char symname[SYM_MAX_NAME];
  76.  
  77.                 modinfo = p;
  78.                 nl = strchr(p, '\n');
  79.                 ++nl;
  80.                 p = nl;
  81.  
  82.                 while (nl && (nl < stringtab + len)) {
  83.                     if ((nl = strchr(p, '\n'))) {
  84.                         *nl = '\0';
  85.                         if ((nl != p) && (*p != '#') &&
  86.                         (sscanf(p, "%s%s", use, symname) == 2)) {
  87.                             xsp = findsym(symname, NULL);
  88.                             if (xsp) {
  89.                                 p = nl;
  90.                                 while (*--p > ' ')
  91.                                     ;
  92.                                 xsp->version = p + 1;
  93.                             }
  94.  
  95.                         }
  96.  
  97.                         ++nl;
  98.                         p = nl;
  99.                     }
  100.                 }
  101.                 break;
  102.             }
  103.         }
  104.         fclose (fin);
  105.     }
  106.     return ret;
  107. }
  108.  
  109.