* elf64-x86-64.c (elf_x86_64_copy_indirect_symbol): Don't copy

ELF_LINK_NON_GOT_REF for weakdefs when symbol already adjusted.
	(ELIMINATE_COPY_RELOCS): Define as one.  Use throughout.
	(elf_x86_64_adjust_dynamic_symbol): For weak symbols, copy
	ELF_LINK_NON_GOT_REF from weakdef.
This commit is contained in:
Andreas Jaeger
2003-05-02 08:19:12 +00:00
parent fcd06cfe45
commit d40d037cac
2 changed files with 54 additions and 19 deletions

View File

@ -1,3 +1,11 @@
2003-05-02 Andreas Jaeger <aj@suse.de>
* elf64-x86-64.c (elf_x86_64_copy_indirect_symbol): Don't copy
ELF_LINK_NON_GOT_REF for weakdefs when symbol already adjusted.
(ELIMINATE_COPY_RELOCS): Define as one. Use throughout.
(elf_x86_64_adjust_dynamic_symbol): For weak symbols, copy
ELF_LINK_NON_GOT_REF from weakdef.
2003-05-02 Charles Lepple <clepple@ghz.cc> 2003-05-02 Charles Lepple <clepple@ghz.cc>
Nick Clifton <nickc@redhat.com> Nick Clifton <nickc@redhat.com>

View File

@ -324,6 +324,12 @@ elf64_x86_64_grok_psinfo (abfd, note)
#define ELF_DYNAMIC_INTERPRETER "/lib/ld64.so.1" #define ELF_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
copying dynamic variables from a shared lib into an app's dynbss
section, and instead use a dynamic relocation to point into the
shared lib. */
#define ELIMINATE_COPY_RELOCS 1
/* The size in bytes of an entry in the global offset table. */ /* The size in bytes of an entry in the global offset table. */
#define GOT_ENTRY_SIZE 8 #define GOT_ENTRY_SIZE 8
@ -616,6 +622,17 @@ elf64_x86_64_copy_indirect_symbol (bed, dir, ind)
eind->tls_type = GOT_UNKNOWN; eind->tls_type = GOT_UNKNOWN;
} }
if (ELIMINATE_COPY_RELOCS
&& ind->root.type != bfd_link_hash_indirect
&& (dir->elf_link_hash_flags & ELF_LINK_HASH_DYNAMIC_ADJUSTED) != 0)
/* If called to transfer flags for a weakdef during processing
of elf_adjust_dynamic_symbol, don't copy ELF_LINK_NON_GOT_REF.
We clear it ourselves for ELIMINATE_COPY_RELOCS. */
dir->elf_link_hash_flags |=
(ind->elf_link_hash_flags & (ELF_LINK_HASH_REF_DYNAMIC
| ELF_LINK_HASH_REF_REGULAR
| ELF_LINK_HASH_REF_REGULAR_NONWEAK));
else
_bfd_elf_link_hash_copy_indirect (bed, dir, ind); _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
} }
@ -914,7 +931,8 @@ elf64_x86_64_check_relocs (abfd, info, sec, relocs)
|| h->root.type == bfd_link_hash_defweak || h->root.type == bfd_link_hash_defweak
|| (h->elf_link_hash_flags || (h->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR) == 0)))) & ELF_LINK_HASH_DEF_REGULAR) == 0))))
|| (!info->shared || (ELIMINATE_COPY_RELOCS
&& !info->shared
&& (sec->flags & SEC_ALLOC) != 0 && (sec->flags & SEC_ALLOC) != 0
&& h != NULL && h != NULL
&& (h->root.type == bfd_link_hash_defweak && (h->root.type == bfd_link_hash_defweak
@ -1189,8 +1207,6 @@ elf64_x86_64_adjust_dynamic_symbol (info, h)
struct elf_link_hash_entry *h; struct elf_link_hash_entry *h;
{ {
struct elf64_x86_64_link_hash_table *htab; struct elf64_x86_64_link_hash_table *htab;
struct elf64_x86_64_link_hash_entry * eh;
struct elf64_x86_64_dyn_relocs *p;
asection *s; asection *s;
unsigned int power_of_two; unsigned int power_of_two;
@ -1235,6 +1251,10 @@ elf64_x86_64_adjust_dynamic_symbol (info, h)
|| h->weakdef->root.type == bfd_link_hash_defweak); || h->weakdef->root.type == bfd_link_hash_defweak);
h->root.u.def.section = h->weakdef->root.u.def.section; h->root.u.def.section = h->weakdef->root.u.def.section;
h->root.u.def.value = h->weakdef->root.u.def.value; h->root.u.def.value = h->weakdef->root.u.def.value;
if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
h->elf_link_hash_flags
= ((h->elf_link_hash_flags & ~ELF_LINK_NON_GOT_REF)
| (h->weakdef->elf_link_hash_flags & ELF_LINK_NON_GOT_REF));
return TRUE; return TRUE;
} }
@ -1260,6 +1280,11 @@ elf64_x86_64_adjust_dynamic_symbol (info, h)
return TRUE; return TRUE;
} }
if (ELIMINATE_COPY_RELOCS)
{
struct elf64_x86_64_link_hash_entry * eh;
struct elf64_x86_64_dyn_relocs *p;
eh = (struct elf64_x86_64_link_hash_entry *) h; eh = (struct elf64_x86_64_link_hash_entry *) h;
for (p = eh->dyn_relocs; p != NULL; p = p->next) for (p = eh->dyn_relocs; p != NULL; p = p->next)
{ {
@ -1275,6 +1300,7 @@ elf64_x86_64_adjust_dynamic_symbol (info, h)
h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF; h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
return TRUE; return TRUE;
} }
}
/* We must allocate the symbol in our .dynbss section, which will /* We must allocate the symbol in our .dynbss section, which will
become part of the .bss section of the executable. There will be become part of the .bss section of the executable. There will be
@ -1487,7 +1513,7 @@ allocate_dynrelocs (h, inf)
} }
} }
} }
else else if (ELIMINATE_COPY_RELOCS)
{ {
/* For the non-shared case, discard space for relocs against /* For the non-shared case, discard space for relocs against
symbols which turn out to need copy relocs or are not symbols which turn out to need copy relocs or are not
@ -2077,7 +2103,8 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
&& (! info->symbolic && (! info->symbolic
|| (h->elf_link_hash_flags || (h->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR) == 0)))) & ELF_LINK_HASH_DEF_REGULAR) == 0))))
|| (!info->shared || (ELIMINATE_COPY_RELOCS
&& !info->shared
&& h != NULL && h != NULL
&& h->dynindx != -1 && h->dynindx != -1
&& (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0