]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
* elfcode.h (NAME(bfd_elf,record_link_assignment)): Add provide
authorIan Lance Taylor <ian@airs.com>
Tue, 4 Jul 1995 17:43:05 +0000 (17:43 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 4 Jul 1995 17:43:05 +0000 (17:43 +0000)
argument.
* bfd-in.h (bfd_elf32_record_link_assignment): Update prototype.
(bfd_elf64_record_link_assignment): Likewise.
* bfd-in2.h: Rebuild.
PR 7164.

bfd/ChangeLog
bfd/bfd-in.h
bfd/bfd-in2.h
bfd/elfcode.h

index 88de922c3350931fc2817e62d2d7fd1ff5c28487..e824f8bbf05425d40babe19c02b8a51ead8c3dcd 100644 (file)
@@ -1,5 +1,11 @@
 Tue Jul  4 12:22:21 1995  Ian Lance Taylor  <ian@cygnus.com>
 
+       * elfcode.h (NAME(bfd_elf,record_link_assignment)): Add provide
+       argument.
+       * bfd-in.h (bfd_elf32_record_link_assignment): Update prototype.
+       (bfd_elf64_record_link_assignment): Likewise.
+       * bfd-in2.h: Rebuild.
+
        * libelf.h (struct elf_link_hash_table): Add needed field.  Remove
        saw_needed field.
        * elfcode.h (elf_link_add_object_symbols): If elf_dt_needed_name
index 151e824beeafe6fb1b61faf040592f2a23f2665b..1582482993f5256ccf63e0c461bea21e780aa09c 100644 (file)
@@ -592,9 +592,9 @@ extern boolean bfd_mips_ecoff_create_embedded_relocs
 /* Externally visible ELF routines.  */
 
 extern boolean bfd_elf32_record_link_assignment
-  PARAMS ((bfd *, struct bfd_link_info *, const char *));
+  PARAMS ((bfd *, struct bfd_link_info *, const char *, boolean));
 extern boolean bfd_elf64_record_link_assignment
-  PARAMS ((bfd *, struct bfd_link_info *, const char *));
+  PARAMS ((bfd *, struct bfd_link_info *, const char *, boolean));
 struct bfd_elf_link_needed_list
 {
   struct bfd_elf_link_needed_list *next;
index 1b0ba63f689913bf386ecd62249695ac17149765..91d5cc9738feff83daa4db41f7bb67d089fd8c32 100644 (file)
@@ -592,9 +592,9 @@ extern boolean bfd_mips_ecoff_create_embedded_relocs
 /* Externally visible ELF routines.  */
 
 extern boolean bfd_elf32_record_link_assignment
-  PARAMS ((bfd *, struct bfd_link_info *, const char *));
+  PARAMS ((bfd *, struct bfd_link_info *, const char *, boolean));
 extern boolean bfd_elf64_record_link_assignment
-  PARAMS ((bfd *, struct bfd_link_info *, const char *));
+  PARAMS ((bfd *, struct bfd_link_info *, const char *, boolean));
 struct bfd_elf_link_needed_list
 {
   struct bfd_elf_link_needed_list *next;
index e0f1b9c1ec2d7161e71ea3f6ace6654275925d4e..3f30c6bab29ebcf9cb17006287c0e9502a49dd99 100644 (file)
@@ -5107,10 +5107,11 @@ elf_link_read_relocs (abfd, o, external_relocs, internal_relocs, keep_memory)
 
 /*ARGSUSED*/
 boolean
-NAME(bfd_elf,record_link_assignment) (output_bfd, info, name)
+NAME(bfd_elf,record_link_assignment) (output_bfd, info, name, provide)
      bfd *output_bfd;
      struct bfd_link_info *info;
      const char *name;
+     boolean provide;
 {
   struct elf_link_hash_entry *h;
 
@@ -5121,6 +5122,15 @@ NAME(bfd_elf,record_link_assignment) (output_bfd, info, name)
   if (h == NULL)
     return false;
 
+  /* If this symbol is being provided by the linker script, and it is
+     currently defined by a dynamic object, but not by a regular
+     object, then mark it as undefined so that the generic linker will
+     force the correct value.  */
+  if (provide
+      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
+      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
+    h->root.type = bfd_link_hash_undefined;
+
   h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
   h->type = STT_OBJECT;