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