* ppc-linux-nat.c (have_ptrace_getsetregs): New variable.
[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;
252b5132 161
3882b010 162#if defined (HAVE_SETLOCALE)
1c529ca6 163 setlocale (LC_ALL, "");
252b5132
RH
164#endif
165 bindtextdomain (PACKAGE, LOCALEDIR);
166 textdomain (PACKAGE);
167
168 program_name = argv[0];
169 xmalloc_set_program_name (program_name);
869b9d07
MM
170
171 expandargv (&argc, &argv);
172
c904a764 173 string_min = 4;
b34976b6
AM
174 print_addresses = FALSE;
175 print_filenames = FALSE;
176 datasection_only = TRUE;
252b5132 177 target = NULL;
d132876a 178 encoding = 's';
252b5132 179
030cbced 180 while ((optc = getopt_long (argc, argv, "afhHn:ot:e:T:Vv0123456789",
252b5132
RH
181 long_options, (int *) 0)) != EOF)
182 {
183 switch (optc)
184 {
185 case 'a':
b34976b6 186 datasection_only = FALSE;
252b5132
RH
187 break;
188
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
203 case 'o':
b34976b6 204 print_addresses = TRUE;
252b5132
RH
205 address_radix = 8;
206 break;
207
208 case 't':
b34976b6 209 print_addresses = TRUE;
252b5132
RH
210 if (optarg[1] != '\0')
211 usage (stderr, 1);
212 switch (optarg[0])
213 {
214 case 'o':
215 address_radix = 8;
216 break;
217
218 case 'd':
219 address_radix = 10;
220 break;
221
222 case 'x':
223 address_radix = 16;
224 break;
225
226 default:
227 usage (stderr, 1);
228 }
229 break;
230
231 case 'T':
232 target = optarg;
233 break;
234
d132876a
NC
235 case 'e':
236 if (optarg[1] != '\0')
237 usage (stderr, 1);
238 encoding = optarg[0];
239 break;
240
8b53311e 241 case 'V':
252b5132
RH
242 case 'v':
243 print_version ("strings");
244 break;
245
246 case '?':
247 usage (stderr, 1);
248
249 default:
508e676d
JK
250 string_min = (int) strtoul (argv[optind - 1] + 1, &s, 0);
251 if (s != NULL && *s != 0)
252 fatal (_("invalid integer argument %s"), argv[optind - 1] + 1);
252b5132
RH
253 break;
254 }
255 }
256
c904a764
NC
257 if (string_min < 1)
258 fatal (_("invalid minimum string length %d"), string_min);
252b5132 259
d132876a
NC
260 switch (encoding)
261 {
8745eafa 262 case 'S':
d132876a
NC
263 case 's':
264 encoding_bytes = 1;
265 break;
266 case 'b':
267 case 'l':
268 encoding_bytes = 2;
269 break;
270 case 'B':
271 case 'L':
272 encoding_bytes = 4;
273 break;
274 default:
275 usage (stderr, 1);
276 }
277
252b5132
RH
278 bfd_init ();
279 set_default_bfd_target ();
280
281 if (optind >= argc)
282 {
b34976b6 283 datasection_only = FALSE;
5af11cab 284 SET_BINARY (fileno (stdin));
252b5132 285 print_strings ("{standard input}", stdin, 0, 0, 0, (char *) NULL);
b34976b6 286 files_given = TRUE;
252b5132
RH
287 }
288 else
289 {
290 for (; optind < argc; ++optind)
291 {
292 if (strcmp (argv[optind], "-") == 0)
b34976b6 293 datasection_only = FALSE;
252b5132
RH
294 else
295 {
b34976b6
AM
296 files_given = TRUE;
297 exit_status |= strings_file (argv[optind]) == FALSE;
252b5132
RH
298 }
299 }
300 }
301
b34976b6 302 if (!files_given)
252b5132
RH
303 usage (stderr, 1);
304
305 return (exit_status);
306}
307\f
06803313
NC
308/* Scan section SECT of the file ABFD, whose printable name is in
309 ARG->filename and whose size might be in ARG->filesize. If it
310 contains initialized data set `got_a_section' and print the
311 strings in it.
312
313 FIXME: We ought to be able to return error codes/messages for
314 certain conditions. */
252b5132
RH
315
316static void
06803313 317strings_a_section (bfd *abfd, asection *sect, void *arg)
252b5132 318{
06803313
NC
319 filename_and_size_t * filename_and_sizep;
320 bfd_size_type *filesizep;
321 bfd_size_type sectsize;
322 void *mem;
323
324 if ((sect->flags & DATA_FLAGS) != DATA_FLAGS)
325 return;
326
327 sectsize = bfd_get_section_size (sect);
328
329 if (sectsize <= 0)
330 return;
331
332 /* Get the size of the file. This might have been cached for us. */
333 filename_and_sizep = (filename_and_size_t *) arg;
334 filesizep = & filename_and_sizep->filesize;
335
336 if (*filesizep == 0)
337 {
338 struct stat st;
339
340 if (bfd_stat (abfd, &st))
341 return;
342
343 /* Cache the result so that we do not repeatedly stat this file. */
344 *filesizep = st.st_size;
345 }
252b5132 346
06803313
NC
347 /* Compare the size of the section against the size of the file.
348 If the section is bigger then the file must be corrupt and
349 we should not try dumping it. */
350 if (sectsize >= *filesizep)
351 return;
352
353 mem = xmalloc (sectsize);
354
355 if (bfd_get_section_contents (abfd, sect, mem, (file_ptr) 0, sectsize))
252b5132 356 {
06803313 357 got_a_section = TRUE;
8745eafa 358
06803313
NC
359 print_strings (filename_and_sizep->filename, NULL, sect->filepos,
360 0, sectsize, mem);
252b5132 361 }
06803313
NC
362
363 free (mem);
252b5132
RH
364}
365
366/* Scan all of the sections in FILE, and print the strings
367 in the initialized data section(s).
368
b34976b6
AM
369 Return TRUE if successful,
370 FALSE if not (such as if FILE is not an object file). */
252b5132 371
b34976b6 372static bfd_boolean
2da42df6 373strings_object_file (const char *file)
252b5132 374{
06803313
NC
375 filename_and_size_t filename_and_size;
376 bfd *abfd;
377
378 abfd = bfd_openr (file, target);
252b5132
RH
379
380 if (abfd == NULL)
8745eafa
NC
381 /* Treat the file as a non-object file. */
382 return FALSE;
252b5132
RH
383
384 /* This call is mainly for its side effect of reading in the sections.
385 We follow the traditional behavior of `strings' in that we don't
386 complain if we don't recognize a file to be an object file. */
b34976b6 387 if (!bfd_check_format (abfd, bfd_object))
252b5132
RH
388 {
389 bfd_close (abfd);
b34976b6 390 return FALSE;
252b5132
RH
391 }
392
b34976b6 393 got_a_section = FALSE;
06803313
NC
394 filename_and_size.filename = file;
395 filename_and_size.filesize = 0;
396 bfd_map_over_sections (abfd, strings_a_section, & filename_and_size);
252b5132
RH
397
398 if (!bfd_close (abfd))
399 {
400 bfd_nonfatal (file);
b34976b6 401 return FALSE;
252b5132
RH
402 }
403
404 return got_a_section;
405}
406
b34976b6 407/* Print the strings in FILE. Return TRUE if ok, FALSE if an error occurs. */
252b5132 408
b34976b6 409static bfd_boolean
2da42df6 410strings_file (char *file)
252b5132 411{
fb5b5478
JJ
412 statbuf st;
413
414 if (file_stat (file, &st) < 0)
415 {
416 if (errno == ENOENT)
417 non_fatal (_("'%s': No such file"), file);
418 else
419 non_fatal (_("Warning: could not locate '%s'. reason: %s"),
420 file, strerror (errno));
421 return FALSE;
422 }
f24ddbdd 423
252b5132
RH
424 /* If we weren't told to scan the whole file,
425 try to open it as an object file and only look at
426 initialized data sections. If that fails, fall back to the
427 whole file. */
428 if (!datasection_only || !strings_object_file (file))
429 {
430 FILE *stream;
431
cedd9a58 432 stream = file_open (file, FOPEN_RB);
252b5132
RH
433 if (stream == NULL)
434 {
435 fprintf (stderr, "%s: ", program_name);
436 perror (file);
b34976b6 437 return FALSE;
252b5132
RH
438 }
439
cedd9a58 440 print_strings (file, stream, (file_off) 0, 0, 0, (char *) 0);
252b5132
RH
441
442 if (fclose (stream) == EOF)
443 {
444 fprintf (stderr, "%s: ", program_name);
445 perror (file);
b34976b6 446 return FALSE;
252b5132
RH
447 }
448 }
449
b34976b6 450 return TRUE;
252b5132
RH
451}
452\f
d132876a
NC
453/* Read the next character, return EOF if none available.
454 Assume that STREAM is positioned so that the next byte read
455 is at address ADDRESS in the file.
456
457 If STREAM is NULL, do not read from it.
458 The caller can supply a buffer of characters
459 to be processed before the data in STREAM.
460 MAGIC is the address of the buffer and
461 MAGICCOUNT is how many characters are in it. */
462
463static long
2da42df6 464get_char (FILE *stream, file_off *address, int *magiccount, char **magic)
d132876a
NC
465{
466 int c, i;
956cd1d6 467 long r = EOF;
d132876a
NC
468 unsigned char buf[4];
469
470 for (i = 0; i < encoding_bytes; i++)
471 {
472 if (*magiccount)
473 {
474 (*magiccount)--;
475 c = *(*magic)++;
476 }
477 else
478 {
479 if (stream == NULL)
480 return EOF;
b7d4af3a
JW
481
482 /* Only use getc_unlocked if we found a declaration for it.
483 Otherwise, libc is not thread safe by default, and we
484 should not use it. */
485
486#if defined(HAVE_GETC_UNLOCKED) && HAVE_DECL_GETC_UNLOCKED
cedd9a58
JJ
487 c = getc_unlocked (stream);
488#else
d132876a 489 c = getc (stream);
cedd9a58 490#endif
d132876a
NC
491 if (c == EOF)
492 return EOF;
493 }
494
495 (*address)++;
496 buf[i] = c;
497 }
498
499 switch (encoding)
500 {
8745eafa 501 case 'S':
d132876a
NC
502 case 's':
503 r = buf[0];
504 break;
505 case 'b':
506 r = (buf[0] << 8) | buf[1];
507 break;
508 case 'l':
509 r = buf[0] | (buf[1] << 8);
510 break;
511 case 'B':
512 r = ((long) buf[0] << 24) | ((long) buf[1] << 16) |
513 ((long) buf[2] << 8) | buf[3];
514 break;
515 case 'L':
516 r = buf[0] | ((long) buf[1] << 8) | ((long) buf[2] << 16) |
517 ((long) buf[3] << 24);
518 break;
519 }
520
521 if (r == EOF)
522 return 0;
523
524 return r;
525}
526\f
252b5132
RH
527/* Find the strings in file FILENAME, read from STREAM.
528 Assume that STREAM is positioned so that the next byte read
529 is at address ADDRESS in the file.
530 Stop reading at address STOP_POINT in the file, if nonzero.
531
532 If STREAM is NULL, do not read from it.
533 The caller can supply a buffer of characters
534 to be processed before the data in STREAM.
535 MAGIC is the address of the buffer and
536 MAGICCOUNT is how many characters are in it.
537 Those characters come at address ADDRESS and the data in STREAM follow. */
538
539static void
2da42df6
AJ
540print_strings (const char *filename, FILE *stream, file_off address,
541 int stop_point, int magiccount, char *magic)
252b5132 542{
d132876a 543 char *buf = (char *) xmalloc (sizeof (char) * (string_min + 1));
252b5132
RH
544
545 while (1)
546 {
cedd9a58 547 file_off start;
252b5132 548 int i;
d132876a 549 long c;
252b5132
RH
550
551 /* See if the next `string_min' chars are all graphic chars. */
552 tryline:
553 if (stop_point && address >= stop_point)
554 break;
555 start = address;
556 for (i = 0; i < string_min; i++)
557 {
d132876a
NC
558 c = get_char (stream, &address, &magiccount, &magic);
559 if (c == EOF)
560 return;
8745eafa 561 if (! STRING_ISGRAPHIC (c))
252b5132
RH
562 /* Found a non-graphic. Try again starting with next char. */
563 goto tryline;
564 buf[i] = c;
565 }
566
567 /* We found a run of `string_min' graphic characters. Print up
e9f87780 568 to the next non-graphic character. */
252b5132
RH
569
570 if (print_filenames)
571 printf ("%s: ", filename);
572 if (print_addresses)
573 switch (address_radix)
574 {
575 case 8:
cedd9a58
JJ
576#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
577 if (sizeof (start) > sizeof (long))
6e3d6dc1
NC
578 {
579#ifndef __MSVCRT__
580 printf ("%7llo ", (unsigned long long) start);
581#else
582 printf ("%7I64o ", (unsigned long long) start);
583#endif
584 }
cedd9a58 585 else
50e3244d 586#elif !BFD_HOST_64BIT_LONG
cedd9a58
JJ
587 if (start != (unsigned long) start)
588 printf ("++%7lo ", (unsigned long) start);
589 else
cedd9a58
JJ
590#endif
591 printf ("%7lo ", (unsigned long) start);
252b5132
RH
592 break;
593
594 case 10:
cedd9a58
JJ
595#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
596 if (sizeof (start) > sizeof (long))
6e3d6dc1
NC
597 {
598#ifndef __MSVCRT__
599 printf ("%7lld ", (unsigned long long) start);
600#else
601 printf ("%7I64d ", (unsigned long long) start);
602#endif
603 }
cedd9a58 604 else
50e3244d 605#elif !BFD_HOST_64BIT_LONG
cedd9a58
JJ
606 if (start != (unsigned long) start)
607 printf ("++%7ld ", (unsigned long) start);
608 else
cedd9a58
JJ
609#endif
610 printf ("%7ld ", (long) start);
252b5132
RH
611 break;
612
613 case 16:
cedd9a58
JJ
614#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
615 if (sizeof (start) > sizeof (long))
6e3d6dc1
NC
616 {
617#ifndef __MSVCRT__
618 printf ("%7llx ", (unsigned long long) start);
619#else
620 printf ("%7I64x ", (unsigned long long) start);
621#endif
622 }
cedd9a58 623 else
50e3244d 624#elif !BFD_HOST_64BIT_LONG
cedd9a58 625 if (start != (unsigned long) start)
e9f87780
AM
626 printf ("%lx%8.8lx ", (unsigned long) (start >> 32),
627 (unsigned long) (start & 0xffffffff));
cedd9a58 628 else
cedd9a58
JJ
629#endif
630 printf ("%7lx ", (unsigned long) start);
252b5132
RH
631 break;
632 }
633
634 buf[i] = '\0';
635 fputs (buf, stdout);
636
637 while (1)
638 {
d132876a
NC
639 c = get_char (stream, &address, &magiccount, &magic);
640 if (c == EOF)
641 break;
8745eafa 642 if (! STRING_ISGRAPHIC (c))
252b5132
RH
643 break;
644 putchar (c);
645 }
646
647 putchar ('\n');
648 }
649}
650\f
252b5132 651static void
2da42df6 652usage (FILE *stream, int status)
252b5132 653{
8b53311e
NC
654 fprintf (stream, _("Usage: %s [option(s)] [file(s)]\n"), program_name);
655 fprintf (stream, _(" Display printable strings in [file(s)] (stdin by default)\n"));
656 fprintf (stream, _(" The options are:\n\
657 -a - --all Scan the entire file, not just the data section\n\
658 -f --print-file-name Print the name of the file before each string\n\
659 -n --bytes=[number] Locate & print any NUL-terminated sequence of at\n\
c904a764 660 -<number> least [number] characters (default 4).\n\
d412a550 661 -t --radix={o,d,x} Print the location of the string in base 8, 10 or 16\n\
8b53311e
NC
662 -o An alias for --radix=o\n\
663 -T --target=<BFDNAME> Specify the binary file format\n\
8745eafa
NC
664 -e --encoding={s,S,b,l,B,L} Select character size and endianness:\n\
665 s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit\n\
07012eee 666 @<file> Read options from <file>\n\
8b53311e 667 -h --help Display this information\n\
ffbe5983 668 -v -V --version Print the program's version number\n"));
252b5132 669 list_supported_targets (program_name, stream);
92f01d61 670 if (REPORT_BUGS_TO[0] && status == 0)
8ad3436c 671 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132
RH
672 exit (status);
673}
This page took 0.572524 seconds and 4 git commands to generate.