1. Summary
  2. Files
  3. Support
  4. Report Spam
  5. Create account
  6. Log in

Changeset 1047

Show
Ignore:
Timestamp:
07/20/10 14:31:44 (4 years ago)
Author:
kaiwang27
Message:

Implemented readelf(1) option -p: dump section content as strings.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/readelf/readelf.c

    r1045 r1047  
    144144        size_t           sn;            /* section index */ 
    145145#define HEX_DUMP        0x0001 
     146#define STR_DUMP        0x0002 
    146147        int              op;            /* dump op type */ 
    147148        STAILQ_ENTRY(dumpop) dumpop_list; 
     
    50905091        int elferr, i, j; 
    50915092 
    5092         for (i = 1; (size_t)i < re->shnum; i++) { 
    5093                 if (find_dumpop(re, (size_t)i, HEX_DUMP) == NULL) 
     5093        for (i = 1; (size_t) i < re->shnum; i++) { 
     5094                if (find_dumpop(re, (size_t) i, HEX_DUMP) == NULL) 
    50945095                        continue; 
    50955096                s = &re->sl[i]; 
     
    51345135 
    51355136static void 
     5137str_dump(struct readelf *re) 
     5138{ 
     5139        struct section *s; 
     5140        Elf_Data *d; 
     5141        char *start, *end, *buf_end; 
     5142        unsigned int len; 
     5143        int i, j, elferr, found; 
     5144 
     5145        for (i = 1; (size_t) i < re->shnum; i++) { 
     5146                if (find_dumpop(re, (size_t) i, STR_DUMP) == NULL) 
     5147                        continue; 
     5148                s = &re->sl[i]; 
     5149                (void) elf_errno(); 
     5150                if ((d = elf_getdata(s->scn, NULL)) == NULL) { 
     5151                        elferr = elf_errno(); 
     5152                        if (elferr != 0) 
     5153                                warnx("elf_getdata failed: %s", 
     5154                                    elf_errmsg(elferr)); 
     5155                        continue; 
     5156                } 
     5157                if (d->d_size <= 0) 
     5158                        continue; 
     5159                buf_end = (char *) d->d_buf + d->d_size; 
     5160                start = d->d_buf; 
     5161                found = 0; 
     5162                printf("\nString dump of section '%s':\n", s->name); 
     5163                for (;;) { 
     5164                        while (start < buf_end && !isprint(*start)) 
     5165                                start++; 
     5166                        if (start >= buf_end) 
     5167                                break; 
     5168                        end = start + 1; 
     5169                        while (end < buf_end && isprint(*end)) 
     5170                                end++; 
     5171                        printf("  [%6lx]  ", (long) (start - (char *) d->d_buf)); 
     5172                        len = end - start; 
     5173                        for (j = 0; (unsigned int) j < len; j++) 
     5174                                putchar(start[j]); 
     5175                        putchar('\n'); 
     5176                        found = 1; 
     5177                        if (end >= buf_end) 
     5178                                break; 
     5179                        start = end + 1; 
     5180                } 
     5181                if (!found) 
     5182                        printf("  No strings found in this section."); 
     5183                putchar('\n'); 
     5184        } 
     5185} 
     5186 
     5187static void 
    51365188load_sections(struct readelf *re) 
    51375189{ 
     
    52445296        if (re->options & RE_X) 
    52455297                hex_dump(re); 
     5298        if (re->options & RE_P) 
     5299                str_dump(re); 
    52465300        if (re->options & RE_VV) 
    52475301                dump_ver(re); 
     
    57215775        STAILQ_INIT(&re->v_dumpop); 
    57225776 
    5723         while ((opt = getopt_long(argc, argv, "AacDdegHhIi:lNnprSstuVvWw:x:", 
     5777        while ((opt = getopt_long(argc, argv, "AacDdegHhIi:lNnp:rSstuVvWw:x:", 
    57245778            longopts, NULL)) != -1) { 
    57255779                switch(opt) { 
     
    57695823                case 'p': 
    57705824                        re->options |= RE_P; 
     5825                        sn = strtoul(optarg, NULL, 10); 
     5826                        add_dumpop(re, (size_t) sn, STR_DUMP); 
    57715827                        break; 
    57725828                case 'r': 
     
    58015857                        re->options |= RE_X; 
    58025858                        sn = strtoul(optarg, NULL, 10); 
    5803                         add_dumpop(re, (size_t)sn, HEX_DUMP); 
     5859                        add_dumpop(re, (size_t) sn, HEX_DUMP); 
    58045860                        break; 
    58055861                case OPTION_DEBUG_DUMP: