aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2006-05-23 01:36:07 +0000
committerAlan Modra <amodra@gmail.com>2006-05-23 01:36:07 +0000
commit4d35a0aa887f736f2c349a3f20006c8f5d773452 (patch)
treee27c1b1a25965c38bc335734d11311bb50116d7a /bfd
parentc9fe3751afad1f4adb0678cea38a4d7fa28f5a49 (diff)
downloadfsf-binutils-gdb-4d35a0aa887f736f2c349a3f20006c8f5d773452.zip
fsf-binutils-gdb-4d35a0aa887f736f2c349a3f20006c8f5d773452.tar.gz
fsf-binutils-gdb-4d35a0aa887f736f2c349a3f20006c8f5d773452.tar.bz2
* elf64-ppc.c (compare_symbols): Prefer strong dynamic global
function syms over other syms.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf64-ppc.c26
2 files changed, 31 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 76e740c..b308c88 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2006-05-23 Alan Modra <amodra@bigpond.net.au>
+
+ * elf64-ppc.c (compare_symbols): Prefer strong dynamic global
+ function syms over other syms.
+
2006-05-22 Daniel Jacobowitz <dan@codesourcery.com>
* elflink.c (_bfd_elf_add_dynamic_entry): Remove DT_TEXTREL
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 1697d53..b1ec942 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -2626,6 +2626,32 @@ compare_symbols (const void *ap, const void *bp)
if (a->value + a->section->vma > b->value + b->section->vma)
return 1;
+ /* For syms with the same value, prefer strong dynamic global function
+ syms over other syms. */
+ if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
+ return -1;
+
+ if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
+ return 1;
+
+ if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
+ return -1;
+
+ if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
+ return 1;
+
+ if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
+ return -1;
+
+ if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
+ return 1;
+
+ if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
+ return -1;
+
+ if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
+ return 1;
+
return 0;
}