summaryrefslogtreecommitdiff
path: root/binutils/objdump.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2016-07-09 14:25:31 +0930
committerAlan Modra <amodra@gmail.com>2016-07-09 16:53:33 +0930
commit32a0481fb147de2cd08c2980b177c298b4582ce7 (patch)
treeb20bded6e8ae35add5d441e504b18282583bf9c4 /binutils/objdump.c
parent11575232311d4fe4652ff37a46581ae4a13ccdc4 (diff)
PR20337, Objdump makes poor choice of symbols
binutils/ PR binutils/20337 * objdump.c (compare_symbols): For ELF, sort same value/type symbols according to size. ld/ * testsuite/ld-powerpc/elfv2exe.d: Update.
Diffstat (limited to 'binutils/objdump.c')
-rw-r--r--binutils/objdump.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/binutils/objdump.c b/binutils/objdump.c
index 29d2276f6c..2d2bddb03c 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -738,6 +738,21 @@ compare_symbols (const void *ap, const void *bp)
return 1;
}
+ if (bfd_get_flavour (bfd_asymbol_bfd (a)) == bfd_target_elf_flavour
+ && bfd_get_flavour (bfd_asymbol_bfd (b)) == bfd_target_elf_flavour)
+ {
+ bfd_vma asz, bsz;
+
+ asz = 0;
+ if ((a->flags & BSF_SYNTHETIC) == 0)
+ asz = ((elf_symbol_type *) a)->internal_elf_sym.st_size;
+ bsz = 0;
+ if ((b->flags & BSF_SYNTHETIC) == 0)
+ bsz = ((elf_symbol_type *) b)->internal_elf_sym.st_size;
+ if (asz != bsz)
+ return asz > bsz ? -1 : 1;
+ }
+
/* Symbols that start with '.' might be section names, so sort them
after symbols that don't start with '.'. */
if (an[0] == '.' && bn[0] != '.')