aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1999-09-04 16:26:08 +0000
committerIan Lance Taylor <ian@airs.com>1999-09-04 16:26:08 +0000
commit7843f00e2d20477ff4fe77054c7f2c5a90a20bca (patch)
treea3b1a31ff9e27a3f9e2745611d5bfd031647b44c /bfd
parent4fe53c9827dd950f6fac045494bb4821a40b2141 (diff)
downloadgdb-7843f00e2d20477ff4fe77054c7f2c5a90a20bca.zip
gdb-7843f00e2d20477ff4fe77054c7f2c5a90a20bca.tar.gz
gdb-7843f00e2d20477ff4fe77054c7f2c5a90a20bca.tar.bz2
* elf-bfd.h (ELF_LINK_NON_GOT_REF): Define.
* elflink.h (elf_adjust_dynamic_symbol): Copy REF_REGULAR_NONWEAK and NON_GOT_REF from weak defined symbol to real symbol. * elf32-i386.c (elf_i386_check_relocs): Set NON_GOT_REF. (elf_i386_adjust_dynamic_symbol): If NON_GOT_REF is not set, don't create a COPY reloc. * elf32-sparc.c (elf32_sparc_check_relocs): Set NON_GOT_REF. (elf32_sparc_adjust_dynamic_symbol): If NON_GOT_REF is not set, don't create a COPY reloc.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/elf-bfd.h3
-rw-r--r--bfd/elf32-i386.c8
-rw-r--r--bfd/elf32-sparc.c14
-rw-r--r--bfd/elflink.h9
5 files changed, 42 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 412262f..0e3c2ca 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,15 @@
+1999-09-04 Ian Lance Taylor <ian@zembu.com>
+
+ * elf-bfd.h (ELF_LINK_NON_GOT_REF): Define.
+ * elflink.h (elf_adjust_dynamic_symbol): Copy REF_REGULAR_NONWEAK
+ and NON_GOT_REF from weak defined symbol to real symbol.
+ * elf32-i386.c (elf_i386_check_relocs): Set NON_GOT_REF.
+ (elf_i386_adjust_dynamic_symbol): If NON_GOT_REF is not set, don't
+ create a COPY reloc.
+ * elf32-sparc.c (elf32_sparc_check_relocs): Set NON_GOT_REF.
+ (elf32_sparc_adjust_dynamic_symbol): If NON_GOT_REF is not set,
+ don't create a COPY reloc.
+
1999-09-03 Ian Lance Taylor <ian@zembu.com>
* elflink.h (elf_bfd_final_link): When counting relocations, don't
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 3fa2513..1868cb6 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -189,6 +189,9 @@ struct elf_link_hash_entry
#define ELF_LINK_FORCED_LOCAL 02000
/* Symbol was marked during garbage collection. */
#define ELF_LINK_HASH_MARK 04000
+ /* Symbol is referenced by a non-GOT/non-PLT relocation. This is
+ not currently set by all the backends. */
+#define ELF_LINK_NON_GOT_REF 010000
};
/* Records local symbols to be emitted in the dynamic symbol table. */
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 0790af5..33514ac 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -591,6 +591,9 @@ elf_i386_check_relocs (abfd, info, sec, relocs)
case R_386_32:
case R_386_PC32:
+ if (h != NULL)
+ h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
+
/* If we are creating a shared library, and this is a reloc
against a global symbol, or a non PC relative reloc
against a local symbol, then we need to copy the reloc
@@ -889,6 +892,11 @@ elf_i386_adjust_dynamic_symbol (info, h)
if (info->shared)
return true;
+ /* If there are no references to this symbol that do not use the
+ GOT, we don't need to generate a copy reloc. */
+ if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
+ return true;
+
/* We must allocate the symbol in our .dynbss section, which will
become part of the .bss section of the executable. There will be
an entry for this symbol in the .dynsym section. The dynamic
diff --git a/bfd/elf32-sparc.c b/bfd/elf32-sparc.c
index bb11c07..979d25b 100644
--- a/bfd/elf32-sparc.c
+++ b/bfd/elf32-sparc.c
@@ -510,6 +510,9 @@ elf32_sparc_check_relocs (abfd, info, sec, relocs)
case R_SPARC_PC10:
case R_SPARC_PC22:
+ if (h != NULL)
+ h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
+
if (h != NULL
&& strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
break;
@@ -521,6 +524,9 @@ elf32_sparc_check_relocs (abfd, info, sec, relocs)
case R_SPARC_WDISP22:
case R_SPARC_WDISP19:
case R_SPARC_WDISP16:
+ if (h != NULL)
+ h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
+
/* If we are linking with -Bsymbolic, we do not need to copy
a PC relative reloc against a global symbol which is
defined in an object we are including in the link (i.e.,
@@ -543,6 +549,9 @@ elf32_sparc_check_relocs (abfd, info, sec, relocs)
case R_SPARC_13:
case R_SPARC_LO10:
case R_SPARC_UA32:
+ if (h != NULL)
+ h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
+
if (info->shared)
{
/* When creating a shared object, we must copy these
@@ -834,6 +843,11 @@ elf32_sparc_adjust_dynamic_symbol (info, h)
if (info->shared)
return true;
+ /* If there are no references to this symbol that do not use the
+ GOT, we don't need to generate a copy reloc. */
+ if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
+ return true;
+
/* We must allocate the symbol in our .dynbss section, which will
become part of the .bss section of the executable. There will be
an entry for this symbol in the .dynsym section. The dynamic
diff --git a/bfd/elflink.h b/bfd/elflink.h
index e60beae..e9ba45a 100644
--- a/bfd/elflink.h
+++ b/bfd/elflink.h
@@ -3349,10 +3349,11 @@ elf_adjust_dynamic_symbol (h, data)
{
/* There is an implicit reference by a regular object file
via the weak symbol. */
- weakdef->elf_link_hash_flags |= ELF_LINK_HASH_REF_REGULAR;
- if (h->weakdef->elf_link_hash_flags
- & ELF_LINK_HASH_REF_REGULAR_NONWEAK)
- weakdef->elf_link_hash_flags |= ELF_LINK_HASH_REF_REGULAR_NONWEAK;
+ weakdef->elf_link_hash_flags |=
+ (ELF_LINK_HASH_REF_REGULAR
+ | (h->elf_link_hash_flags
+ & (ELF_LINK_HASH_REF_REGULAR_NONWEAK
+ | ELF_LINK_NON_GOT_REF)));
if (! elf_adjust_dynamic_symbol (weakdef, (PTR) eif))
return false;
}