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

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

version 1.13, 2005/01/19 19:37:29 version 1.14, 2006/09/30 14:34:13
Line 60 
Line 60 
 #define elf_fix_phdrs   elf32_fix_phdrs  #define elf_fix_phdrs   elf32_fix_phdrs
 #define elf_fix_sym     elf32_fix_sym  #define elf_fix_sym     elf32_fix_sym
 #define elf_size        elf32_size  #define elf_size        elf32_size
   #define elf_symloadx    elf32_symloadx
 #define elf_symload     elf32_symload  #define elf_symload     elf32_symload
 #define elf2nlist       elf32_2nlist  #define elf2nlist       elf32_2nlist
 #define elf_shn2type    elf32_shn2type  #define elf_shn2type    elf32_shn2type
Line 84 
Line 85 
 #define elf_fix_phdrs   elf64_fix_phdrs  #define elf_fix_phdrs   elf64_fix_phdrs
 #define elf_fix_sym     elf64_fix_sym  #define elf_fix_sym     elf64_fix_sym
 #define elf_size        elf64_size  #define elf_size        elf64_size
   #define elf_symloadx    elf64_symloadx
 #define elf_symload     elf64_symload  #define elf_symload     elf64_symload
 #define elf2nlist       elf64_2nlist  #define elf2nlist       elf64_2nlist
 #define elf_shn2type    elf64_shn2type  #define elf_shn2type    elf64_shn2type
Line 367 
Line 369 
                 if (ELF_ST_BIND(sym->st_info) == STB_WEAK) {                  if (ELF_ST_BIND(sym->st_info) == STB_WEAK) {
                         np->n_type = N_INDR;                          np->n_type = N_INDR;
                         np->n_other = 'W';                          np->n_other = 'W';
                 } else if (sn != NULL &&                  } else if (sn != NULL && *sn != 0 &&
                     strcmp(sn, ELF_INIT) &&                      strcmp(sn, ELF_INIT) &&
                     strcmp(sn, ELF_TEXT) &&                      strcmp(sn, ELF_TEXT) &&
                     strcmp(sn, ELF_FINI))       /* XXX GNU compat */                      strcmp(sn, ELF_FINI))       /* XXX GNU compat */
Line 430 
Line 432 
 }  }
   
 int  int
 elf_symload(const char *name, FILE *fp, off_t foff, Elf_Ehdr *eh,  elf_symloadx(const char *name, FILE *fp, off_t foff, Elf_Ehdr *eh,
     Elf_Shdr *shdr, struct nlist **pnames, struct nlist ***psnames,      Elf_Shdr *shdr, char *shstr, struct nlist **pnames,
     size_t *pstabsize, int *pnrawnames)      struct nlist ***psnames, size_t *pstabsize, int *pnrawnames,
       const char *strtab, const char *symtab)
 {  {
         long symsize, shstrsize;          long symsize;
         struct nlist *np;          struct nlist *np;
         Elf_Sym sbuf;          Elf_Sym sbuf;
         char *shstr;  
         int i;          int i;
   
         shstrsize = shdr[eh->e_shstrndx].sh_size;  
         if ((shstr = malloc(shstrsize)) == NULL) {  
                 warn("%s: malloc shsrt", name);  
                 return (1);  
         }  
   
         if (fseeko(fp, foff + shdr[eh->e_shstrndx].sh_offset, SEEK_SET)) {  
                 warn("%s: fseeko", name);  
                 free(shstr);  
                 return (1);  
         }  
   
         if (fread(shstr, 1, shstrsize, fp) != shstrsize) {  
                 warnx("%s: premature EOF", name);  
                 free(shstr);  
                 return(1);  
         }  
   
         stab = NULL;  
         *pnames = NULL; *psnames = NULL;  
         for (i = 0; i < eh->e_shnum; i++) {          for (i = 0; i < eh->e_shnum; i++) {
                 if (!strcmp(shstr + shdr[i].sh_name, ELF_STRTAB)) {                  if (!strcmp(shstr + shdr[i].sh_name, strtab)) {
                         *pstabsize = shdr[i].sh_size;                          *pstabsize = shdr[i].sh_size;
                         if (*pstabsize > SIZE_T_MAX) {                          if (*pstabsize > SIZE_T_MAX) {
                                 warnx("%s: corrupt file", name);                                  warnx("%s: corrupt file", name);
Line 478 
Line 460 
                 }                  }
         }          }
         for (i = 0; i < eh->e_shnum; i++) {          for (i = 0; i < eh->e_shnum; i++) {
                 if (!strcmp(shstr + shdr[i].sh_name, ELF_SYMTAB)) {                  if (!strcmp(shstr + shdr[i].sh_name, symtab)) {
                         symsize = shdr[i].sh_size;                          symsize = shdr[i].sh_size;
                         if (fseeko(fp, foff + shdr[i].sh_offset, SEEK_SET)) {                          if (fseeko(fp, foff + shdr[i].sh_offset, SEEK_SET)) {
                                 warn("%s: fseeko", name);                                  warn("%s: fseeko", name);
Line 531 
Line 513 
                         }                          }
                         *pnrawnames = np - *pnames;                          *pnrawnames = np - *pnames;
                 }                  }
           }
   
   }
   
   int
   elf_symload(const char *name, FILE *fp, off_t foff, Elf_Ehdr *eh,
       Elf_Shdr *shdr, struct nlist **pnames, struct nlist ***psnames,
       size_t *pstabsize, int *pnrawnames)
   {
           long shstrsize;
           char *shstr;
   
           shstrsize = shdr[eh->e_shstrndx].sh_size;
           if ((shstr = malloc(shstrsize)) == NULL) {
                   warn("%s: malloc shsrt", name);
                   return (1);
           }
   
           if (fseeko(fp, foff + shdr[eh->e_shstrndx].sh_offset, SEEK_SET)) {
                   warn("%s: fseeko", name);
                   free(shstr);
                   return (1);
           }
   
           if (fread(shstr, 1, shstrsize, fp) != shstrsize) {
                   warnx("%s: premature EOF", name);
                   free(shstr);
                   return(1);
           }
   
           stab = NULL;
           *pnames = NULL; *psnames = NULL;
           elf_symloadx(name, fp, foff, eh, shdr, shstr, pnames,
               psnames, pstabsize, pnrawnames, ELF_STRTAB, ELF_SYMTAB);
           if (stab == NULL) {
                   elf_symloadx(name, fp, foff, eh, shdr, shstr, pnames,
                       psnames, pstabsize, pnrawnames, ELF_DYNSTR, ELF_DYNSYM);
         }          }
   
         free(shstr);          free(shstr);

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