1 /* strings -- print the strings of printable characters in files
2 Copyright (C) 1993-2015 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3, or (at your option)
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
19 /* Usage: strings [options] file...
24 - Scan each file in its entirety.
27 -d Scan only the initialized data section(s) of object files.
30 -f Print the name of the file before each string.
34 -min-len Print graphic char sequences, MIN-LEN or more bytes long,
35 that are followed by a NUL or a newline. Default is 4.
38 -t {o,x,d} Print the offset within the file before each string,
41 --include-all-whitespace
42 -w By default tab and space are the only whitepace included in graphic
43 char sequences. This option considers all of isspace() valid.
45 -o Like -to. (Some other implementations have -o like -to,
46 others like -td. We chose one arbitrarily.)
48 --encoding={s,S,b,l,B,L}
50 Select character encoding: 7-bit-character, 8-bit-character,
51 bigendian 16-bit, littleendian 16-bit, bigendian 32-bit,
56 Specify a non-default object file format.
59 -h Print the usage message on the standard output.
63 -v Print the program version number.
65 Written by Richard Stallman <rms@gnu.ai.mit.edu>
66 and David MacKenzie <djm@gnu.ai.mit.edu>. */
71 #include "libiberty.h"
72 #include "safe-ctype.h"
75 #define STRING_ISGRAPHIC(c) \
78 && ((c) == '\t' || ISPRINT (c) || (encoding == 'S' && (c) > 127) \
79 || (include_all_whitespace == TRUE && ISSPACE (c))) \
86 /* The BFD section flags that identify an initialized data section. */
87 #define DATA_FLAGS (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS)
89 /* Radix for printing addresses (must be 8, 10 or 16). */
90 static int address_radix;
92 /* Minimum length of sequence of graphic chars to trigger output. */
93 static int string_min;
95 /* Whether or not we include all whitespace as a graphic char. */
96 static bfd_boolean include_all_whitespace;
98 /* TRUE means print address within file for each string. */
99 static bfd_boolean print_addresses;
101 /* TRUE means print filename for each string. */
102 static bfd_boolean print_filenames;
104 /* TRUE means for object files scan only the data section. */
105 static bfd_boolean datasection_only;
107 /* TRUE if we found an initialized data section in the current file. */
108 static bfd_boolean got_a_section;
110 /* The BFD object file format. */
113 /* The character encoding format. */
114 static char encoding;
115 static int encoding_bytes;
117 static struct option long_options[] =
119 {"all", no_argument, NULL, 'a'},
120 {"data", no_argument, NULL, 'd'},
121 {"print-file-name", no_argument, NULL, 'f'},
122 {"bytes", required_argument, NULL, 'n'},
123 {"radix", required_argument, NULL, 't'},
124 {"include-all-whitespace", required_argument, NULL, 'w'},
125 {"encoding", required_argument, NULL, 'e'},
126 {"target", required_argument, NULL, 'T'},
127 {"help", no_argument, NULL, 'h'},
128 {"version", no_argument, NULL, 'v'},
132 /* Records the size of a named file so that we
133 do not repeatedly run bfd_stat() on it. */
137 const char * filename;
138 bfd_size_type filesize;
139 } filename_and_size_t;
141 static void strings_a_section (bfd *, asection *, void *);
142 static bfd_boolean strings_object_file (const char *);
143 static bfd_boolean strings_file (char *);
144 static void print_strings (const char *, FILE *, file_ptr, int, int, char *);
145 static void usage (FILE *, int);
146 static long get_char (FILE *, file_ptr *, int *, char **);
148 int main (int, char **);
151 main (int argc, char **argv)
155 bfd_boolean files_given = FALSE;
159 #if defined (HAVE_SETLOCALE)
160 setlocale (LC_ALL, "");
162 bindtextdomain (PACKAGE, LOCALEDIR);
163 textdomain (PACKAGE);
165 program_name = argv[0];
166 xmalloc_set_program_name (program_name);
167 bfd_set_error_program_name (program_name);
169 expandargv (&argc, &argv);
172 include_all_whitespace = FALSE;
173 print_addresses = FALSE;
174 print_filenames = FALSE;
175 if (DEFAULT_STRINGS_ALL)
176 datasection_only = FALSE;
178 datasection_only = TRUE;
182 while ((optc = getopt_long (argc, argv, "adfhHn:wot:e:T:Vv0123456789",
183 long_options, (int *) 0)) != EOF)
188 datasection_only = FALSE;
192 datasection_only = TRUE;
196 print_filenames = TRUE;
204 string_min = (int) strtoul (optarg, &s, 0);
205 if (s != NULL && *s != 0)
206 fatal (_("invalid integer argument %s"), optarg);
210 include_all_whitespace = TRUE;
214 print_addresses = TRUE;
219 print_addresses = TRUE;
220 if (optarg[1] != '\0')
246 if (optarg[1] != '\0')
248 encoding = optarg[0];
253 print_version ("strings");
260 numeric_opt = optind;
265 if (numeric_opt != 0)
267 string_min = (int) strtoul (argv[numeric_opt - 1] + 1, &s, 0);
268 if (s != NULL && *s != 0)
269 fatal (_("invalid integer argument %s"), argv[numeric_opt - 1] + 1);
272 fatal (_("invalid minimum string length %d"), string_min);
293 set_default_bfd_target ();
297 datasection_only = FALSE;
298 SET_BINARY (fileno (stdin));
299 print_strings ("{standard input}", stdin, 0, 0, 0, (char *) NULL);
304 for (; optind < argc; ++optind)
306 if (strcmp (argv[optind], "-") == 0)
307 datasection_only = FALSE;
311 exit_status |= strings_file (argv[optind]) == FALSE;
319 return (exit_status);
322 /* Scan section SECT of the file ABFD, whose printable name is in
323 ARG->filename and whose size might be in ARG->filesize. If it
324 contains initialized data set `got_a_section' and print the
327 FIXME: We ought to be able to return error codes/messages for
328 certain conditions. */
331 strings_a_section (bfd *abfd, asection *sect, void *arg)
333 filename_and_size_t * filename_and_sizep;
334 bfd_size_type *filesizep;
335 bfd_size_type sectsize;
338 if ((sect->flags & DATA_FLAGS) != DATA_FLAGS)
341 sectsize = bfd_get_section_size (sect);
346 /* Get the size of the file. This might have been cached for us. */
347 filename_and_sizep = (filename_and_size_t *) arg;
348 filesizep = & filename_and_sizep->filesize;
354 if (bfd_stat (abfd, &st))
357 /* Cache the result so that we do not repeatedly stat this file. */
358 *filesizep = st.st_size;
361 /* Compare the size of the section against the size of the file.
362 If the section is bigger then the file must be corrupt and
363 we should not try dumping it. */
364 if (sectsize >= *filesizep)
367 mem = xmalloc (sectsize);
369 if (bfd_get_section_contents (abfd, sect, mem, (file_ptr) 0, sectsize))
371 got_a_section = TRUE;
373 print_strings (filename_and_sizep->filename, NULL, sect->filepos,
374 0, sectsize, (char *) mem);
380 /* Scan all of the sections in FILE, and print the strings
381 in the initialized data section(s).
383 Return TRUE if successful,
384 FALSE if not (such as if FILE is not an object file). */
387 strings_object_file (const char *file)
389 filename_and_size_t filename_and_size;
392 abfd = bfd_openr (file, target);
395 /* Treat the file as a non-object file. */
398 /* This call is mainly for its side effect of reading in the sections.
399 We follow the traditional behavior of `strings' in that we don't
400 complain if we don't recognize a file to be an object file. */
401 if (!bfd_check_format (abfd, bfd_object))
407 got_a_section = FALSE;
408 filename_and_size.filename = file;
409 filename_and_size.filesize = 0;
410 bfd_map_over_sections (abfd, strings_a_section, & filename_and_size);
412 if (!bfd_close (abfd))
418 return got_a_section;
421 /* Print the strings in FILE. Return TRUE if ok, FALSE if an error occurs. */
424 strings_file (char *file)
428 /* get_file_size does not support non-S_ISREG files. */
430 if (stat (file, &st) < 0)
433 non_fatal (_("'%s': No such file"), file);
435 non_fatal (_("Warning: could not locate '%s'. reason: %s"),
436 file, strerror (errno));
440 /* If we weren't told to scan the whole file,
441 try to open it as an object file and only look at
442 initialized data sections. If that fails, fall back to the
444 if (!datasection_only || !strings_object_file (file))
448 stream = fopen (file, FOPEN_RB);
451 fprintf (stderr, "%s: ", program_name);
456 print_strings (file, stream, (file_ptr) 0, 0, 0, (char *) 0);
458 if (fclose (stream) == EOF)
460 fprintf (stderr, "%s: ", program_name);
469 /* Read the next character, return EOF if none available.
470 Assume that STREAM is positioned so that the next byte read
471 is at address ADDRESS in the file.
473 If STREAM is NULL, do not read from it.
474 The caller can supply a buffer of characters
475 to be processed before the data in STREAM.
476 MAGIC is the address of the buffer and
477 MAGICCOUNT is how many characters are in it. */
480 get_char (FILE *stream, file_ptr *address, int *magiccount, char **magic)
485 for (i = 0; i < encoding_bytes; i++)
497 /* Only use getc_unlocked if we found a declaration for it.
498 Otherwise, libc is not thread safe by default, and we
499 should not use it. */
501 #if defined(HAVE_GETC_UNLOCKED) && HAVE_DECL_GETC_UNLOCKED
502 c = getc_unlocked (stream);
511 r = (r << 8) | (c & 0xff);
519 r = ((r & 0xff) << 8) | ((r & 0xff00) >> 8);
522 r = (((r & 0xff) << 24) | ((r & 0xff00) << 8)
523 | ((r & 0xff0000) >> 8) | ((r & 0xff000000) >> 24));
530 /* Find the strings in file FILENAME, read from STREAM.
531 Assume that STREAM is positioned so that the next byte read
532 is at address ADDRESS in the file.
533 Stop reading at address STOP_POINT in the file, if nonzero.
535 If STREAM is NULL, do not read from it.
536 The caller can supply a buffer of characters
537 to be processed before the data in STREAM.
538 MAGIC is the address of the buffer and
539 MAGICCOUNT is how many characters are in it.
540 Those characters come at address ADDRESS and the data in STREAM follow. */
543 print_strings (const char *filename, FILE *stream, file_ptr address,
544 int stop_point, int magiccount, char *magic)
546 char *buf = (char *) xmalloc (sizeof (char) * (string_min + 1));
554 /* See if the next `string_min' chars are all graphic chars. */
556 if (stop_point && address >= stop_point)
559 for (i = 0; i < string_min; i++)
561 c = get_char (stream, &address, &magiccount, &magic);
567 if (! STRING_ISGRAPHIC (c))
568 /* Found a non-graphic. Try again starting with next char. */
573 /* We found a run of `string_min' graphic characters. Print up
574 to the next non-graphic character. */
577 printf ("%s: ", filename);
579 switch (address_radix)
582 #ifdef HAVE_LONG_LONG
583 if (sizeof (start) > sizeof (long))
586 printf ("%7llo ", (unsigned long long) start);
588 printf ("%7I64o ", (unsigned long long) start);
592 #elif !BFD_HOST_64BIT_LONG
593 if (start != (unsigned long) start)
594 printf ("++%7lo ", (unsigned long) start);
597 printf ("%7lo ", (unsigned long) start);
601 #ifdef HAVE_LONG_LONG
602 if (sizeof (start) > sizeof (long))
605 printf ("%7lld ", (unsigned long long) start);
607 printf ("%7I64d ", (unsigned long long) start);
611 #elif !BFD_HOST_64BIT_LONG
612 if (start != (unsigned long) start)
613 printf ("++%7ld ", (unsigned long) start);
616 printf ("%7ld ", (long) start);
620 #ifdef HAVE_LONG_LONG
621 if (sizeof (start) > sizeof (long))
624 printf ("%7llx ", (unsigned long long) start);
626 printf ("%7I64x ", (unsigned long long) start);
630 #elif !BFD_HOST_64BIT_LONG
631 if (start != (unsigned long) start)
632 printf ("%lx%8.8lx ", (unsigned long) (start >> 32),
633 (unsigned long) (start & 0xffffffff));
636 printf ("%7lx ", (unsigned long) start);
645 c = get_char (stream, &address, &magiccount, &magic);
648 if (! STRING_ISGRAPHIC (c))
659 usage (FILE *stream, int status)
661 fprintf (stream, _("Usage: %s [option(s)] [file(s)]\n"), program_name);
662 fprintf (stream, _(" Display printable strings in [file(s)] (stdin by default)\n"));
663 fprintf (stream, _(" The options are:\n"));
665 if (DEFAULT_STRINGS_ALL)
666 fprintf (stream, _("\
667 -a - --all Scan the entire file, not just the data section [default]\n\
668 -d --data Only scan the data sections in the file\n"));
670 fprintf (stream, _("\
671 -a - --all Scan the entire file, not just the data section\n\
672 -d --data Only scan the data sections in the file [default]\n"));
674 fprintf (stream, _("\
675 -f --print-file-name Print the name of the file before each string\n\
676 -n --bytes=[number] Locate & print any NUL-terminated sequence of at\n\
677 -<number> least [number] characters (default 4).\n\
678 -t --radix={o,d,x} Print the location of the string in base 8, 10 or 16\n\
679 -w --include-all-whitespace Include all whitespace as valid string characters\n\
680 -o An alias for --radix=o\n\
681 -T --target=<BFDNAME> Specify the binary file format\n\
682 -e --encoding={s,S,b,l,B,L} Select character size and endianness:\n\
683 s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit\n\
684 @<file> Read options from <file>\n\
685 -h --help Display this information\n\
686 -v -V --version Print the program's version number\n"));
687 list_supported_targets (program_name, stream);
688 if (REPORT_BUGS_TO[0] && status == 0)
689 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);