bfd/
[deliverable/binutils-gdb.git] / binutils / strings.c
CommitLineData
252b5132 1/* strings -- print the strings of printable characters in files
8b53311e 2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
ffbe5983
NC
3 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
252b5132
RH
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
32866df7 8 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
9 any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
b43b5d5f
NC
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
252b5132
RH
20\f
21/* Usage: strings [options] file...
22
23 Options:
24 --all
25 -a
26 - Do not scan only the initialized data section of object files.
27
28 --print-file-name
29 -f Print the name of the file before each string.
30
31 --bytes=min-len
32 -n min-len
33 -min-len Print graphic char sequences, MIN-LEN or more bytes long,
34 that are followed by a NUL or a newline. Default is 4.
35
36 --radix={o,x,d}
37 -t {o,x,d} Print the offset within the file before each string,
38 in octal/hex/decimal.
39
40 -o Like -to. (Some other implementations have -o like -to,
41 others like -td. We chose one arbitrarily.)
42
8745eafa
NC
43 --encoding={s,S,b,l,B,L}
44 -e {s,S,b,l,B,L}
45 Select character encoding: 7-bit-character, 8-bit-character,
46 bigendian 16-bit, littleendian 16-bit, bigendian 32-bit,
47 littleendian 32-bit.
d132876a 48
252b5132 49 --target=BFDNAME
3bf31ec9 50 -T {bfdname}
252b5132
RH
51 Specify a non-default object file format.
52
53 --help
54 -h Print the usage message on the standard output.
55
56 --version
ffbe5983 57 -V
252b5132
RH
58 -v Print the program version number.
59
60 Written by Richard Stallman <rms@gnu.ai.mit.edu>
61 and David MacKenzie <djm@gnu.ai.mit.edu>. */
62
3db64b00 63#include "sysdep.h"
252b5132 64#include "bfd.h"
e9792343 65#include "getopt.h"
252b5132 66#include "libiberty.h"
3882b010 67#include "safe-ctype.h"
fb608b92 68#include <sys/stat.h>
3db64b00 69#include "bucomm.h"
252b5132 70
8745eafa
NC
71#define STRING_ISGRAPHIC(c) \
72 ( (c) >= 0 \
73 && (c) <= 255 \
74 && ((c) == '\t' || ISPRINT (c) || (encoding == 'S' && (c) > 127)))
252b5132
RH
75
76#ifndef errno
77extern int errno;
78#endif
79
80/* The BFD section flags that identify an initialized data section. */
81#define DATA_FLAGS (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS)
82
cedd9a58
JJ
83#ifdef HAVE_FOPEN64
84typedef off64_t file_off;
8745eafa 85#define file_open(s,m) fopen64(s, m)
cedd9a58
JJ
86#else
87typedef off_t file_off;
8745eafa 88#define file_open(s,m) fopen(s, m)
cedd9a58 89#endif
fb5b5478
JJ
90#ifdef HAVE_STAT64
91typedef struct stat64 statbuf;
92#define file_stat(f,s) stat64(f, s)
93#else
94typedef struct stat statbuf;
95#define file_stat(f,s) stat(f, s)
96#endif
cedd9a58 97
252b5132
RH
98/* Radix for printing addresses (must be 8, 10 or 16). */
99static int address_radix;
100
101/* Minimum length of sequence of graphic chars to trigger output. */
102static int string_min;
103
b34976b6
AM
104/* TRUE means print address within file for each string. */
105static bfd_boolean print_addresses;
252b5132 106
b34976b6
AM
107/* TRUE means print filename for each string. */
108static bfd_boolean print_filenames;
252b5132 109
b34976b6
AM
110/* TRUE means for object files scan only the data section. */
111static bfd_boolean datasection_only;
252b5132 112
b34976b6
AM
113/* TRUE if we found an initialized data section in the current file. */
114static bfd_boolean got_a_section;
252b5132
RH
115
116/* The BFD object file format. */
117static char *target;
118
d132876a
NC
119/* The character encoding format. */
120static char encoding;
121static int encoding_bytes;
122
252b5132
RH
123static struct option long_options[] =
124{
125 {"all", no_argument, NULL, 'a'},
126 {"print-file-name", no_argument, NULL, 'f'},
127 {"bytes", required_argument, NULL, 'n'},
128 {"radix", required_argument, NULL, 't'},
d132876a 129 {"encoding", required_argument, NULL, 'e'},
252b5132
RH
130 {"target", required_argument, NULL, 'T'},
131 {"help", no_argument, NULL, 'h'},
132 {"version", no_argument, NULL, 'v'},
133 {NULL, 0, NULL, 0}
134};
135
06803313
NC
136/* Records the size of a named file so that we
137 do not repeatedly run bfd_stat() on it. */
138
139typedef struct
140{
141 const char * filename;
142 bfd_size_type filesize;
143} filename_and_size_t;
144
2da42df6
AJ
145static void strings_a_section (bfd *, asection *, void *);
146static bfd_boolean strings_object_file (const char *);
147static bfd_boolean strings_file (char *file);
2da42df6
AJ
148static void print_strings (const char *, FILE *, file_off, int, int, char *);
149static void usage (FILE *, int);
150static long get_char (FILE *, file_off *, int *, char **);
252b5132 151\f
2da42df6 152int main (int, char **);
65de42c0 153
252b5132 154int
2da42df6 155main (int argc, char **argv)
252b5132
RH
156{
157 int optc;
158 int exit_status = 0;
b34976b6 159 bfd_boolean files_given = FALSE;
508e676d 160 char *s;
e36aef42 161 int numeric_opt = 0;
252b5132 162
3882b010 163#if defined (HAVE_SETLOCALE)
1c529ca6 164 setlocale (LC_ALL, "");
252b5132
RH
165#endif
166 bindtextdomain (PACKAGE, LOCALEDIR);
167 textdomain (PACKAGE);
168
169 program_name = argv[0];
170 xmalloc_set_program_name (program_name);
869b9d07
MM
171
172 expandargv (&argc, &argv);
173
c904a764 174 string_min = 4;
b34976b6
AM
175 print_addresses = FALSE;
176 print_filenames = FALSE;
177 datasection_only = TRUE;
252b5132 178 target = NULL;
d132876a 179 encoding = 's';
252b5132 180
030cbced 181 while ((optc = getopt_long (argc, argv, "afhHn:ot:e:T:Vv0123456789",
252b5132
RH
182 long_options, (int *) 0)) != EOF)
183 {
184 switch (optc)
185 {
186 case 'a':
b34976b6 187 datasection_only = FALSE;
252b5132
RH
188 break;
189
190 case 'f':
b34976b6 191 print_filenames = TRUE;
252b5132
RH
192 break;
193
8b53311e 194 case 'H':
252b5132
RH
195 case 'h':
196 usage (stdout, 0);
197
198 case 'n':
508e676d
JK
199 string_min = (int) strtoul (optarg, &s, 0);
200 if (s != NULL && *s != 0)
201 fatal (_("invalid integer argument %s"), optarg);
252b5132
RH
202 break;
203
204 case 'o':
b34976b6 205 print_addresses = TRUE;
252b5132
RH
206 address_radix = 8;
207 break;
208
209 case 't':
b34976b6 210 print_addresses = TRUE;
252b5132
RH
211 if (optarg[1] != '\0')
212 usage (stderr, 1);
213 switch (optarg[0])
214 {
215 case 'o':
216 address_radix = 8;
217 break;
218
219 case 'd':
220 address_radix = 10;
221 break;
222
223 case 'x':
224 address_radix = 16;
225 break;
226
227 default:
228 usage (stderr, 1);
229 }
230 break;
231
232 case 'T':
233 target = optarg;
234 break;
235
d132876a
NC
236 case 'e':
237 if (optarg[1] != '\0')
238 usage (stderr, 1);
239 encoding = optarg[0];
240 break;
241
8b53311e 242 case 'V':
252b5132
RH
243 case 'v':
244 print_version ("strings");
245 break;
246
247 case '?':
248 usage (stderr, 1);
249
250 default:
e36aef42 251 numeric_opt = optind;
252b5132
RH
252 break;
253 }
254 }
255
e36aef42
AM
256 if (numeric_opt != 0)
257 {
258 string_min = (int) strtoul (argv[numeric_opt - 1] + 1, &s, 0);
259 if (s != NULL && *s != 0)
260 fatal (_("invalid integer argument %s"), argv[numeric_opt - 1] + 1);
261 }
c904a764
NC
262 if (string_min < 1)
263 fatal (_("invalid minimum string length %d"), string_min);
252b5132 264
d132876a
NC
265 switch (encoding)
266 {
8745eafa 267 case 'S':
d132876a
NC
268 case 's':
269 encoding_bytes = 1;
270 break;
271 case 'b':
272 case 'l':
273 encoding_bytes = 2;
274 break;
275 case 'B':
276 case 'L':
277 encoding_bytes = 4;
278 break;
279 default:
280 usage (stderr, 1);
281 }
282
252b5132
RH
283 bfd_init ();
284 set_default_bfd_target ();
285
286 if (optind >= argc)
287 {
b34976b6 288 datasection_only = FALSE;
5af11cab 289 SET_BINARY (fileno (stdin));
252b5132 290 print_strings ("{standard input}", stdin, 0, 0, 0, (char *) NULL);
b34976b6 291 files_given = TRUE;
252b5132
RH
292 }
293 else
294 {
295 for (; optind < argc; ++optind)
296 {
297 if (strcmp (argv[optind], "-") == 0)
b34976b6 298 datasection_only = FALSE;
252b5132
RH
299 else
300 {
b34976b6
AM
301 files_given = TRUE;
302 exit_status |= strings_file (argv[optind]) == FALSE;
252b5132
RH
303 }
304 }
305 }
306
b34976b6 307 if (!files_given)
252b5132
RH
308 usage (stderr, 1);
309
310 return (exit_status);
311}
312\f
06803313
NC
313/* Scan section SECT of the file ABFD, whose printable name is in
314 ARG->filename and whose size might be in ARG->filesize. If it
315 contains initialized data set `got_a_section' and print the
316 strings in it.
317
318 FIXME: We ought to be able to return error codes/messages for
319 certain conditions. */
252b5132
RH
320
321static void
06803313 322strings_a_section (bfd *abfd, asection *sect, void *arg)
252b5132 323{
06803313
NC
324 filename_and_size_t * filename_and_sizep;
325 bfd_size_type *filesizep;
326 bfd_size_type sectsize;
327 void *mem;
328
329 if ((sect->flags & DATA_FLAGS) != DATA_FLAGS)
330 return;
331
332 sectsize = bfd_get_section_size (sect);
333
334 if (sectsize <= 0)
335 return;
336
337 /* Get the size of the file. This might have been cached for us. */
338 filename_and_sizep = (filename_and_size_t *) arg;
339 filesizep = & filename_and_sizep->filesize;
340
341 if (*filesizep == 0)
342 {
343 struct stat st;
344
345 if (bfd_stat (abfd, &st))
346 return;
347
348 /* Cache the result so that we do not repeatedly stat this file. */
349 *filesizep = st.st_size;
350 }
252b5132 351
06803313
NC
352 /* Compare the size of the section against the size of the file.
353 If the section is bigger then the file must be corrupt and
354 we should not try dumping it. */
355 if (sectsize >= *filesizep)
356 return;
357
358 mem = xmalloc (sectsize);
359
360 if (bfd_get_section_contents (abfd, sect, mem, (file_ptr) 0, sectsize))
252b5132 361 {
06803313 362 got_a_section = TRUE;
8745eafa 363
06803313
NC
364 print_strings (filename_and_sizep->filename, NULL, sect->filepos,
365 0, sectsize, mem);
252b5132 366 }
06803313
NC
367
368 free (mem);
252b5132
RH
369}
370
371/* Scan all of the sections in FILE, and print the strings
372 in the initialized data section(s).
373
b34976b6
AM
374 Return TRUE if successful,
375 FALSE if not (such as if FILE is not an object file). */
252b5132 376
b34976b6 377static bfd_boolean
2da42df6 378strings_object_file (const char *file)
252b5132 379{
06803313
NC
380 filename_and_size_t filename_and_size;
381 bfd *abfd;
382
383 abfd = bfd_openr (file, target);
252b5132
RH
384
385 if (abfd == NULL)
8745eafa
NC
386 /* Treat the file as a non-object file. */
387 return FALSE;
252b5132
RH
388
389 /* This call is mainly for its side effect of reading in the sections.
390 We follow the traditional behavior of `strings' in that we don't
391 complain if we don't recognize a file to be an object file. */
b34976b6 392 if (!bfd_check_format (abfd, bfd_object))
252b5132
RH
393 {
394 bfd_close (abfd);
b34976b6 395 return FALSE;
252b5132
RH
396 }
397
b34976b6 398 got_a_section = FALSE;
06803313
NC
399 filename_and_size.filename = file;
400 filename_and_size.filesize = 0;
401 bfd_map_over_sections (abfd, strings_a_section, & filename_and_size);
252b5132
RH
402
403 if (!bfd_close (abfd))
404 {
405 bfd_nonfatal (file);
b34976b6 406 return FALSE;
252b5132
RH
407 }
408
409 return got_a_section;
410}
411
b34976b6 412/* Print the strings in FILE. Return TRUE if ok, FALSE if an error occurs. */
252b5132 413
b34976b6 414static bfd_boolean
2da42df6 415strings_file (char *file)
252b5132 416{
fb5b5478
JJ
417 statbuf st;
418
419 if (file_stat (file, &st) < 0)
420 {
421 if (errno == ENOENT)
422 non_fatal (_("'%s': No such file"), file);
423 else
424 non_fatal (_("Warning: could not locate '%s'. reason: %s"),
425 file, strerror (errno));
426 return FALSE;
427 }
f24ddbdd 428
252b5132
RH
429 /* If we weren't told to scan the whole file,
430 try to open it as an object file and only look at
431 initialized data sections. If that fails, fall back to the
432 whole file. */
433 if (!datasection_only || !strings_object_file (file))
434 {
435 FILE *stream;
436
cedd9a58 437 stream = file_open (file, FOPEN_RB);
252b5132
RH
438 if (stream == NULL)
439 {
440 fprintf (stderr, "%s: ", program_name);
441 perror (file);
b34976b6 442 return FALSE;
252b5132
RH
443 }
444
cedd9a58 445 print_strings (file, stream, (file_off) 0, 0, 0, (char *) 0);
252b5132
RH
446
447 if (fclose (stream) == EOF)
448 {
449 fprintf (stderr, "%s: ", program_name);
450 perror (file);
b34976b6 451 return FALSE;
252b5132
RH
452 }
453 }
454
b34976b6 455 return TRUE;
252b5132
RH
456}
457\f
d132876a
NC
458/* Read the next character, return EOF if none available.
459 Assume that STREAM is positioned so that the next byte read
460 is at address ADDRESS in the file.
461
462 If STREAM is NULL, do not read from it.
463 The caller can supply a buffer of characters
464 to be processed before the data in STREAM.
465 MAGIC is the address of the buffer and
466 MAGICCOUNT is how many characters are in it. */
467
468static long
2da42df6 469get_char (FILE *stream, file_off *address, int *magiccount, char **magic)
d132876a
NC
470{
471 int c, i;
956cd1d6 472 long r = EOF;
d132876a
NC
473 unsigned char buf[4];
474
475 for (i = 0; i < encoding_bytes; i++)
476 {
477 if (*magiccount)
478 {
479 (*magiccount)--;
480 c = *(*magic)++;
481 }
482 else
483 {
484 if (stream == NULL)
485 return EOF;
b7d4af3a
JW
486
487 /* Only use getc_unlocked if we found a declaration for it.
488 Otherwise, libc is not thread safe by default, and we
489 should not use it. */
490
491#if defined(HAVE_GETC_UNLOCKED) && HAVE_DECL_GETC_UNLOCKED
cedd9a58
JJ
492 c = getc_unlocked (stream);
493#else
d132876a 494 c = getc (stream);
cedd9a58 495#endif
d132876a
NC
496 if (c == EOF)
497 return EOF;
498 }
499
500 (*address)++;
501 buf[i] = c;
502 }
503
504 switch (encoding)
505 {
8745eafa 506 case 'S':
d132876a
NC
507 case 's':
508 r = buf[0];
509 break;
510 case 'b':
511 r = (buf[0] << 8) | buf[1];
512 break;
513 case 'l':
514 r = buf[0] | (buf[1] << 8);
515 break;
516 case 'B':
517 r = ((long) buf[0] << 24) | ((long) buf[1] << 16) |
518 ((long) buf[2] << 8) | buf[3];
519 break;
520 case 'L':
521 r = buf[0] | ((long) buf[1] << 8) | ((long) buf[2] << 16) |
522 ((long) buf[3] << 24);
523 break;
524 }
525
526 if (r == EOF)
527 return 0;
528
529 return r;
530}
531\f
252b5132
RH
532/* Find the strings in file FILENAME, read from STREAM.
533 Assume that STREAM is positioned so that the next byte read
534 is at address ADDRESS in the file.
535 Stop reading at address STOP_POINT in the file, if nonzero.
536
537 If STREAM is NULL, do not read from it.
538 The caller can supply a buffer of characters
539 to be processed before the data in STREAM.
540 MAGIC is the address of the buffer and
541 MAGICCOUNT is how many characters are in it.
542 Those characters come at address ADDRESS and the data in STREAM follow. */
543
544static void
2da42df6
AJ
545print_strings (const char *filename, FILE *stream, file_off address,
546 int stop_point, int magiccount, char *magic)
252b5132 547{
d132876a 548 char *buf = (char *) xmalloc (sizeof (char) * (string_min + 1));
252b5132
RH
549
550 while (1)
551 {
cedd9a58 552 file_off start;
252b5132 553 int i;
d132876a 554 long c;
252b5132
RH
555
556 /* See if the next `string_min' chars are all graphic chars. */
557 tryline:
558 if (stop_point && address >= stop_point)
559 break;
560 start = address;
561 for (i = 0; i < string_min; i++)
562 {
d132876a
NC
563 c = get_char (stream, &address, &magiccount, &magic);
564 if (c == EOF)
565 return;
8745eafa 566 if (! STRING_ISGRAPHIC (c))
252b5132
RH
567 /* Found a non-graphic. Try again starting with next char. */
568 goto tryline;
569 buf[i] = c;
570 }
571
572 /* We found a run of `string_min' graphic characters. Print up
e9f87780 573 to the next non-graphic character. */
252b5132
RH
574
575 if (print_filenames)
576 printf ("%s: ", filename);
577 if (print_addresses)
578 switch (address_radix)
579 {
580 case 8:
cedd9a58
JJ
581#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
582 if (sizeof (start) > sizeof (long))
6e3d6dc1
NC
583 {
584#ifndef __MSVCRT__
585 printf ("%7llo ", (unsigned long long) start);
586#else
587 printf ("%7I64o ", (unsigned long long) start);
588#endif
589 }
cedd9a58 590 else
50e3244d 591#elif !BFD_HOST_64BIT_LONG
cedd9a58
JJ
592 if (start != (unsigned long) start)
593 printf ("++%7lo ", (unsigned long) start);
594 else
cedd9a58
JJ
595#endif
596 printf ("%7lo ", (unsigned long) start);
252b5132
RH
597 break;
598
599 case 10:
cedd9a58
JJ
600#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
601 if (sizeof (start) > sizeof (long))
6e3d6dc1
NC
602 {
603#ifndef __MSVCRT__
604 printf ("%7lld ", (unsigned long long) start);
605#else
606 printf ("%7I64d ", (unsigned long long) start);
607#endif
608 }
cedd9a58 609 else
50e3244d 610#elif !BFD_HOST_64BIT_LONG
cedd9a58
JJ
611 if (start != (unsigned long) start)
612 printf ("++%7ld ", (unsigned long) start);
613 else
cedd9a58
JJ
614#endif
615 printf ("%7ld ", (long) start);
252b5132
RH
616 break;
617
618 case 16:
cedd9a58
JJ
619#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
620 if (sizeof (start) > sizeof (long))
6e3d6dc1
NC
621 {
622#ifndef __MSVCRT__
623 printf ("%7llx ", (unsigned long long) start);
624#else
625 printf ("%7I64x ", (unsigned long long) start);
626#endif
627 }
cedd9a58 628 else
50e3244d 629#elif !BFD_HOST_64BIT_LONG
cedd9a58 630 if (start != (unsigned long) start)
e9f87780
AM
631 printf ("%lx%8.8lx ", (unsigned long) (start >> 32),
632 (unsigned long) (start & 0xffffffff));
cedd9a58 633 else
cedd9a58
JJ
634#endif
635 printf ("%7lx ", (unsigned long) start);
252b5132
RH
636 break;
637 }
638
639 buf[i] = '\0';
640 fputs (buf, stdout);
641
642 while (1)
643 {
d132876a
NC
644 c = get_char (stream, &address, &magiccount, &magic);
645 if (c == EOF)
646 break;
8745eafa 647 if (! STRING_ISGRAPHIC (c))
252b5132
RH
648 break;
649 putchar (c);
650 }
651
652 putchar ('\n');
653 }
654}
655\f
252b5132 656static void
2da42df6 657usage (FILE *stream, int status)
252b5132 658{
8b53311e
NC
659 fprintf (stream, _("Usage: %s [option(s)] [file(s)]\n"), program_name);
660 fprintf (stream, _(" Display printable strings in [file(s)] (stdin by default)\n"));
661 fprintf (stream, _(" The options are:\n\
662 -a - --all Scan the entire file, not just the data section\n\
663 -f --print-file-name Print the name of the file before each string\n\
664 -n --bytes=[number] Locate & print any NUL-terminated sequence of at\n\
c904a764 665 -<number> least [number] characters (default 4).\n\
d412a550 666 -t --radix={o,d,x} Print the location of the string in base 8, 10 or 16\n\
8b53311e
NC
667 -o An alias for --radix=o\n\
668 -T --target=<BFDNAME> Specify the binary file format\n\
8745eafa
NC
669 -e --encoding={s,S,b,l,B,L} Select character size and endianness:\n\
670 s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit\n\
07012eee 671 @<file> Read options from <file>\n\
8b53311e 672 -h --help Display this information\n\
ffbe5983 673 -v -V --version Print the program's version number\n"));
252b5132 674 list_supported_targets (program_name, stream);
92f01d61 675 if (REPORT_BUGS_TO[0] && status == 0)
8ad3436c 676 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132
RH
677 exit (status);
678}
This page took 0.399682 seconds and 4 git commands to generate.