1 /* strings -- print the strings of printable characters in files
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 /* Usage: strings [options] file...
25 - Do not scan only the initialized data section of object files.
28 -f Print the name of the file before each string.
32 -min-len Print graphic char sequences, MIN-LEN or more bytes long,
33 that are followed by a NUL or a newline. Default is 4.
36 -t {o,x,d} Print the offset within the file before each string,
39 -o Like -to. (Some other implementations have -o like -to,
40 others like -td. We chose one arbitrarily.)
42 --encoding={s,b,l,B,L}
44 Select character encoding: single-byte, bigendian 16-bit,
45 littleendian 16-bit, bigendian 32-bit, littleendian 32-bit
48 Specify a non-default object file format.
51 -h Print the usage message on the standard output.
54 -v Print the program version number.
56 Written by Richard Stallman <rms@gnu.ai.mit.edu>
57 and David MacKenzie <djm@gnu.ai.mit.edu>. */
64 #include "libiberty.h"
65 #include "safe-ctype.h"
67 /* Some platforms need to put stdin into binary mode, to read
72 #define O_BINARY _O_BINARY
73 #define setmode _setmode
80 #define SET_BINARY(f) do { if (!isatty(f)) setmode(f,O_BINARY); } while (0)
84 #define isgraphic(c) (ISPRINT (c) || (c) == '\t')
90 /* The BFD section flags that identify an initialized data section. */
91 #define DATA_FLAGS (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS)
93 /* Radix for printing addresses (must be 8, 10 or 16). */
94 static int address_radix
;
96 /* Minimum length of sequence of graphic chars to trigger output. */
97 static int string_min
;
99 /* true means print address within file for each string. */
100 static boolean print_addresses
;
102 /* true means print filename for each string. */
103 static boolean print_filenames
;
105 /* true means for object files scan only the data section. */
106 static boolean datasection_only
;
108 /* true if we found an initialized data section in the current file. */
109 static boolean got_a_section
;
111 /* The BFD object file format. */
114 /* The character encoding format. */
115 static char encoding
;
116 static int encoding_bytes
;
118 static struct option long_options
[] =
120 {"all", no_argument
, NULL
, 'a'},
121 {"print-file-name", no_argument
, NULL
, 'f'},
122 {"bytes", required_argument
, NULL
, 'n'},
123 {"radix", required_argument
, NULL
, 't'},
124 {"encoding", required_argument
, NULL
, 'e'},
125 {"target", required_argument
, NULL
, 'T'},
126 {"help", no_argument
, NULL
, 'h'},
127 {"version", no_argument
, NULL
, 'v'},
131 static void strings_a_section
PARAMS ((bfd
*, asection
*, PTR
));
132 static boolean strings_object_file
PARAMS ((const char *));
133 static boolean strings_file
PARAMS ((char *file
));
134 static int integer_arg
PARAMS ((char *s
));
135 static void print_strings
PARAMS ((const char *filename
, FILE *stream
,
136 file_ptr address
, int stop_point
,
137 int magiccount
, char *magic
));
138 static void usage
PARAMS ((FILE *stream
, int status
));
147 boolean files_given
= false;
149 #if defined (HAVE_SETLOCALE)
150 setlocale (LC_ALL
, "");
152 bindtextdomain (PACKAGE
, LOCALEDIR
);
153 textdomain (PACKAGE
);
155 program_name
= argv
[0];
156 xmalloc_set_program_name (program_name
);
158 print_addresses
= false;
159 print_filenames
= false;
160 datasection_only
= true;
164 while ((optc
= getopt_long (argc
, argv
, "afn:ot:e:v0123456789",
165 long_options
, (int *) 0)) != EOF
)
170 datasection_only
= false;
174 print_filenames
= true;
181 string_min
= integer_arg (optarg
);
184 fatal (_("invalid number %s"), optarg
);
189 print_addresses
= true;
194 print_addresses
= true;
195 if (optarg
[1] != '\0')
221 if (optarg
[1] != '\0')
223 encoding
= optarg
[0];
227 print_version ("strings");
235 string_min
= optc
- '0';
237 string_min
= string_min
* 10 + optc
- '0';
263 set_default_bfd_target ();
267 datasection_only
= false;
269 SET_BINARY (fileno (stdin
));
271 print_strings ("{standard input}", stdin
, 0, 0, 0, (char *) NULL
);
276 for (; optind
< argc
; ++optind
)
278 if (strcmp (argv
[optind
], "-") == 0)
279 datasection_only
= false;
283 exit_status
|= (strings_file (argv
[optind
]) == false);
288 if (files_given
== false)
291 return (exit_status
);
294 /* Scan section SECT of the file ABFD, whose printable name is FILE.
295 If it contains initialized data,
296 set `got_a_section' and print the strings in it. */
299 strings_a_section (abfd
, sect
, filearg
)
304 const char *file
= (const char *) filearg
;
306 if ((sect
->flags
& DATA_FLAGS
) == DATA_FLAGS
)
308 bfd_size_type sz
= bfd_get_section_size_before_reloc (sect
);
309 PTR mem
= xmalloc (sz
);
310 if (bfd_get_section_contents (abfd
, sect
, mem
, (file_ptr
) 0, sz
))
312 got_a_section
= true;
313 print_strings (file
, (FILE *) NULL
, sect
->filepos
, 0, sz
, mem
);
319 /* Scan all of the sections in FILE, and print the strings
320 in the initialized data section(s).
322 Return true if successful,
323 false if not (such as if FILE is not an object file). */
326 strings_object_file (file
)
329 bfd
*abfd
= bfd_openr (file
, target
);
333 /* Treat the file as a non-object file. */
337 /* This call is mainly for its side effect of reading in the sections.
338 We follow the traditional behavior of `strings' in that we don't
339 complain if we don't recognize a file to be an object file. */
340 if (bfd_check_format (abfd
, bfd_object
) == false)
346 got_a_section
= false;
347 bfd_map_over_sections (abfd
, strings_a_section
, (PTR
) file
);
349 if (!bfd_close (abfd
))
355 return got_a_section
;
358 /* Print the strings in FILE. Return true if ok, false if an error occurs. */
364 /* If we weren't told to scan the whole file,
365 try to open it as an object file and only look at
366 initialized data sections. If that fails, fall back to the
368 if (!datasection_only
|| !strings_object_file (file
))
372 stream
= fopen (file
, "rb");
373 /* Not all systems permit "rb", so try "r" if it failed. */
375 stream
= fopen (file
, "r");
378 fprintf (stderr
, "%s: ", program_name
);
383 print_strings (file
, stream
, (file_ptr
) 0, 0, 0, (char *) 0);
385 if (fclose (stream
) == EOF
)
387 fprintf (stderr
, "%s: ", program_name
);
396 /* Read the next character, return EOF if none available.
397 Assume that STREAM is positioned so that the next byte read
398 is at address ADDRESS in the file.
400 If STREAM is NULL, do not read from it.
401 The caller can supply a buffer of characters
402 to be processed before the data in STREAM.
403 MAGIC is the address of the buffer and
404 MAGICCOUNT is how many characters are in it. */
407 get_char (stream
, address
, magiccount
, magic
)
415 unsigned char buf
[4];
417 for (i
= 0; i
< encoding_bytes
; i
++)
443 r
= (buf
[0] << 8) | buf
[1];
446 r
= buf
[0] | (buf
[1] << 8);
449 r
= ((long) buf
[0] << 24) | ((long) buf
[1] << 16) |
450 ((long) buf
[2] << 8) | buf
[3];
453 r
= buf
[0] | ((long) buf
[1] << 8) | ((long) buf
[2] << 16) |
454 ((long) buf
[3] << 24);
464 /* Find the strings in file FILENAME, read from STREAM.
465 Assume that STREAM is positioned so that the next byte read
466 is at address ADDRESS in the file.
467 Stop reading at address STOP_POINT in the file, if nonzero.
469 If STREAM is NULL, do not read from it.
470 The caller can supply a buffer of characters
471 to be processed before the data in STREAM.
472 MAGIC is the address of the buffer and
473 MAGICCOUNT is how many characters are in it.
474 Those characters come at address ADDRESS and the data in STREAM follow. */
477 print_strings (filename
, stream
, address
, stop_point
, magiccount
, magic
)
478 const char *filename
;
485 char *buf
= (char *) xmalloc (sizeof (char) * (string_min
+ 1));
493 /* See if the next `string_min' chars are all graphic chars. */
495 if (stop_point
&& address
>= stop_point
)
498 for (i
= 0; i
< string_min
; i
++)
500 c
= get_char (stream
, &address
, &magiccount
, &magic
);
503 if (c
> 255 || c
< 0 || !isgraphic (c
))
504 /* Found a non-graphic. Try again starting with next char. */
509 /* We found a run of `string_min' graphic characters. Print up
510 to the next non-graphic character. */
513 printf ("%s: ", filename
);
515 switch (address_radix
)
518 printf ("%7lo ", (unsigned long) start
);
522 printf ("%7ld ", (long) start
);
526 printf ("%7lx ", (unsigned long) start
);
535 c
= get_char (stream
, &address
, &magiccount
, &magic
);
538 if (c
> 255 || c
< 0 || !isgraphic (c
))
547 /* Parse string S as an integer, using decimal radix by default,
548 but allowing octal and hex numbers as in C. */
561 else if (*++p
== 'x')
570 while (((c
= *p
++) >= '0' && c
<= '9')
571 || (radix
== 16 && (c
& ~40) >= 'A' && (c
& ~40) <= 'Z'))
574 if (c
>= '0' && c
<= '9')
577 value
+= (c
& ~40) - 'A';
589 fatal (_("invalid integer argument %s"), s
);
595 usage (stream
, status
)
599 fprintf (stream
, _("\
600 Usage: %s [-afov] [-n min-len] [-min-len] [-t {o,x,d}] [-e {s,b,l,B,L}]\n\
601 [-] [--all] [--print-file-name] [--bytes=min-len] [--radix={o,x,d}]\n\
602 [--target=bfdname] [--encoding {s,b,l,B,L}] [--help] [--version] file...\n"),
604 list_supported_targets (program_name
, stream
);
606 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);