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