[BACK]Return to nm.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / nm

Diff for /src/usr.bin/nm/nm.c between version 1.12 and 1.13

version 1.12, 2001/08/16 15:45:05 version 1.13, 2001/08/17 14:25:26
Line 76 
Line 76 
 int fcount;  int fcount;
   
 int rev;  int rev;
 int fname(), rname(), value();  int fname __P((const void *, const void *));
 int (*sfunc)() = fname;  int rname __P((const void *, const void *));
   int value __P((const void *, const void *));
   int (*sfunc) __P((const void *, const void *)) = fname;
   
   
 /* some macros for symbol type (nlist.n_type) handling */  /* some macros for symbol type (nlist.n_type) handling */
Line 88 
Line 90 
 void    *emalloc __P((size_t));  void    *emalloc __P((size_t));
 void     pipe2cppfilt __P((void));  void     pipe2cppfilt __P((void));
 void     usage __P((void));  void     usage __P((void));
   char    *symname __P((struct nlist *));
   void    print_symbol __P((const char *, struct nlist *));
   
 /*  /*
  * main()   * main()
Line 330 
Line 334 
         char *objname;          char *objname;
         FILE *fp;          FILE *fp;
 {  {
         register struct nlist *names, *np;          struct nlist *names, *np;
           struct nlist **snames;
         register int i, nnames, nrawnames;          register int i, nnames, nrawnames;
         struct exec head;          struct exec head;
         long stabsize;          long stabsize;
Line 375 
Line 380 
         /* get memory for the symbol table */          /* get memory for the symbol table */
         names = emalloc((size_t)head.a_syms);          names = emalloc((size_t)head.a_syms);
         nrawnames = head.a_syms / sizeof(*names);          nrawnames = head.a_syms / sizeof(*names);
           snames = emalloc(nrawnames*sizeof(struct nlist *));
         if (fread((char *)names, (size_t)head.a_syms, (size_t)1, fp) != 1) {          if (fread((char *)names, (size_t)head.a_syms, (size_t)1, fp) != 1) {
                 warnx("%s: cannot read symbol table", objname);                  warnx("%s: cannot read symbol table", objname);
                 (void)free((char *)names);                  (void)free((char *)names);
Line 417 
Line 423 
          * filter out all entries which we don't want to print anyway           * filter out all entries which we don't want to print anyway
          */           */
         for (np = names, i = nnames = 0; i < nrawnames; np++, i++) {          for (np = names, i = nnames = 0; i < nrawnames; np++, i++) {
                 if (SYMBOL_TYPE(np->n_type) == N_UNDF && np->n_value)  
                         np->n_type = N_COMM | (np->n_type & N_EXT);  
                 if (!print_all_symbols && IS_DEBUGGER_SYMBOL(np->n_type))  
                         continue;  
                 if (print_only_external_symbols && !IS_EXTERNAL(np->n_type))  
                         continue;  
                 if (print_only_undefined_symbols &&  
                     SYMBOL_TYPE(np->n_type) != N_UNDF)  
                         continue;  
   
                 /*                  /*
                  * make n_un.n_name a character pointer by adding the string                   * make n_un.n_name a character pointer by adding the string
                  * table's base to n_un.n_strx                   * table's base to n_un.n_strx
Line 437 
Line 433 
                         np->n_un.n_name = stab + np->n_un.n_strx;                          np->n_un.n_name = stab + np->n_un.n_strx;
                 else                  else
                         np->n_un.n_name = "";                          np->n_un.n_name = "";
                 names[nnames++] = *np;                  if (SYMBOL_TYPE(np->n_type) == N_UNDF && np->n_value)
                           np->n_type = N_COMM | (np->n_type & N_EXT);
                   if (!print_all_symbols && IS_DEBUGGER_SYMBOL(np->n_type))
                           continue;
                   if (print_only_external_symbols && !IS_EXTERNAL(np->n_type))
                           continue;
                   if (print_only_undefined_symbols &&
                       SYMBOL_TYPE(np->n_type) != N_UNDF)
                           continue;
   
                   snames[nnames++] = np;
         }          }
   
         /* sort the symbol table if applicable */          /* sort the symbol table if applicable */
         if (sfunc)          if (sfunc)
                 qsort((char *)names, (size_t)nnames, sizeof(*names), sfunc);                  qsort(snames, (size_t)nnames, sizeof(*snames), sfunc);
   
         /* print out symbols */          /* print out symbols */
         for (np = names, i = 0; i < nnames; np++, i++)          for (i = 0; i < nnames; i++) {
                 print_symbol(objname, np);                  if (show_extensions && snames[i] != names &&
                       SYMBOL_TYPE((snames[i] -1)->n_type) == N_INDR)
                           continue;
                   print_symbol(objname, snames[i]);
           }
   
         (void)free((char *)names);          (void)free(snames);
           (void)free(names);
         (void)free(stab);          (void)free(stab);
         return(0);          return(0);
 }  }
   
   char *
   symname(sym)
           struct nlist *sym;
   {
           if (demangle && sym->n_un.n_name[0] == '_')
                   return sym->n_un.n_name + 1;
           else
                   return sym->n_un.n_name;
   }
   
 /*  /*
  * print_symbol()   * print_symbol()
  *      show one symbol   *      show one symbol
  */   */
   void
 print_symbol(objname, sym)  print_symbol(objname, sym)
         char *objname;          const char *objname;
         register struct nlist *sym;          struct nlist *sym;
 {  {
         char *typestring(), typeletter(), *otherstring();          char *typestring(), typeletter(), *otherstring();
   
Line 472 
Line 494 
          */           */
         if (!print_only_undefined_symbols) {          if (!print_only_undefined_symbols) {
                 /* print symbol's value */                  /* print symbol's value */
                 if (SYMBOL_TYPE(sym->n_type) == N_UNDF)                  if (SYMBOL_TYPE(sym->n_type) == N_UNDF ||
                       (show_extensions && SYMBOL_TYPE(sym->n_type) == N_INDR &&
                        sym->n_value == 0))
                         (void)printf("        ");                          (void)printf("        ");
                 else                  else
                         (void)printf("%08lx", sym->n_value);                          (void)printf("%08lx", sym->n_value);
Line 488 
Line 512 
                         (void)printf(" %c ", typeletter(sym->n_type));                          (void)printf(" %c ", typeletter(sym->n_type));
         }          }
   
         /* print the symbol's name */          if (SYMBOL_TYPE(sym->n_type) == N_INDR && show_extensions) {
         if (demangle && sym->n_un.n_name[0] == '_')                  printf("%s -> %s\n", symname(sym), symname(sym+1));
                 (void)puts(sym->n_un.n_name + 1);          }
         else          else
                 (void)puts(sym->n_un.n_name);                  (void)puts(symname(sym));
 }  }
   
 #define AUX_OBJECT 1  #define AUX_OBJECT 1
Line 612 
Line 636 
         return('?');          return('?');
 }  }
   
   int
 fname(a0, b0)  fname(a0, b0)
         void *a0, *b0;          const void *a0, *b0;
 {  {
         struct nlist *a = a0, *b = b0;          struct nlist * const *a = a0, * const *b = b0;
   
         return(strcmp(a->n_un.n_name, b->n_un.n_name));          return(strcmp((*a)->n_un.n_name, (*b)->n_un.n_name));
 }  }
   
   int
 rname(a0, b0)  rname(a0, b0)
         void *a0, *b0;          const void *a0, *b0;
 {  {
         struct nlist *a = a0, *b = b0;          struct nlist * const *a = a0, * const *b = b0;
   
         return(strcmp(b->n_un.n_name, a->n_un.n_name));          return(strcmp((*b)->n_un.n_name, (*a)->n_un.n_name));
 }  }
   
   int
 value(a0, b0)  value(a0, b0)
         void *a0, *b0;          const void *a0, *b0;
 {  {
         register struct nlist *a = a0, *b = b0;          struct nlist * const *a = a0, * const *b = b0;
   
         if (SYMBOL_TYPE(a->n_type) == N_UNDF)          if (SYMBOL_TYPE((*a)->n_type) == N_UNDF)
                 if (SYMBOL_TYPE(b->n_type) == N_UNDF)                  if (SYMBOL_TYPE((*b)->n_type) == N_UNDF)
                         return(0);                          return(0);
                 else                  else
                         return(-1);                          return(-1);
         else if (SYMBOL_TYPE(b->n_type) == N_UNDF)          else if (SYMBOL_TYPE((*b)->n_type) == N_UNDF)
                 return(1);                  return(1);
         if (rev) {          if (rev) {
                 if (a->n_value == b->n_value)                  if ((*a)->n_value == (*b)->n_value)
                         return(rname(a0, b0));                          return(rname(a0, b0));
                 return(b->n_value > a->n_value ? 1 : -1);                  return((*b)->n_value > (*a)->n_value ? 1 : -1);
         } else {          } else {
                 if (a->n_value == b->n_value)                  if ((*a)->n_value == (*b)->n_value)
                         return(fname(a0, b0));                          return(fname(a0, b0));
                 return(a->n_value > b->n_value ? 1 : -1);                  return((*a)->n_value > (*b)->n_value ? 1 : -1);
         }          }
 }  }
   

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.13