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