When computing size of symbols for an ELF target use the internal size field.
authorNick Clifton <nickc@redhat.com>
Fri, 7 Jun 2002 11:02:48 +0000 (11:02 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 7 Jun 2002 11:02:48 +0000 (11:02 +0000)
binutils/ChangeLog
binutils/nm.c

index acf7d73..db06f91 100644 (file)
@@ -1,3 +1,8 @@
+2002-06-07  Elias Athanasopoulos  <eathan@otenet.gr>
+       
+       * nm.c: When computing size of symbols for an ELF target use the
+       internal size field.
+
 2002-06-06  John David Anglin  <dave@hiauly1.hia.nrc.ca>
 
        * testsuite/binutils-all/objcopy.exp: clear xfail for
index f7e3cd1..e260a83 100644 (file)
@@ -1,6 +1,6 @@
 /* nm.c -- Describe symbol table of a rel file.
    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001
+   2001, 2002
    Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
@@ -28,6 +28,7 @@
 #include "aout/ranlib.h"
 #include "demangle.h"
 #include "libiberty.h"
+#include "elf-bfd.h"
 
 /* When sorting by size, we use this structure to hold the size and a
    pointer to the minisymbol.  */
@@ -839,10 +840,10 @@ size_forward2 (P_x, P_y)
     return sorters[0][reverse_sort] (x->minisym, y->minisym);
 }
 
-/* Sort the symbols by size.  We guess the size by assuming that the
-   difference between the address of a symbol and the address of the
-   next higher symbol is the size.  FIXME: ELF actually stores a size
-   with each symbol.  We should use it.  */
+/* Sort the symbols by size.  ELF provides a size but for other formats
+   we have to make a guess by assuming that the difference between the
+   address of a symbol and the address of the next higher symbol is the
+   size.  */
 
 static long
 sort_symbols_by_size (abfd, dynamic, minisyms, symcount, size, symsizesp)
@@ -904,7 +905,9 @@ sort_symbols_by_size (abfd, dynamic, minisyms, symcount, size, symsizesp)
 
       sec = bfd_get_section (sym);
 
-      if (bfd_is_com_section (sec))
+      if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) 
+       sz = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
+      else if (bfd_is_com_section (sec))
        sz = sym->value;
       else
        {