* linker.c (fix_syms): Consider SEC_LOAD when choosing section.
authorHans-Peter Nilsson <hp@axis.com>
Fri, 31 Jul 2009 02:25:56 +0000 (02:25 +0000)
committerHans-Peter Nilsson <hp@axis.com>
Fri, 31 Jul 2009 02:25:56 +0000 (02:25 +0000)
bfd/ChangeLog
bfd/linker.c

index 5a1049380e273c357a42f2c8617c1b29227dfc59..88e61ec603a9f9c8f6554013b9aaaf2908510a75 100644 (file)
@@ -1,3 +1,7 @@
+2009-07-31  Hans-Peter Nilsson  <hp@bitrange.com>
+
+       * linker.c (fix_syms): Consider SEC_LOAD when choosing section.
+
 2009-07-30  Alan Modra  <amodra@bigpond.net.au>
 
        * elf32-ppc.c (ppc_elf_check_relocs): Always set up sections
index 66ec2faa3910dd988da5e31530e31a57cf99a8c2..1c22beb99057214e549862557af83ac7c3f249a6 100644 (file)
@@ -3149,10 +3149,16 @@ fix_syms (struct bfd_link_hash_entry *h, void *data)
          else if (op == NULL)
            op = op1;
          else if (((op1->flags ^ op->flags)
-                   & (SEC_ALLOC | SEC_THREAD_LOCAL)) != 0)
+                   & (SEC_ALLOC | SEC_THREAD_LOCAL | SEC_LOAD)) != 0)
            {
              if (((op->flags ^ s->flags)
-                  & (SEC_ALLOC | SEC_THREAD_LOCAL)) != 0)
+                  & (SEC_ALLOC | SEC_THREAD_LOCAL)) != 0
+                 /* We prefer to choose a loaded section.  Section S
+                    doesn't have SEC_LOAD set (it being excluded, that
+                    part of the flag processing didn't happen) so we
+                    can't compare that flag to those of OP and OP1.  */
+                 || ((op1->flags & SEC_LOAD) != 0
+                     && (op->flags & SEC_LOAD) == 0))
                op = op1;
            }
          else if (((op1->flags ^ op->flags) & SEC_READONLY) != 0)