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>. */
67 #include "libiberty.h"
68 #include "safe-ctype.h"
70 /* Some platforms need to put stdin into binary mode, to read
75 #define O_BINARY _O_BINARY
76 #define setmode _setmode
83 #define SET_BINARY(f) do { if (!isatty(f)) setmode(f,O_BINARY); } while (0)
87 #define isgraphic(c) (ISPRINT (c) || (c) == '\t')
93 /* The BFD section flags that identify an initialized data section. */
94 #define DATA_FLAGS (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS)
97 typedef off64_t file_off
;
98 #define file_open(s,m) fopen64(s,m)
100 typedef off_t file_off
;
101 #define file_open(s,m) fopen(s,m)
104 /* Radix for printing addresses (must be 8, 10 or 16). */
105 static int address_radix
;
107 /* Minimum length of sequence of graphic chars to trigger output. */
108 static int string_min
;
110 /* true means print address within file for each string. */
111 static boolean print_addresses
;
113 /* true means print filename for each string. */
114 static boolean print_filenames
;
116 /* true means for object files scan only the data section. */
117 static boolean datasection_only
;
119 /* true if we found an initialized data section in the current file. */
120 static boolean got_a_section
;
122 /* The BFD object file format. */
125 /* The character encoding format. */
126 static char encoding
;
127 static int encoding_bytes
;
129 static struct option long_options
[] =
131 {"all", no_argument
, NULL
, 'a'},
132 {"print-file-name", no_argument
, NULL
, 'f'},
133 {"bytes", required_argument
, NULL
, 'n'},
134 {"radix", required_argument
, NULL
, 't'},
135 {"encoding", required_argument
, NULL
, 'e'},
136 {"target", required_argument
, NULL
, 'T'},
137 {"help", no_argument
, NULL
, 'h'},
138 {"version", no_argument
, NULL
, 'v'},
142 static void strings_a_section
PARAMS ((bfd
*, asection
*, PTR
));
143 static boolean strings_object_file
PARAMS ((const char *));
144 static boolean strings_file
PARAMS ((char *file
));
145 static int integer_arg
PARAMS ((char *s
));
146 static void print_strings
PARAMS ((const char *filename
, FILE *stream
,
147 file_off address
, int stop_point
,
148 int magiccount
, char *magic
));
149 static void usage
PARAMS ((FILE *stream
, int status
));
150 static long get_char
PARAMS ((FILE *stream
, file_off
*address
,
151 int *magiccount
, char **magic
));
160 boolean files_given
= false;
162 #if defined (HAVE_SETLOCALE)
163 setlocale (LC_ALL
, "");
165 bindtextdomain (PACKAGE
, LOCALEDIR
);
166 textdomain (PACKAGE
);
168 program_name
= argv
[0];
169 xmalloc_set_program_name (program_name
);
171 print_addresses
= false;
172 print_filenames
= false;
173 datasection_only
= true;
177 while ((optc
= getopt_long (argc
, argv
, "afn:ot:e:v0123456789",
178 long_options
, (int *) 0)) != EOF
)
183 datasection_only
= false;
187 print_filenames
= true;
194 string_min
= integer_arg (optarg
);
197 fatal (_("invalid number %s"), optarg
);
202 print_addresses
= true;
207 print_addresses
= true;
208 if (optarg
[1] != '\0')
234 if (optarg
[1] != '\0')
236 encoding
= optarg
[0];
240 print_version ("strings");
248 string_min
= optc
- '0';
250 string_min
= string_min
* 10 + optc
- '0';
276 set_default_bfd_target ();
280 datasection_only
= false;
282 SET_BINARY (fileno (stdin
));
284 print_strings ("{standard input}", stdin
, 0, 0, 0, (char *) NULL
);
289 for (; optind
< argc
; ++optind
)
291 if (strcmp (argv
[optind
], "-") == 0)
292 datasection_only
= false;
296 exit_status
|= (strings_file (argv
[optind
]) == false);
301 if (files_given
== false)
304 return (exit_status
);
307 /* Scan section SECT of the file ABFD, whose printable name is FILE.
308 If it contains initialized data,
309 set `got_a_section' and print the strings in it. */
312 strings_a_section (abfd
, sect
, filearg
)
317 const char *file
= (const char *) filearg
;
319 if ((sect
->flags
& DATA_FLAGS
) == DATA_FLAGS
)
321 bfd_size_type sz
= bfd_get_section_size_before_reloc (sect
);
322 PTR mem
= xmalloc (sz
);
323 if (bfd_get_section_contents (abfd
, sect
, mem
, (file_ptr
) 0, sz
))
325 got_a_section
= true;
326 print_strings (file
, (FILE *) NULL
, sect
->filepos
, 0, sz
, mem
);
332 /* Scan all of the sections in FILE, and print the strings
333 in the initialized data section(s).
335 Return true if successful,
336 false if not (such as if FILE is not an object file). */
339 strings_object_file (file
)
342 bfd
*abfd
= bfd_openr (file
, target
);
346 /* Treat the file as a non-object file. */
350 /* This call is mainly for its side effect of reading in the sections.
351 We follow the traditional behavior of `strings' in that we don't
352 complain if we don't recognize a file to be an object file. */
353 if (bfd_check_format (abfd
, bfd_object
) == false)
359 got_a_section
= false;
360 bfd_map_over_sections (abfd
, strings_a_section
, (PTR
) file
);
362 if (!bfd_close (abfd
))
368 return got_a_section
;
371 /* Print the strings in FILE. Return true if ok, false if an error occurs. */
377 /* If we weren't told to scan the whole file,
378 try to open it as an object file and only look at
379 initialized data sections. If that fails, fall back to the
381 if (!datasection_only
|| !strings_object_file (file
))
385 stream
= file_open (file
, FOPEN_RB
);
388 fprintf (stderr
, "%s: ", program_name
);
393 print_strings (file
, stream
, (file_off
) 0, 0, 0, (char *) 0);
395 if (fclose (stream
) == EOF
)
397 fprintf (stderr
, "%s: ", program_name
);
406 /* Read the next character, return EOF if none available.
407 Assume that STREAM is positioned so that the next byte read
408 is at address ADDRESS in the file.
410 If STREAM is NULL, do not read from it.
411 The caller can supply a buffer of characters
412 to be processed before the data in STREAM.
413 MAGIC is the address of the buffer and
414 MAGICCOUNT is how many characters are in it. */
417 get_char (stream
, address
, magiccount
, magic
)
425 unsigned char buf
[4];
427 for (i
= 0; i
< encoding_bytes
; i
++)
438 #ifdef HAVE_GETC_UNLOCKED
439 c
= getc_unlocked (stream
);
457 r
= (buf
[0] << 8) | buf
[1];
460 r
= buf
[0] | (buf
[1] << 8);
463 r
= ((long) buf
[0] << 24) | ((long) buf
[1] << 16) |
464 ((long) buf
[2] << 8) | buf
[3];
467 r
= buf
[0] | ((long) buf
[1] << 8) | ((long) buf
[2] << 16) |
468 ((long) buf
[3] << 24);
478 /* Find the strings in file FILENAME, read from STREAM.
479 Assume that STREAM is positioned so that the next byte read
480 is at address ADDRESS in the file.
481 Stop reading at address STOP_POINT in the file, if nonzero.
483 If STREAM is NULL, do not read from it.
484 The caller can supply a buffer of characters
485 to be processed before the data in STREAM.
486 MAGIC is the address of the buffer and
487 MAGICCOUNT is how many characters are in it.
488 Those characters come at address ADDRESS and the data in STREAM follow. */
491 print_strings (filename
, stream
, address
, stop_point
, magiccount
, magic
)
492 const char *filename
;
499 char *buf
= (char *) xmalloc (sizeof (char) * (string_min
+ 1));
507 /* See if the next `string_min' chars are all graphic chars. */
509 if (stop_point
&& address
>= stop_point
)
512 for (i
= 0; i
< string_min
; i
++)
514 c
= get_char (stream
, &address
, &magiccount
, &magic
);
517 if (c
> 255 || c
< 0 || !isgraphic (c
))
518 /* Found a non-graphic. Try again starting with next char. */
523 /* We found a run of `string_min' graphic characters. Print up
524 to the next non-graphic character. */
527 printf ("%s: ", filename
);
529 switch (address_radix
)
532 #if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
533 if (sizeof (start
) > sizeof (long))
534 printf ("%7Lo ", (unsigned long long) start
);
537 # if !BFD_HOST_64BIT_LONG
538 if (start
!= (unsigned long) start
)
539 printf ("++%7lo ", (unsigned long) start
);
543 printf ("%7lo ", (unsigned long) start
);
547 #if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
548 if (sizeof (start
) > sizeof (long))
549 printf ("%7Ld ", (unsigned long long) start
);
552 # if !BFD_HOST_64BIT_LONG
553 if (start
!= (unsigned long) start
)
554 printf ("++%7ld ", (unsigned long) start
);
558 printf ("%7ld ", (long) start
);
562 #if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
563 if (sizeof (start
) > sizeof (long))
564 printf ("%7Lx ", (unsigned long long) start
);
567 # if !BFD_HOST_64BIT_LONG
568 if (start
!= (unsigned long) start
)
569 printf ("%lx%8.8lx ", start
>> 32, start
& 0xffffffff);
573 printf ("%7lx ", (unsigned long) start
);
582 c
= get_char (stream
, &address
, &magiccount
, &magic
);
585 if (c
> 255 || c
< 0 || !isgraphic (c
))
594 /* Parse string S as an integer, using decimal radix by default,
595 but allowing octal and hex numbers as in C. */
608 else if (*++p
== 'x')
617 while (((c
= *p
++) >= '0' && c
<= '9')
618 || (radix
== 16 && (c
& ~40) >= 'A' && (c
& ~40) <= 'Z'))
621 if (c
>= '0' && c
<= '9')
624 value
+= (c
& ~40) - 'A';
636 fatal (_("invalid integer argument %s"), s
);
642 usage (stream
, status
)
646 fprintf (stream
, _("\
647 Usage: %s [-afov] [-n min-len] [-min-len] [-t {o,x,d}] [-e {s,b,l,B,L}]\n\
648 [-] [--all] [--print-file-name] [--bytes=min-len] [--radix={o,x,d}]\n\
649 [--target=bfdname] [--encoding {s,b,l,B,L}] [--help] [--version] file...\n"),
651 list_supported_targets (program_name
, stream
);
653 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);