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
));
139 static long get_char
PARAMS ((FILE *stream
, file_ptr
*address
,
140 int *magiccount
, char **magic
));
149 boolean files_given
= false;
151 #if defined (HAVE_SETLOCALE)
152 setlocale (LC_ALL
, "");
154 bindtextdomain (PACKAGE
, LOCALEDIR
);
155 textdomain (PACKAGE
);
157 program_name
= argv
[0];
158 xmalloc_set_program_name (program_name
);
160 print_addresses
= false;
161 print_filenames
= false;
162 datasection_only
= true;
166 while ((optc
= getopt_long (argc
, argv
, "afn:ot:e:v0123456789",
167 long_options
, (int *) 0)) != EOF
)
172 datasection_only
= false;
176 print_filenames
= true;
183 string_min
= integer_arg (optarg
);
186 fatal (_("invalid number %s"), optarg
);
191 print_addresses
= true;
196 print_addresses
= true;
197 if (optarg
[1] != '\0')
223 if (optarg
[1] != '\0')
225 encoding
= optarg
[0];
229 print_version ("strings");
237 string_min
= optc
- '0';
239 string_min
= string_min
* 10 + optc
- '0';
265 set_default_bfd_target ();
269 datasection_only
= false;
271 SET_BINARY (fileno (stdin
));
273 print_strings ("{standard input}", stdin
, 0, 0, 0, (char *) NULL
);
278 for (; optind
< argc
; ++optind
)
280 if (strcmp (argv
[optind
], "-") == 0)
281 datasection_only
= false;
285 exit_status
|= (strings_file (argv
[optind
]) == false);
290 if (files_given
== false)
293 return (exit_status
);
296 /* Scan section SECT of the file ABFD, whose printable name is FILE.
297 If it contains initialized data,
298 set `got_a_section' and print the strings in it. */
301 strings_a_section (abfd
, sect
, filearg
)
306 const char *file
= (const char *) filearg
;
308 if ((sect
->flags
& DATA_FLAGS
) == DATA_FLAGS
)
310 bfd_size_type sz
= bfd_get_section_size_before_reloc (sect
);
311 PTR mem
= xmalloc (sz
);
312 if (bfd_get_section_contents (abfd
, sect
, mem
, (file_ptr
) 0, sz
))
314 got_a_section
= true;
315 print_strings (file
, (FILE *) NULL
, sect
->filepos
, 0, sz
, mem
);
321 /* Scan all of the sections in FILE, and print the strings
322 in the initialized data section(s).
324 Return true if successful,
325 false if not (such as if FILE is not an object file). */
328 strings_object_file (file
)
331 bfd
*abfd
= bfd_openr (file
, target
);
335 /* Treat the file as a non-object file. */
339 /* This call is mainly for its side effect of reading in the sections.
340 We follow the traditional behavior of `strings' in that we don't
341 complain if we don't recognize a file to be an object file. */
342 if (bfd_check_format (abfd
, bfd_object
) == false)
348 got_a_section
= false;
349 bfd_map_over_sections (abfd
, strings_a_section
, (PTR
) file
);
351 if (!bfd_close (abfd
))
357 return got_a_section
;
360 /* Print the strings in FILE. Return true if ok, false if an error occurs. */
366 /* If we weren't told to scan the whole file,
367 try to open it as an object file and only look at
368 initialized data sections. If that fails, fall back to the
370 if (!datasection_only
|| !strings_object_file (file
))
374 stream
= fopen (file
, "rb");
375 /* Not all systems permit "rb", so try "r" if it failed. */
377 stream
= fopen (file
, "r");
380 fprintf (stderr
, "%s: ", program_name
);
385 print_strings (file
, stream
, (file_ptr
) 0, 0, 0, (char *) 0);
387 if (fclose (stream
) == EOF
)
389 fprintf (stderr
, "%s: ", program_name
);
398 /* Read the next character, return EOF if none available.
399 Assume that STREAM is positioned so that the next byte read
400 is at address ADDRESS in the file.
402 If STREAM is NULL, do not read from it.
403 The caller can supply a buffer of characters
404 to be processed before the data in STREAM.
405 MAGIC is the address of the buffer and
406 MAGICCOUNT is how many characters are in it. */
409 get_char (stream
, address
, magiccount
, magic
)
417 unsigned char buf
[4];
419 for (i
= 0; i
< encoding_bytes
; i
++)
445 r
= (buf
[0] << 8) | buf
[1];
448 r
= buf
[0] | (buf
[1] << 8);
451 r
= ((long) buf
[0] << 24) | ((long) buf
[1] << 16) |
452 ((long) buf
[2] << 8) | buf
[3];
455 r
= buf
[0] | ((long) buf
[1] << 8) | ((long) buf
[2] << 16) |
456 ((long) buf
[3] << 24);
466 /* Find the strings in file FILENAME, read from STREAM.
467 Assume that STREAM is positioned so that the next byte read
468 is at address ADDRESS in the file.
469 Stop reading at address STOP_POINT in the file, if nonzero.
471 If STREAM is NULL, do not read from it.
472 The caller can supply a buffer of characters
473 to be processed before the data in STREAM.
474 MAGIC is the address of the buffer and
475 MAGICCOUNT is how many characters are in it.
476 Those characters come at address ADDRESS and the data in STREAM follow. */
479 print_strings (filename
, stream
, address
, stop_point
, magiccount
, magic
)
480 const char *filename
;
487 char *buf
= (char *) xmalloc (sizeof (char) * (string_min
+ 1));
495 /* See if the next `string_min' chars are all graphic chars. */
497 if (stop_point
&& address
>= stop_point
)
500 for (i
= 0; i
< string_min
; i
++)
502 c
= get_char (stream
, &address
, &magiccount
, &magic
);
505 if (c
> 255 || c
< 0 || !isgraphic (c
))
506 /* Found a non-graphic. Try again starting with next char. */
511 /* We found a run of `string_min' graphic characters. Print up
512 to the next non-graphic character. */
515 printf ("%s: ", filename
);
517 switch (address_radix
)
520 printf ("%7lo ", (unsigned long) start
);
524 printf ("%7ld ", (long) start
);
528 printf ("%7lx ", (unsigned long) start
);
537 c
= get_char (stream
, &address
, &magiccount
, &magic
);
540 if (c
> 255 || c
< 0 || !isgraphic (c
))
549 /* Parse string S as an integer, using decimal radix by default,
550 but allowing octal and hex numbers as in C. */
563 else if (*++p
== 'x')
572 while (((c
= *p
++) >= '0' && c
<= '9')
573 || (radix
== 16 && (c
& ~40) >= 'A' && (c
& ~40) <= 'Z'))
576 if (c
>= '0' && c
<= '9')
579 value
+= (c
& ~40) - 'A';
591 fatal (_("invalid integer argument %s"), s
);
597 usage (stream
, status
)
601 fprintf (stream
, _("\
602 Usage: %s [-afov] [-n min-len] [-min-len] [-t {o,x,d}] [-e {s,b,l,B,L}]\n\
603 [-] [--all] [--print-file-name] [--bytes=min-len] [--radix={o,x,d}]\n\
604 [--target=bfdname] [--encoding {s,b,l,B,L}] [--help] [--version] file...\n"),
606 list_supported_targets (program_name
, stream
);
608 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);