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