OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [binutils/] [nm.c] - Blame information for rev 161

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 15 khays
/* nm.c -- Describe symbol table of a rel file.
2
   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3
   2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
4
   Free Software Foundation, Inc.
5
 
6
   This file is part of GNU Binutils.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, write to the Free Software
20
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
21
   02110-1301, USA.  */
22
 
23
#include "sysdep.h"
24
#include "bfd.h"
25
#include "progress.h"
26
#include "getopt.h"
27
#include "aout/stab_gnu.h"
28
#include "aout/ranlib.h"
29
#include "demangle.h"
30
#include "libiberty.h"
31
#include "elf-bfd.h"
32
#include "elf/common.h"
33
#include "bucomm.h"
34
#include "plugin.h"
35
 
36
/* When sorting by size, we use this structure to hold the size and a
37
   pointer to the minisymbol.  */
38
 
39
struct size_sym
40
{
41
  const void *minisym;
42
  bfd_vma size;
43
};
44
 
45
/* When fetching relocs, we use this structure to pass information to
46
   get_relocs.  */
47
 
48
struct get_relocs_info
49
{
50
  asection **secs;
51
  arelent ***relocs;
52
  long *relcount;
53
  asymbol **syms;
54
};
55
 
56
struct extended_symbol_info
57
{
58
  symbol_info *sinfo;
59
  bfd_vma ssize;
60
  elf_symbol_type *elfinfo;
61
  /* FIXME: We should add more fields for Type, Line, Section.  */
62
};
63
#define SYM_NAME(sym)        (sym->sinfo->name)
64
#define SYM_VALUE(sym)       (sym->sinfo->value)
65
#define SYM_TYPE(sym)        (sym->sinfo->type)
66
#define SYM_STAB_NAME(sym)   (sym->sinfo->stab_name)
67
#define SYM_STAB_DESC(sym)   (sym->sinfo->stab_desc)
68
#define SYM_STAB_OTHER(sym)  (sym->sinfo->stab_other)
69
#define SYM_SIZE(sym) \
70
  (sym->elfinfo ? sym->elfinfo->internal_elf_sym.st_size: sym->ssize)
71
 
72
/* The output formatting functions.  */
73
static void print_object_filename_bsd (char *);
74
static void print_object_filename_sysv (char *);
75
static void print_object_filename_posix (char *);
76
static void print_archive_filename_bsd (char *);
77
static void print_archive_filename_sysv (char *);
78
static void print_archive_filename_posix (char *);
79
static void print_archive_member_bsd (char *, const char *);
80
static void print_archive_member_sysv (char *, const char *);
81
static void print_archive_member_posix (char *, const char *);
82
static void print_symbol_filename_bsd (bfd *, bfd *);
83
static void print_symbol_filename_sysv (bfd *, bfd *);
84
static void print_symbol_filename_posix (bfd *, bfd *);
85
static void print_value (bfd *, bfd_vma);
86
static void print_symbol_info_bsd (struct extended_symbol_info *, bfd *);
87
static void print_symbol_info_sysv (struct extended_symbol_info *, bfd *);
88
static void print_symbol_info_posix (struct extended_symbol_info *, bfd *);
89
 
90
/* Support for different output formats.  */
91
struct output_fns
92
  {
93
    /* Print the name of an object file given on the command line.  */
94
    void (*print_object_filename) (char *);
95
 
96
    /* Print the name of an archive file given on the command line.  */
97
    void (*print_archive_filename) (char *);
98
 
99
    /* Print the name of an archive member file.  */
100
    void (*print_archive_member) (char *, const char *);
101
 
102
    /* Print the name of the file (and archive, if there is one)
103
       containing a symbol.  */
104
    void (*print_symbol_filename) (bfd *, bfd *);
105
 
106
    /* Print a line of information about a symbol.  */
107
    void (*print_symbol_info) (struct extended_symbol_info *, bfd *);
108
  };
109
 
110
static struct output_fns formats[] =
111
{
112
  {print_object_filename_bsd,
113
   print_archive_filename_bsd,
114
   print_archive_member_bsd,
115
   print_symbol_filename_bsd,
116
   print_symbol_info_bsd},
117
  {print_object_filename_sysv,
118
   print_archive_filename_sysv,
119
   print_archive_member_sysv,
120
   print_symbol_filename_sysv,
121
   print_symbol_info_sysv},
122
  {print_object_filename_posix,
123
   print_archive_filename_posix,
124
   print_archive_member_posix,
125
   print_symbol_filename_posix,
126
   print_symbol_info_posix}
127
};
128
 
129
/* Indices in `formats'.  */
130
#define FORMAT_BSD 0
131
#define FORMAT_SYSV 1
132
#define FORMAT_POSIX 2
133
#define FORMAT_DEFAULT FORMAT_BSD
134
 
135
/* The output format to use.  */
136
static struct output_fns *format = &formats[FORMAT_DEFAULT];
137
 
138
/* Command options.  */
139
 
140
static int do_demangle = 0;      /* Pretty print C++ symbol names.  */
141
static int external_only = 0;    /* Print external symbols only.  */
142
static int defined_only = 0;     /* Print defined symbols only.  */
143
static int no_sort = 0;          /* Don't sort; print syms in order found.  */
144
static int print_debug_syms = 0;/* Print debugger-only symbols too.  */
145
static int print_armap = 0;      /* Describe __.SYMDEF data in archive files.  */
146
static int print_size = 0;       /* Print size of defined symbols.  */
147
static int reverse_sort = 0;     /* Sort in downward(alpha or numeric) order.  */
148
static int sort_numerically = 0;/* Sort in numeric rather than alpha order.  */
149
static int sort_by_size = 0;     /* Sort by size of symbol.  */
150
static int undefined_only = 0;   /* Print undefined symbols only.  */
151
static int dynamic = 0;          /* Print dynamic symbols.  */
152
static int show_version = 0;     /* Show the version number.  */
153
static int show_stats = 0;       /* Show statistics.  */
154
static int show_synthetic = 0;   /* Display synthesized symbols too.  */
155
static int line_numbers = 0;     /* Print line numbers for symbols.  */
156
static int allow_special_symbols = 0;  /* Allow special symbols.  */
157
 
158
/* When to print the names of files.  Not mutually exclusive in SYSV format.  */
159
static int filename_per_file = 0;        /* Once per file, on its own line.  */
160
static int filename_per_symbol = 0;      /* Once per symbol, at start of line.  */
161
 
162
/* Print formats for printing a symbol value.  */
163
static char value_format_32bit[] = "%08lx";
164
#if BFD_HOST_64BIT_LONG
165
static char value_format_64bit[] = "%016lx";
166
#elif BFD_HOST_64BIT_LONG_LONG
167
#ifndef __MSVCRT__
168
static char value_format_64bit[] = "%016llx";
169
#else
170
static char value_format_64bit[] = "%016I64x";
171
#endif
172
#endif
173
static int print_width = 0;
174
static int print_radix = 16;
175
/* Print formats for printing stab info.  */
176
static char other_format[] = "%02x";
177
static char desc_format[] = "%04x";
178
 
179
static char *target = NULL;
180
static char *plugin_target = NULL;
181
 
182
/* Used to cache the line numbers for a BFD.  */
183
static bfd *lineno_cache_bfd;
184
static bfd *lineno_cache_rel_bfd;
185
 
186
#define OPTION_TARGET 200
187
#define OPTION_PLUGIN 201
188
 
189
static struct option long_options[] =
190
{
191
  {"debug-syms", no_argument, &print_debug_syms, 1},
192
  {"demangle", optional_argument, 0, 'C'},
193
  {"dynamic", no_argument, &dynamic, 1},
194
  {"extern-only", no_argument, &external_only, 1},
195
  {"format", required_argument, 0, 'f'},
196
  {"help", no_argument, 0, 'h'},
197
  {"line-numbers", no_argument, 0, 'l'},
198
  {"no-cplus", no_argument, &do_demangle, 0},  /* Linux compatibility.  */
199
  {"no-demangle", no_argument, &do_demangle, 0},
200
  {"no-sort", no_argument, &no_sort, 1},
201
  {"numeric-sort", no_argument, &sort_numerically, 1},
202
  {"plugin", required_argument, 0, OPTION_PLUGIN},
203
  {"portability", no_argument, 0, 'P'},
204
  {"print-armap", no_argument, &print_armap, 1},
205
  {"print-file-name", no_argument, 0, 'o'},
206
  {"print-size", no_argument, 0, 'S'},
207
  {"radix", required_argument, 0, 't'},
208
  {"reverse-sort", no_argument, &reverse_sort, 1},
209
  {"size-sort", no_argument, &sort_by_size, 1},
210
  {"special-syms", no_argument, &allow_special_symbols, 1},
211
  {"stats", no_argument, &show_stats, 1},
212
  {"synthetic", no_argument, &show_synthetic, 1},
213
  {"target", required_argument, 0, OPTION_TARGET},
214
  {"defined-only", no_argument, &defined_only, 1},
215
  {"undefined-only", no_argument, &undefined_only, 1},
216
  {"version", no_argument, &show_version, 1},
217
  {0, no_argument, 0, 0}
218
};
219
 
220
/* Some error-reporting functions.  */
221
 
222
static void
223
usage (FILE *stream, int status)
224
{
225
  fprintf (stream, _("Usage: %s [option(s)] [file(s)]\n"), program_name);
226
  fprintf (stream, _(" List symbols in [file(s)] (a.out by default).\n"));
227
  fprintf (stream, _(" The options are:\n\
228
  -a, --debug-syms       Display debugger-only symbols\n\
229
  -A, --print-file-name  Print name of the input file before every symbol\n\
230
  -B                     Same as --format=bsd\n\
231
  -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
232
                          The STYLE, if specified, can be `auto' (the default),\n\
233
                          `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
234
                          or `gnat'\n\
235
      --no-demangle      Do not demangle low-level symbol names\n\
236
  -D, --dynamic          Display dynamic symbols instead of normal symbols\n\
237
      --defined-only     Display only defined symbols\n\
238
  -e                     (ignored)\n\
239
  -f, --format=FORMAT    Use the output format FORMAT.  FORMAT can be `bsd',\n\
240
                           `sysv' or `posix'.  The default is `bsd'\n\
241
  -g, --extern-only      Display only external symbols\n\
242
  -l, --line-numbers     Use debugging information to find a filename and\n\
243
                           line number for each symbol\n\
244
  -n, --numeric-sort     Sort symbols numerically by address\n\
245
  -o                     Same as -A\n\
246
  -p, --no-sort          Do not sort the symbols\n\
247
  -P, --portability      Same as --format=posix\n\
248
  -r, --reverse-sort     Reverse the sense of the sort\n"));
249
#if BFD_SUPPORTS_PLUGINS
250
  fprintf (stream, _("\
251
      --plugin NAME      Load the specified plugin\n"));
252
#endif
253
  fprintf (stream, _("\
254
  -S, --print-size       Print size of defined symbols\n\
255
  -s, --print-armap      Include index for symbols from archive members\n\
256
      --size-sort        Sort symbols by size\n\
257
      --special-syms     Include special symbols in the output\n\
258
      --synthetic        Display synthetic symbols as well\n\
259
  -t, --radix=RADIX      Use RADIX for printing symbol values\n\
260
      --target=BFDNAME   Specify the target object format as BFDNAME\n\
261
  -u, --undefined-only   Display only undefined symbols\n\
262
  -X 32_64               (ignored)\n\
263
  @FILE                  Read options from FILE\n\
264
  -h, --help             Display this information\n\
265
  -V, --version          Display this program's version number\n\
266
\n"));
267
  list_supported_targets (program_name, stream);
268
  if (REPORT_BUGS_TO[0] && status == 0)
269
    fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
270
  exit (status);
271
}
272
 
273
/* Set the radix for the symbol value and size according to RADIX.  */
274
 
275
static void
276
set_print_radix (char *radix)
277
{
278
  switch (*radix)
279
    {
280
    case 'x':
281
      break;
282
    case 'd':
283
    case 'o':
284
      if (*radix == 'd')
285
        print_radix = 10;
286
      else
287
        print_radix = 8;
288
      value_format_32bit[4] = *radix;
289
#if BFD_HOST_64BIT_LONG
290
      value_format_64bit[5] = *radix;
291
#elif BFD_HOST_64BIT_LONG_LONG
292
#ifndef __MSVCRT__
293
      value_format_64bit[6] = *radix;
294
#else
295
      value_format_64bit[7] = *radix;
296
#endif
297
#endif
298
      other_format[3] = desc_format[3] = *radix;
299
      break;
300
    default:
301
      fatal (_("%s: invalid radix"), radix);
302
    }
303
}
304
 
305
static void
306
set_output_format (char *f)
307
{
308
  int i;
309
 
310
  switch (*f)
311
    {
312
    case 'b':
313
    case 'B':
314
      i = FORMAT_BSD;
315
      break;
316
    case 'p':
317
    case 'P':
318
      i = FORMAT_POSIX;
319
      break;
320
    case 's':
321
    case 'S':
322
      i = FORMAT_SYSV;
323
      break;
324
    default:
325
      fatal (_("%s: invalid output format"), f);
326
    }
327
  format = &formats[i];
328
}
329
 
330
static const char *
331
get_symbol_type (unsigned int type)
332
{
333
  static char buff [32];
334
 
335
  switch (type)
336
    {
337
    case STT_NOTYPE:   return "NOTYPE";
338
    case STT_OBJECT:   return "OBJECT";
339
    case STT_FUNC:     return "FUNC";
340
    case STT_SECTION:  return "SECTION";
341
    case STT_FILE:     return "FILE";
342
    case STT_COMMON:   return "COMMON";
343
    case STT_TLS:      return "TLS";
344
    default:
345
      if (type >= STT_LOPROC && type <= STT_HIPROC)
346
        sprintf (buff, _("<processor specific>: %d"), type);
347
      else if (type >= STT_LOOS && type <= STT_HIOS)
348
        sprintf (buff, _("<OS specific>: %d"), type);
349
      else
350
        sprintf (buff, _("<unknown>: %d"), type);
351
      return buff;
352
    }
353
}
354
 
355
/* Print symbol name NAME, read from ABFD, with printf format FORM,
356
   demangling it if requested.  */
357
 
358
static void
359
print_symname (const char *form, const char *name, bfd *abfd)
360
{
361
  if (do_demangle && *name)
362
    {
363
      char *res = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
364
 
365
      if (res != NULL)
366
        {
367
          printf (form, res);
368
          free (res);
369
          return;
370
        }
371
    }
372
 
373
  printf (form, name);
374
}
375
 
376
static void
377
print_symdef_entry (bfd *abfd)
378
{
379
  symindex idx = BFD_NO_MORE_SYMBOLS;
380
  carsym *thesym;
381
  bfd_boolean everprinted = FALSE;
382
 
383
  for (idx = bfd_get_next_mapent (abfd, idx, &thesym);
384
       idx != BFD_NO_MORE_SYMBOLS;
385
       idx = bfd_get_next_mapent (abfd, idx, &thesym))
386
    {
387
      bfd *elt;
388
      if (!everprinted)
389
        {
390
          printf (_("\nArchive index:\n"));
391
          everprinted = TRUE;
392
        }
393
      elt = bfd_get_elt_at_index (abfd, idx);
394
      if (elt == NULL)
395
        bfd_fatal ("bfd_get_elt_at_index");
396
      if (thesym->name != (char *) NULL)
397
        {
398
          print_symname ("%s", thesym->name, abfd);
399
          printf (" in %s\n", bfd_get_filename (elt));
400
        }
401
    }
402
}
403
 
404
/* Choose which symbol entries to print;
405
   compact them downward to get rid of the rest.
406
   Return the number of symbols to be printed.  */
407
 
408
static long
409
filter_symbols (bfd *abfd, bfd_boolean is_dynamic, void *minisyms,
410
                long symcount, unsigned int size)
411
{
412
  bfd_byte *from, *fromend, *to;
413
  asymbol *store;
414
 
415
  store = bfd_make_empty_symbol (abfd);
416
  if (store == NULL)
417
    bfd_fatal (bfd_get_filename (abfd));
418
 
419
  from = (bfd_byte *) minisyms;
420
  fromend = from + symcount * size;
421
  to = (bfd_byte *) minisyms;
422
 
423
  for (; from < fromend; from += size)
424
    {
425
      int keep = 0;
426
      asymbol *sym;
427
 
428
      PROGRESS (1);
429
 
430
      sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, (const void *) from, store);
431
      if (sym == NULL)
432
        bfd_fatal (bfd_get_filename (abfd));
433
 
434
      if (undefined_only)
435
        keep = bfd_is_und_section (sym->section);
436
      else if (external_only)
437
        keep = ((sym->flags & BSF_GLOBAL) != 0
438
                || (sym->flags & BSF_WEAK) != 0
439
                /* PR binutls/12753: Unique symbols are global too.  */
440
                || (sym->flags & BSF_GNU_UNIQUE) != 0
441
                || bfd_is_und_section (sym->section)
442
                || bfd_is_com_section (sym->section));
443
      else
444
        keep = 1;
445
 
446
      if (keep
447
          && ! print_debug_syms
448
          && (sym->flags & BSF_DEBUGGING) != 0)
449
        keep = 0;
450
 
451
      if (keep
452
          && sort_by_size
453
          && (bfd_is_abs_section (sym->section)
454
              || bfd_is_und_section (sym->section)))
455
        keep = 0;
456
 
457
      if (keep
458
          && defined_only)
459
        {
460
          if (bfd_is_und_section (sym->section))
461
            keep = 0;
462
        }
463
 
464
      if (keep
465
          && bfd_is_target_special_symbol (abfd, sym)
466
          && ! allow_special_symbols)
467
        keep = 0;
468
 
469
      if (keep)
470
        {
471
          if (to != from)
472
            memcpy (to, from, size);
473
          to += size;
474
        }
475
    }
476
 
477
  return (to - (bfd_byte *) minisyms) / size;
478
}
479
 
480
/* These globals are used to pass information into the sorting
481
   routines.  */
482
static bfd *sort_bfd;
483
static bfd_boolean sort_dynamic;
484
static asymbol *sort_x;
485
static asymbol *sort_y;
486
 
487
/* Symbol-sorting predicates */
488
#define valueof(x) ((x)->section->vma + (x)->value)
489
 
490
/* Numeric sorts.  Undefined symbols are always considered "less than"
491
   defined symbols with zero values.  Common symbols are not treated
492
   specially -- i.e., their sizes are used as their "values".  */
493
 
494
static int
495
non_numeric_forward (const void *P_x, const void *P_y)
496
{
497
  asymbol *x, *y;
498
  const char *xn, *yn;
499
 
500
  x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
501
  y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
502
  if (x == NULL || y == NULL)
503
    bfd_fatal (bfd_get_filename (sort_bfd));
504
 
505
  xn = bfd_asymbol_name (x);
506
  yn = bfd_asymbol_name (y);
507
 
508
  if (yn == NULL)
509
    return xn != NULL;
510
  if (xn == NULL)
511
    return -1;
512
 
513
#ifdef HAVE_STRCOLL
514
  /* Solaris 2.5 has a bug in strcoll.
515
     strcoll returns invalid values when confronted with empty strings.  */
516
  if (*yn == '\0')
517
    return *xn != '\0';
518
  if (*xn == '\0')
519
    return -1;
520
 
521
  return strcoll (xn, yn);
522
#else
523
  return strcmp (xn, yn);
524
#endif
525
}
526
 
527
static int
528
non_numeric_reverse (const void *x, const void *y)
529
{
530
  return - non_numeric_forward (x, y);
531
}
532
 
533
static int
534
numeric_forward (const void *P_x, const void *P_y)
535
{
536
  asymbol *x, *y;
537
  asection *xs, *ys;
538
 
539
  x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
540
  y =  bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
541
  if (x == NULL || y == NULL)
542
    bfd_fatal (bfd_get_filename (sort_bfd));
543
 
544
  xs = bfd_get_section (x);
545
  ys = bfd_get_section (y);
546
 
547
  if (bfd_is_und_section (xs))
548
    {
549
      if (! bfd_is_und_section (ys))
550
        return -1;
551
    }
552
  else if (bfd_is_und_section (ys))
553
    return 1;
554
  else if (valueof (x) != valueof (y))
555
    return valueof (x) < valueof (y) ? -1 : 1;
556
 
557
  return non_numeric_forward (P_x, P_y);
558
}
559
 
560
static int
561
numeric_reverse (const void *x, const void *y)
562
{
563
  return - numeric_forward (x, y);
564
}
565
 
566
static int (*(sorters[2][2])) (const void *, const void *) =
567
{
568
  { non_numeric_forward, non_numeric_reverse },
569
  { numeric_forward, numeric_reverse }
570
};
571
 
572
/* This sort routine is used by sort_symbols_by_size.  It is similar
573
   to numeric_forward, but when symbols have the same value it sorts
574
   by section VMA.  This simplifies the sort_symbols_by_size code
575
   which handles symbols at the end of sections.  Also, this routine
576
   tries to sort file names before other symbols with the same value.
577
   That will make the file name have a zero size, which will make
578
   sort_symbols_by_size choose the non file name symbol, leading to
579
   more meaningful output.  For similar reasons, this code sorts
580
   gnu_compiled_* and gcc2_compiled before other symbols with the same
581
   value.  */
582
 
583
static int
584
size_forward1 (const void *P_x, const void *P_y)
585
{
586
  asymbol *x, *y;
587
  asection *xs, *ys;
588
  const char *xn, *yn;
589
  size_t xnl, ynl;
590
  int xf, yf;
591
 
592
  x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
593
  y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
594
  if (x == NULL || y == NULL)
595
    bfd_fatal (bfd_get_filename (sort_bfd));
596
 
597
  xs = bfd_get_section (x);
598
  ys = bfd_get_section (y);
599
 
600
  if (bfd_is_und_section (xs))
601
    abort ();
602
  if (bfd_is_und_section (ys))
603
    abort ();
604
 
605
  if (valueof (x) != valueof (y))
606
    return valueof (x) < valueof (y) ? -1 : 1;
607
 
608
  if (xs->vma != ys->vma)
609
    return xs->vma < ys->vma ? -1 : 1;
610
 
611
  xn = bfd_asymbol_name (x);
612
  yn = bfd_asymbol_name (y);
613
  xnl = strlen (xn);
614
  ynl = strlen (yn);
615
 
616
  /* The symbols gnu_compiled and gcc2_compiled convey even less
617
     information than the file name, so sort them out first.  */
618
 
619
  xf = (strstr (xn, "gnu_compiled") != NULL
620
        || strstr (xn, "gcc2_compiled") != NULL);
621
  yf = (strstr (yn, "gnu_compiled") != NULL
622
        || strstr (yn, "gcc2_compiled") != NULL);
623
 
624
  if (xf && ! yf)
625
    return -1;
626
  if (! xf && yf)
627
    return 1;
628
 
629
  /* We use a heuristic for the file name.  It may not work on non
630
     Unix systems, but it doesn't really matter; the only difference
631
     is precisely which symbol names get printed.  */
632
 
633
#define file_symbol(s, sn, snl)                 \
634
  (((s)->flags & BSF_FILE) != 0                  \
635
   || ((sn)[(snl) - 2] == '.'                   \
636
       && ((sn)[(snl) - 1] == 'o'               \
637
           || (sn)[(snl) - 1] == 'a')))
638
 
639
  xf = file_symbol (x, xn, xnl);
640
  yf = file_symbol (y, yn, ynl);
641
 
642
  if (xf && ! yf)
643
    return -1;
644
  if (! xf && yf)
645
    return 1;
646
 
647
  return non_numeric_forward (P_x, P_y);
648
}
649
 
650
/* This sort routine is used by sort_symbols_by_size.  It is sorting
651
   an array of size_sym structures into size order.  */
652
 
653
static int
654
size_forward2 (const void *P_x, const void *P_y)
655
{
656
  const struct size_sym *x = (const struct size_sym *) P_x;
657
  const struct size_sym *y = (const struct size_sym *) P_y;
658
 
659
  if (x->size < y->size)
660
    return reverse_sort ? 1 : -1;
661
  else if (x->size > y->size)
662
    return reverse_sort ? -1 : 1;
663
  else
664
    return sorters[0][reverse_sort] (x->minisym, y->minisym);
665
}
666
 
667
/* Sort the symbols by size.  ELF provides a size but for other formats
668
   we have to make a guess by assuming that the difference between the
669
   address of a symbol and the address of the next higher symbol is the
670
   size.  */
671
 
672
static long
673
sort_symbols_by_size (bfd *abfd, bfd_boolean is_dynamic, void *minisyms,
674
                      long symcount, unsigned int size,
675
                      struct size_sym **symsizesp)
676
{
677
  struct size_sym *symsizes;
678
  bfd_byte *from, *fromend;
679
  asymbol *sym = NULL;
680
  asymbol *store_sym, *store_next;
681
 
682
  qsort (minisyms, symcount, size, size_forward1);
683
 
684
  /* We are going to return a special set of symbols and sizes to
685
     print.  */
686
  symsizes = (struct size_sym *) xmalloc (symcount * sizeof (struct size_sym));
687
  *symsizesp = symsizes;
688
 
689
  /* Note that filter_symbols has already removed all absolute and
690
     undefined symbols.  Here we remove all symbols whose size winds
691
     up as zero.  */
692
  from = (bfd_byte *) minisyms;
693
  fromend = from + symcount * size;
694
 
695
  store_sym = sort_x;
696
  store_next = sort_y;
697
 
698
  if (from < fromend)
699
    {
700
      sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, (const void *) from,
701
                                      store_sym);
702
      if (sym == NULL)
703
        bfd_fatal (bfd_get_filename (abfd));
704
    }
705
 
706
  for (; from < fromend; from += size)
707
    {
708
      asymbol *next;
709
      asection *sec;
710
      bfd_vma sz;
711
      asymbol *temp;
712
 
713
      if (from + size < fromend)
714
        {
715
          next = bfd_minisymbol_to_symbol (abfd,
716
                                           is_dynamic,
717
                                           (const void *) (from + size),
718
                                           store_next);
719
          if (next == NULL)
720
            bfd_fatal (bfd_get_filename (abfd));
721
        }
722
      else
723
        next = NULL;
724
 
725
      sec = bfd_get_section (sym);
726
 
727
      if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
728
        sz = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
729
      else if (bfd_is_com_section (sec))
730
        sz = sym->value;
731
      else
732
        {
733
          if (from + size < fromend
734
              && sec == bfd_get_section (next))
735
            sz = valueof (next) - valueof (sym);
736
          else
737
            sz = (bfd_get_section_vma (abfd, sec)
738
                  + bfd_section_size (abfd, sec)
739
                  - valueof (sym));
740
        }
741
 
742
      if (sz != 0)
743
        {
744
          symsizes->minisym = (const void *) from;
745
          symsizes->size = sz;
746
          ++symsizes;
747
        }
748
 
749
      sym = next;
750
 
751
      temp = store_sym;
752
      store_sym = store_next;
753
      store_next = temp;
754
    }
755
 
756
  symcount = symsizes - *symsizesp;
757
 
758
  /* We must now sort again by size.  */
759
  qsort ((void *) *symsizesp, symcount, sizeof (struct size_sym), size_forward2);
760
 
761
  return symcount;
762
}
763
 
764
/* This function is used to get the relocs for a particular section.
765
   It is called via bfd_map_over_sections.  */
766
 
767
static void
768
get_relocs (bfd *abfd, asection *sec, void *dataarg)
769
{
770
  struct get_relocs_info *data = (struct get_relocs_info *) dataarg;
771
 
772
  *data->secs = sec;
773
 
774
  if ((sec->flags & SEC_RELOC) == 0)
775
    {
776
      *data->relocs = NULL;
777
      *data->relcount = 0;
778
    }
779
  else
780
    {
781
      long relsize;
782
 
783
      relsize = bfd_get_reloc_upper_bound (abfd, sec);
784
      if (relsize < 0)
785
        bfd_fatal (bfd_get_filename (abfd));
786
 
787
      *data->relocs = (arelent **) xmalloc (relsize);
788
      *data->relcount = bfd_canonicalize_reloc (abfd, sec, *data->relocs,
789
                                                data->syms);
790
      if (*data->relcount < 0)
791
        bfd_fatal (bfd_get_filename (abfd));
792
    }
793
 
794
  ++data->secs;
795
  ++data->relocs;
796
  ++data->relcount;
797
}
798
 
799
/* Print a single symbol.  */
800
 
801
static void
802
print_symbol (bfd *abfd, asymbol *sym, bfd_vma ssize, bfd *archive_bfd)
803
{
804
  symbol_info syminfo;
805
  struct extended_symbol_info info;
806
 
807
  PROGRESS (1);
808
 
809
  format->print_symbol_filename (archive_bfd, abfd);
810
 
811
  bfd_get_symbol_info (abfd, sym, &syminfo);
812
  info.sinfo = &syminfo;
813
  info.ssize = ssize;
814
  if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
815
    info.elfinfo = (elf_symbol_type *) sym;
816
  else
817
    info.elfinfo = NULL;
818
  format->print_symbol_info (&info, abfd);
819
 
820
  if (line_numbers)
821
    {
822
      static asymbol **syms;
823
      static long symcount;
824
      const char *filename, *functionname;
825
      unsigned int lineno;
826
 
827
      /* We need to get the canonical symbols in order to call
828
         bfd_find_nearest_line.  This is inefficient, but, then, you
829
         don't have to use --line-numbers.  */
830
      if (abfd != lineno_cache_bfd && syms != NULL)
831
        {
832
          free (syms);
833
          syms = NULL;
834
        }
835
      if (syms == NULL)
836
        {
837
          long symsize;
838
 
839
          symsize = bfd_get_symtab_upper_bound (abfd);
840
          if (symsize < 0)
841
            bfd_fatal (bfd_get_filename (abfd));
842
          syms = (asymbol **) xmalloc (symsize);
843
          symcount = bfd_canonicalize_symtab (abfd, syms);
844
          if (symcount < 0)
845
            bfd_fatal (bfd_get_filename (abfd));
846
          lineno_cache_bfd = abfd;
847
        }
848
 
849
      if (bfd_is_und_section (bfd_get_section (sym)))
850
        {
851
          static asection **secs;
852
          static arelent ***relocs;
853
          static long *relcount;
854
          static unsigned int seccount;
855
          unsigned int i;
856
          const char *symname;
857
 
858
          /* For an undefined symbol, we try to find a reloc for the
859
             symbol, and print the line number of the reloc.  */
860
          if (abfd != lineno_cache_rel_bfd && relocs != NULL)
861
            {
862
              for (i = 0; i < seccount; i++)
863
                if (relocs[i] != NULL)
864
                  free (relocs[i]);
865
              free (secs);
866
              free (relocs);
867
              free (relcount);
868
              secs = NULL;
869
              relocs = NULL;
870
              relcount = NULL;
871
            }
872
 
873
          if (relocs == NULL)
874
            {
875
              struct get_relocs_info rinfo;
876
 
877
              seccount = bfd_count_sections (abfd);
878
 
879
              secs = (asection **) xmalloc (seccount * sizeof *secs);
880
              relocs = (arelent ***) xmalloc (seccount * sizeof *relocs);
881
              relcount = (long *) xmalloc (seccount * sizeof *relcount);
882
 
883
              rinfo.secs = secs;
884
              rinfo.relocs = relocs;
885
              rinfo.relcount = relcount;
886
              rinfo.syms = syms;
887
              bfd_map_over_sections (abfd, get_relocs, (void *) &rinfo);
888
              lineno_cache_rel_bfd = abfd;
889
            }
890
 
891
          symname = bfd_asymbol_name (sym);
892
          for (i = 0; i < seccount; i++)
893
            {
894
              long j;
895
 
896
              for (j = 0; j < relcount[i]; j++)
897
                {
898
                  arelent *r;
899
 
900
                  r = relocs[i][j];
901
                  if (r->sym_ptr_ptr != NULL
902
                      && (*r->sym_ptr_ptr)->section == sym->section
903
                      && (*r->sym_ptr_ptr)->value == sym->value
904
                      && strcmp (symname,
905
                                 bfd_asymbol_name (*r->sym_ptr_ptr)) == 0
906
                      && bfd_find_nearest_line (abfd, secs[i], syms,
907
                                                r->address, &filename,
908
                                                &functionname, &lineno)
909
                      && filename != NULL)
910
                    {
911
                      /* We only print the first one we find.  */
912
                      printf ("\t%s:%u", filename, lineno);
913
                      i = seccount;
914
                      break;
915
                    }
916
                }
917
            }
918
        }
919
      else if (bfd_get_section (sym)->owner == abfd)
920
        {
921
          if ((bfd_find_line (abfd, syms, sym, &filename, &lineno)
922
               || bfd_find_nearest_line (abfd, bfd_get_section (sym),
923
                                         syms, sym->value, &filename,
924
                                         &functionname, &lineno))
925
              && filename != NULL
926
              && lineno != 0)
927
            printf ("\t%s:%u", filename, lineno);
928
        }
929
    }
930
 
931
  putchar ('\n');
932
}
933
 
934
/* Print the symbols when sorting by size.  */
935
 
936
static void
937
print_size_symbols (bfd *abfd, bfd_boolean is_dynamic,
938
                    struct size_sym *symsizes, long symcount,
939
                    bfd *archive_bfd)
940
{
941
  asymbol *store;
942
  struct size_sym *from, *fromend;
943
 
944
  store = bfd_make_empty_symbol (abfd);
945
  if (store == NULL)
946
    bfd_fatal (bfd_get_filename (abfd));
947
 
948
  from = symsizes;
949
  fromend = from + symcount;
950
  for (; from < fromend; from++)
951
    {
952
      asymbol *sym;
953
      bfd_vma ssize;
954
 
955
      sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, from->minisym, store);
956
      if (sym == NULL)
957
        bfd_fatal (bfd_get_filename (abfd));
958
 
959
      /* For elf we have already computed the correct symbol size.  */
960
      if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
961
        ssize = from->size;
962
      else
963
        ssize = from->size - bfd_section_vma (abfd, bfd_get_section (sym));
964
 
965
      print_symbol (abfd, sym, ssize, archive_bfd);
966
    }
967
}
968
 
969
 
970
/* Print the symbols.  If ARCHIVE_BFD is non-NULL, it is the archive
971
   containing ABFD.  */
972
 
973
static void
974
print_symbols (bfd *abfd, bfd_boolean is_dynamic, void *minisyms, long symcount,
975
               unsigned int size, bfd *archive_bfd)
976
{
977
  asymbol *store;
978
  bfd_byte *from, *fromend;
979
 
980
  store = bfd_make_empty_symbol (abfd);
981
  if (store == NULL)
982
    bfd_fatal (bfd_get_filename (abfd));
983
 
984
  from = (bfd_byte *) minisyms;
985
  fromend = from + symcount * size;
986
  for (; from < fromend; from += size)
987
    {
988
      asymbol *sym;
989
 
990
      sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, from, store);
991
      if (sym == NULL)
992
        bfd_fatal (bfd_get_filename (abfd));
993
 
994
      print_symbol (abfd, sym, (bfd_vma) 0, archive_bfd);
995
    }
996
}
997
 
998
/* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD.  */
999
 
1000
static void
1001
display_rel_file (bfd *abfd, bfd *archive_bfd)
1002
{
1003
  long symcount;
1004
  void *minisyms;
1005
  unsigned int size;
1006
  struct size_sym *symsizes;
1007
 
1008
  if (! dynamic)
1009
    {
1010
      if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
1011
        {
1012
          non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
1013
          return;
1014
        }
1015
    }
1016
 
1017
  symcount = bfd_read_minisymbols (abfd, dynamic, &minisyms, &size);
1018
  if (symcount < 0)
1019
    bfd_fatal (bfd_get_filename (abfd));
1020
 
1021
  if (symcount == 0)
1022
    {
1023
      non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
1024
      return;
1025
    }
1026
 
1027
  if (show_synthetic && size == sizeof (asymbol *))
1028
    {
1029
      asymbol *synthsyms;
1030
      long synth_count;
1031
      asymbol **static_syms = NULL;
1032
      asymbol **dyn_syms = NULL;
1033
      long static_count = 0;
1034
      long dyn_count = 0;
1035
 
1036
      if (dynamic)
1037
        {
1038
          dyn_count = symcount;
1039
          dyn_syms = (asymbol **) minisyms;
1040
        }
1041
      else
1042
        {
1043
          long storage = bfd_get_dynamic_symtab_upper_bound (abfd);
1044
 
1045
          static_count = symcount;
1046
          static_syms = (asymbol **) minisyms;
1047
 
1048
          if (storage > 0)
1049
            {
1050
              dyn_syms = (asymbol **) xmalloc (storage);
1051
              dyn_count = bfd_canonicalize_dynamic_symtab (abfd, dyn_syms);
1052
              if (dyn_count < 0)
1053
                bfd_fatal (bfd_get_filename (abfd));
1054
            }
1055
        }
1056
      synth_count = bfd_get_synthetic_symtab (abfd, static_count, static_syms,
1057
                                              dyn_count, dyn_syms, &synthsyms);
1058
      if (synth_count > 0)
1059
        {
1060
          asymbol **symp;
1061
          void *new_mini;
1062
          long i;
1063
 
1064
          new_mini = xmalloc ((symcount + synth_count + 1) * sizeof (*symp));
1065
          symp = (asymbol **) new_mini;
1066
          memcpy (symp, minisyms, symcount * sizeof (*symp));
1067
          symp += symcount;
1068
          for (i = 0; i < synth_count; i++)
1069
            *symp++ = synthsyms + i;
1070
          *symp = 0;
1071
          minisyms = new_mini;
1072
          symcount += synth_count;
1073
        }
1074
    }
1075
 
1076
  /* Discard the symbols we don't want to print.
1077
     It's OK to do this in place; we'll free the storage anyway
1078
     (after printing).  */
1079
 
1080
  symcount = filter_symbols (abfd, dynamic, minisyms, symcount, size);
1081
 
1082
  symsizes = NULL;
1083
  if (! no_sort)
1084
    {
1085
      sort_bfd = abfd;
1086
      sort_dynamic = dynamic;
1087
      sort_x = bfd_make_empty_symbol (abfd);
1088
      sort_y = bfd_make_empty_symbol (abfd);
1089
      if (sort_x == NULL || sort_y == NULL)
1090
        bfd_fatal (bfd_get_filename (abfd));
1091
 
1092
      if (! sort_by_size)
1093
        qsort (minisyms, symcount, size,
1094
               sorters[sort_numerically][reverse_sort]);
1095
      else
1096
        symcount = sort_symbols_by_size (abfd, dynamic, minisyms, symcount,
1097
                                         size, &symsizes);
1098
    }
1099
 
1100
  if (! sort_by_size)
1101
    print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd);
1102
  else
1103
    print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd);
1104
 
1105
  free (minisyms);
1106
  free (symsizes);
1107
}
1108
 
1109
static void
1110
set_print_width (bfd *file)
1111
{
1112
  print_width = bfd_get_arch_size (file);
1113
 
1114
  if (print_width == -1)
1115
    {
1116
      /* PR binutils/4292
1117
         Guess the target's bitsize based on its name.
1118
         We assume here than any 64-bit format will include
1119
         "64" somewhere in its name.  The only known exception
1120
         is the MMO object file format.  */
1121
      if (strstr (bfd_get_target (file), "64") != NULL
1122
          || strcmp (bfd_get_target (file), "mmo") == 0)
1123
        print_width = 64;
1124
      else
1125
        print_width = 32;
1126
    }
1127
}
1128
 
1129
static void
1130
display_archive (bfd *file)
1131
{
1132
  bfd *arfile = NULL;
1133
  bfd *last_arfile = NULL;
1134
  char **matching;
1135
 
1136
  format->print_archive_filename (bfd_get_filename (file));
1137
 
1138
  if (print_armap)
1139
    print_symdef_entry (file);
1140
 
1141
  for (;;)
1142
    {
1143
      PROGRESS (1);
1144
 
1145
      arfile = bfd_openr_next_archived_file (file, arfile);
1146
 
1147
      if (arfile == NULL)
1148
        {
1149
          if (bfd_get_error () != bfd_error_no_more_archived_files)
1150
            bfd_fatal (bfd_get_filename (file));
1151
          break;
1152
        }
1153
 
1154
      if (bfd_check_format_matches (arfile, bfd_object, &matching))
1155
        {
1156
          set_print_width (arfile);
1157
          format->print_archive_member (bfd_get_filename (file),
1158
                                        bfd_get_filename (arfile));
1159
          display_rel_file (arfile, file);
1160
        }
1161
      else
1162
        {
1163
          bfd_nonfatal (bfd_get_filename (arfile));
1164
          if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
1165
            {
1166
              list_matching_formats (matching);
1167
              free (matching);
1168
            }
1169
        }
1170
 
1171
      if (last_arfile != NULL)
1172
        {
1173
          bfd_close (last_arfile);
1174
          lineno_cache_bfd = NULL;
1175
          lineno_cache_rel_bfd = NULL;
1176
        }
1177
      last_arfile = arfile;
1178
    }
1179
 
1180
  if (last_arfile != NULL)
1181
    {
1182
      bfd_close (last_arfile);
1183
      lineno_cache_bfd = NULL;
1184
      lineno_cache_rel_bfd = NULL;
1185
    }
1186
}
1187
 
1188
static bfd_boolean
1189
display_file (char *filename)
1190
{
1191
  bfd_boolean retval = TRUE;
1192
  bfd *file;
1193
  char **matching;
1194
 
1195
  if (get_file_size (filename) < 1)
1196
    return FALSE;
1197
 
1198
  file = bfd_openr (filename, target ? target : plugin_target);
1199
  if (file == NULL)
1200
    {
1201
      bfd_nonfatal (filename);
1202
      return FALSE;
1203
    }
1204
 
1205 161 khays
  /* If printing line numbers, decompress the debug sections.  */
1206
  if (line_numbers)
1207
    file->flags |= BFD_DECOMPRESS;
1208
 
1209 15 khays
  if (bfd_check_format (file, bfd_archive))
1210
    {
1211
      display_archive (file);
1212
    }
1213
  else if (bfd_check_format_matches (file, bfd_object, &matching))
1214
    {
1215
      set_print_width (file);
1216
      format->print_object_filename (filename);
1217
      display_rel_file (file, NULL);
1218
    }
1219
  else
1220
    {
1221
      bfd_nonfatal (filename);
1222
      if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
1223
        {
1224
          list_matching_formats (matching);
1225
          free (matching);
1226
        }
1227
      retval = FALSE;
1228
    }
1229
 
1230
  if (!bfd_close (file))
1231
    bfd_fatal (filename);
1232
 
1233
  lineno_cache_bfd = NULL;
1234
  lineno_cache_rel_bfd = NULL;
1235
 
1236
  return retval;
1237
}
1238
 
1239
/* The following 3 groups of functions are called unconditionally,
1240
   once at the start of processing each file of the appropriate type.
1241
   They should check `filename_per_file' and `filename_per_symbol',
1242
   as appropriate for their output format, to determine whether to
1243
   print anything.  */
1244
 
1245
/* Print the name of an object file given on the command line.  */
1246
 
1247
static void
1248
print_object_filename_bsd (char *filename)
1249
{
1250
  if (filename_per_file && !filename_per_symbol)
1251
    printf ("\n%s:\n", filename);
1252
}
1253
 
1254
static void
1255
print_object_filename_sysv (char *filename)
1256
{
1257
  if (undefined_only)
1258
    printf (_("\n\nUndefined symbols from %s:\n\n"), filename);
1259
  else
1260
    printf (_("\n\nSymbols from %s:\n\n"), filename);
1261
  if (print_width == 32)
1262
    printf (_("\
1263
Name                  Value   Class        Type         Size     Line  Section\n\n"));
1264
  else
1265
    printf (_("\
1266
Name                  Value           Class        Type         Size             Line  Section\n\n"));
1267
}
1268
 
1269
static void
1270
print_object_filename_posix (char *filename)
1271
{
1272
  if (filename_per_file && !filename_per_symbol)
1273
    printf ("%s:\n", filename);
1274
}
1275
 
1276
/* Print the name of an archive file given on the command line.  */
1277
 
1278
static void
1279
print_archive_filename_bsd (char *filename)
1280
{
1281
  if (filename_per_file)
1282
    printf ("\n%s:\n", filename);
1283
}
1284
 
1285
static void
1286
print_archive_filename_sysv (char *filename ATTRIBUTE_UNUSED)
1287
{
1288
}
1289
 
1290
static void
1291
print_archive_filename_posix (char *filename ATTRIBUTE_UNUSED)
1292
{
1293
}
1294
 
1295
/* Print the name of an archive member file.  */
1296
 
1297
static void
1298
print_archive_member_bsd (char *archive ATTRIBUTE_UNUSED,
1299
                          const char *filename)
1300
{
1301
  if (!filename_per_symbol)
1302
    printf ("\n%s:\n", filename);
1303
}
1304
 
1305
static void
1306
print_archive_member_sysv (char *archive, const char *filename)
1307
{
1308
  if (undefined_only)
1309
    printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename);
1310
  else
1311
    printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename);
1312
  if (print_width == 32)
1313
    printf (_("\
1314
Name                  Value   Class        Type         Size     Line  Section\n\n"));
1315
  else
1316
    printf (_("\
1317
Name                  Value           Class        Type         Size             Line  Section\n\n"));
1318
}
1319
 
1320
static void
1321
print_archive_member_posix (char *archive, const char *filename)
1322
{
1323
  if (!filename_per_symbol)
1324
    printf ("%s[%s]:\n", archive, filename);
1325
}
1326
 
1327
/* Print the name of the file (and archive, if there is one)
1328
   containing a symbol.  */
1329
 
1330
static void
1331
print_symbol_filename_bsd (bfd *archive_bfd, bfd *abfd)
1332
{
1333
  if (filename_per_symbol)
1334
    {
1335
      if (archive_bfd)
1336
        printf ("%s:", bfd_get_filename (archive_bfd));
1337
      printf ("%s:", bfd_get_filename (abfd));
1338
    }
1339
}
1340
 
1341
static void
1342
print_symbol_filename_sysv (bfd *archive_bfd, bfd *abfd)
1343
{
1344
  if (filename_per_symbol)
1345
    {
1346
      if (archive_bfd)
1347
        printf ("%s:", bfd_get_filename (archive_bfd));
1348
      printf ("%s:", bfd_get_filename (abfd));
1349
    }
1350
}
1351
 
1352
static void
1353
print_symbol_filename_posix (bfd *archive_bfd, bfd *abfd)
1354
{
1355
  if (filename_per_symbol)
1356
    {
1357
      if (archive_bfd)
1358
        printf ("%s[%s]: ", bfd_get_filename (archive_bfd),
1359
                bfd_get_filename (abfd));
1360
      else
1361
        printf ("%s: ", bfd_get_filename (abfd));
1362
    }
1363
}
1364
 
1365
/* Print a symbol value.  */
1366
 
1367
static void
1368
print_value (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma val)
1369
{
1370
  switch (print_width)
1371
    {
1372
    case 32:
1373
      printf (value_format_32bit, (unsigned long) val);
1374
      break;
1375
 
1376
    case 64:
1377
#if BFD_HOST_64BIT_LONG || BFD_HOST_64BIT_LONG_LONG
1378
      printf (value_format_64bit, val);
1379
#else
1380
      /* We have a 64 bit value to print, but the host is only 32 bit.  */
1381
      if (print_radix == 16)
1382
        bfd_fprintf_vma (abfd, stdout, val);
1383
      else
1384
        {
1385
          char buf[30];
1386
          char *s;
1387
 
1388
          s = buf + sizeof buf;
1389
          *--s = '\0';
1390
          while (val > 0)
1391
            {
1392
              *--s = (val % print_radix) + '0';
1393
              val /= print_radix;
1394
            }
1395
          while ((buf + sizeof buf - 1) - s < 16)
1396
            *--s = '0';
1397
          printf ("%s", s);
1398
        }
1399
#endif
1400
      break;
1401
 
1402
    default:
1403
      fatal (_("Print width has not been initialized (%d)"), print_width);
1404
      break;
1405
    }
1406
}
1407
 
1408
/* Print a line of information about a symbol.  */
1409
 
1410
static void
1411
print_symbol_info_bsd (struct extended_symbol_info *info, bfd *abfd)
1412
{
1413
  if (bfd_is_undefined_symclass (SYM_TYPE (info)))
1414
    {
1415
      if (print_width == 64)
1416
        printf ("        ");
1417
      printf ("        ");
1418
    }
1419
  else
1420
    {
1421
      /* Normally we print the value of the symbol.  If we are printing the
1422
         size or sorting by size then we print its size, except for the
1423
         (weird) special case where both flags are defined, in which case we
1424
         print both values.  This conforms to documented behaviour.  */
1425
      if (sort_by_size && !print_size)
1426
        print_value (abfd, SYM_SIZE (info));
1427
      else
1428
        print_value (abfd, SYM_VALUE (info));
1429
 
1430
      if (print_size && SYM_SIZE (info))
1431
        {
1432
          printf (" ");
1433
          print_value (abfd, SYM_SIZE (info));
1434
        }
1435
    }
1436
 
1437
  printf (" %c", SYM_TYPE (info));
1438
 
1439
  if (SYM_TYPE (info) == '-')
1440
    {
1441
      /* A stab.  */
1442
      printf (" ");
1443
      printf (other_format, SYM_STAB_OTHER (info));
1444
      printf (" ");
1445
      printf (desc_format, SYM_STAB_DESC (info));
1446
      printf (" %5s", SYM_STAB_NAME (info));
1447
    }
1448
  print_symname (" %s", SYM_NAME (info), abfd);
1449
}
1450
 
1451
static void
1452
print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd)
1453
{
1454
  print_symname ("%-20s|", SYM_NAME (info), abfd);
1455
 
1456
  if (bfd_is_undefined_symclass (SYM_TYPE (info)))
1457
    {
1458
      if (print_width == 32)
1459
        printf ("        ");
1460
      else
1461
        printf ("                ");
1462
    }
1463
  else
1464
    print_value (abfd, SYM_VALUE (info));
1465
 
1466
  printf ("|   %c  |", SYM_TYPE (info));
1467
 
1468
  if (SYM_TYPE (info) == '-')
1469
    {
1470
      /* A stab.  */
1471
      printf ("%18s|  ", SYM_STAB_NAME (info));         /* (C) Type.  */
1472
      printf (desc_format, SYM_STAB_DESC (info));       /* Size.  */
1473
      printf ("|     |");                               /* Line, Section.  */
1474
    }
1475
  else
1476
    {
1477
      /* Type, Size, Line, Section */
1478
      if (info->elfinfo)
1479
        printf ("%18s|",
1480
                get_symbol_type (ELF_ST_TYPE (info->elfinfo->internal_elf_sym.st_info)));
1481
      else
1482
        printf ("                  |");
1483
 
1484
      if (SYM_SIZE (info))
1485
        print_value (abfd, SYM_SIZE (info));
1486
      else
1487
        {
1488
          if (print_width == 32)
1489
            printf ("        ");
1490
          else
1491
            printf ("                ");
1492
        }
1493
 
1494
      if (info->elfinfo)
1495
        printf("|     |%s", info->elfinfo->symbol.section->name);
1496
      else
1497
        printf("|     |");
1498
    }
1499
}
1500
 
1501
static void
1502
print_symbol_info_posix (struct extended_symbol_info *info, bfd *abfd)
1503
{
1504
  print_symname ("%s ", SYM_NAME (info), abfd);
1505
  printf ("%c ", SYM_TYPE (info));
1506
 
1507
  if (bfd_is_undefined_symclass (SYM_TYPE (info)))
1508
    printf ("        ");
1509
  else
1510
    {
1511
      print_value (abfd, SYM_VALUE (info));
1512
      printf (" ");
1513
      if (SYM_SIZE (info))
1514
        print_value (abfd, SYM_SIZE (info));
1515
    }
1516
}
1517
 
1518
int
1519
main (int argc, char **argv)
1520
{
1521
  int c;
1522
  int retval;
1523
 
1524
#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
1525
  setlocale (LC_MESSAGES, "");
1526
#endif
1527
#if defined (HAVE_SETLOCALE)
1528
  setlocale (LC_CTYPE, "");
1529
  setlocale (LC_COLLATE, "");
1530
#endif
1531
  bindtextdomain (PACKAGE, LOCALEDIR);
1532
  textdomain (PACKAGE);
1533
 
1534
  program_name = *argv;
1535
  xmalloc_set_program_name (program_name);
1536
#if BFD_SUPPORTS_PLUGINS
1537
  bfd_plugin_set_program_name (program_name);
1538
#endif
1539
 
1540
  START_PROGRESS (program_name, 0);
1541
 
1542
  expandargv (&argc, &argv);
1543
 
1544
  bfd_init ();
1545
  set_default_bfd_target ();
1546
 
1547
  while ((c = getopt_long (argc, argv, "aABCDef:gHhlnopPrSst:uvVvX:",
1548
                           long_options, (int *) 0)) != EOF)
1549
    {
1550
      switch (c)
1551
        {
1552
        case 'a':
1553
          print_debug_syms = 1;
1554
          break;
1555
        case 'A':
1556
        case 'o':
1557
          filename_per_symbol = 1;
1558
          break;
1559
        case 'B':               /* For MIPS compatibility.  */
1560
          set_output_format ("bsd");
1561
          break;
1562
        case 'C':
1563
          do_demangle = 1;
1564
          if (optarg != NULL)
1565
            {
1566
              enum demangling_styles style;
1567
 
1568
              style = cplus_demangle_name_to_style (optarg);
1569
              if (style == unknown_demangling)
1570
                fatal (_("unknown demangling style `%s'"),
1571
                       optarg);
1572
 
1573
              cplus_demangle_set_style (style);
1574
            }
1575
          break;
1576
        case 'D':
1577
          dynamic = 1;
1578
          break;
1579
        case 'e':
1580
          /* Ignored for HP/UX compatibility.  */
1581
          break;
1582
        case 'f':
1583
          set_output_format (optarg);
1584
          break;
1585
        case 'g':
1586
          external_only = 1;
1587
          break;
1588
        case 'H':
1589
        case 'h':
1590
          usage (stdout, 0);
1591
        case 'l':
1592
          line_numbers = 1;
1593
          break;
1594
        case 'n':
1595
        case 'v':
1596
          sort_numerically = 1;
1597
          break;
1598
        case 'p':
1599
          no_sort = 1;
1600
          break;
1601
        case 'P':
1602
          set_output_format ("posix");
1603
          break;
1604
        case 'r':
1605
          reverse_sort = 1;
1606
          break;
1607
        case 's':
1608
          print_armap = 1;
1609
          break;
1610
        case 'S':
1611
          print_size = 1;
1612
          break;
1613
        case 't':
1614
          set_print_radix (optarg);
1615
          break;
1616
        case 'u':
1617
          undefined_only = 1;
1618
          break;
1619
        case 'V':
1620
          show_version = 1;
1621
          break;
1622
        case 'X':
1623
          /* Ignored for (partial) AIX compatibility.  On AIX, the
1624
             argument has values 32, 64, or 32_64, and specifies that
1625
             only 32-bit, only 64-bit, or both kinds of objects should
1626
             be examined.  The default is 32.  So plain AIX nm on a
1627
             library archive with both kinds of objects will ignore
1628
             the 64-bit ones.  For GNU nm, the default is and always
1629
             has been -X 32_64, and other options are not supported.  */
1630
          if (strcmp (optarg, "32_64") != 0)
1631
            fatal (_("Only -X 32_64 is supported"));
1632
          break;
1633
 
1634
        case OPTION_TARGET:     /* --target */
1635
          target = optarg;
1636
          break;
1637
 
1638
        case OPTION_PLUGIN:     /* --plugin */
1639
#if BFD_SUPPORTS_PLUGINS
1640
          plugin_target = "plugin";
1641
          bfd_plugin_set_plugin (optarg);
1642
#else
1643
          fatal (_("sorry - this program has been built without plugin support\n"));
1644
#endif
1645
          break;
1646
 
1647
        case 0:          /* A long option that just sets a flag.  */
1648
          break;
1649
 
1650
        default:
1651
          usage (stderr, 1);
1652
        }
1653
    }
1654
 
1655
  if (show_version)
1656
    print_version ("nm");
1657
 
1658
  if (sort_by_size && undefined_only)
1659
    {
1660
      non_fatal (_("Using the --size-sort and --undefined-only options together"));
1661
      non_fatal (_("will produce no output, since undefined symbols have no size."));
1662
      return 0;
1663
    }
1664
 
1665
  /* OK, all options now parsed.  If no filename specified, do a.out.  */
1666
  if (optind == argc)
1667
    return !display_file ("a.out");
1668
 
1669
  retval = 0;
1670
 
1671
  if (argc - optind > 1)
1672
    filename_per_file = 1;
1673
 
1674
  /* We were given several filenames to do.  */
1675
  while (optind < argc)
1676
    {
1677
      PROGRESS (1);
1678
      if (!display_file (argv[optind++]))
1679
        retval++;
1680
    }
1681
 
1682
  END_PROGRESS (program_name);
1683
 
1684
#ifdef HAVE_SBRK
1685
  if (show_stats)
1686
    {
1687
      char *lim = (char *) sbrk (0);
1688
 
1689
      non_fatal (_("data size %ld"), (long) (lim - (char *) &environ));
1690
    }
1691
#endif
1692
 
1693
  exit (retval);
1694
  return retval;
1695
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.