Copy relocations against protected symbols
Copy relocs are used in a scheme to avoid dynamic text relocations in non-PIC executables that refer to variables defined in shared libraries. The idea is to have the linker define any such variable in the executable, with a copy reloc copying the initial value, then have both the executable and shared library refer to the executable copy. If the shared library defines the variable as protected then we have two copies of the variable being used. PR 15228 * elflink.c (_bfd_elf_adjust_dynamic_copy): Add "info" param. Error on copy relocs against protected symbols. (elf_merge_st_other): Set h->protected_def. * elf-bfd.h (struct elf_link_hash_entry): Add "protected_def". (_bfd_elf_adjust_dynamic_copy): Update prototype. * elf-m10300.c (_bfd_mn10300_elf_adjust_dynamic_symbol): Update _bfd_elf_adjust_dynamic_copy call. * elf32-arm.c (elf32_arm_adjust_dynamic_symbol): Likewise. * elf32-cr16.c (_bfd_cr16_elf_adjust_dynamic_symbol): Likewise. * elf32-cris.c (elf_cris_adjust_dynamic_symbol): Likewise. * elf32-hppa.c (elf32_hppa_adjust_dynamic_symbol): Likewise. * elf32-i370.c (i370_elf_adjust_dynamic_symbol): Likewise. * elf32-i386.c (elf_i386_adjust_dynamic_symbol): Likewise. * elf32-lm32.c (lm32_elf_adjust_dynamic_symbol): Likewise. * elf32-m32r.c (m32r_elf_adjust_dynamic_symbol): Likewise. * elf32-m68k.c (elf_m68k_adjust_dynamic_symbol): Likewise. * elf32-metag.c (elf_metag_adjust_dynamic_symbol): Likewise. * elf32-or1k.c (or1k_elf_adjust_dynamic_symbol): Likewise. * elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Likewise. * elf32-s390.c (elf_s390_adjust_dynamic_symbol): Likewise. * elf32-sh.c (sh_elf_adjust_dynamic_symbol): Likewise. * elf32-tic6x.c (elf32_tic6x_adjust_dynamic_symbol): Likewise. * elf32-tilepro.c (tilepro_elf_adjust_dynamic_symbol): Likewise. * elf32-vax.c (elf_vax_adjust_dynamic_symbol): Likewise. * elf64-ppc.c (ppc64_elf_adjust_dynamic_symbol): Likewise. * elf64-s390.c (elf_s390_adjust_dynamic_symbol): Likewise. * elf64-sh64.c (sh64_elf64_adjust_dynamic_symbol): Likewise. * elf64-x86-64.c (elf_x86_64_adjust_dynamic_symbol): Likewise. * elfnn-aarch64.c (elfNN_aarch64_adjust_dynamic_symbol): Likewise. * elfxx-mips.c (_bfd_mips_elf_adjust_dynamic_symbol): Likewise. * elfxx-sparc.c (_bfd_sparc_elf_adjust_dynamic_symbol): Likewise. * elfxx-tilegx.c (tilegx_elf_adjust_dynamic_symbol): Likewise.
This commit is contained in:
parent
21daaaaffc
commit
6cabe1ea46
@ -1,3 +1,39 @@
|
||||
2014-12-12 Alan Modra <amodra@gmail.com>
|
||||
|
||||
PR 15228
|
||||
* elflink.c (_bfd_elf_adjust_dynamic_copy): Add "info" param.
|
||||
Error on copy relocs against protected symbols.
|
||||
(elf_merge_st_other): Set h->protected_def.
|
||||
* elf-bfd.h (struct elf_link_hash_entry): Add "protected_def".
|
||||
(_bfd_elf_adjust_dynamic_copy): Update prototype.
|
||||
* elf-m10300.c (_bfd_mn10300_elf_adjust_dynamic_symbol): Update
|
||||
_bfd_elf_adjust_dynamic_copy call.
|
||||
* elf32-arm.c (elf32_arm_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-cr16.c (_bfd_cr16_elf_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-cris.c (elf_cris_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-hppa.c (elf32_hppa_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-i370.c (i370_elf_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-i386.c (elf_i386_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-lm32.c (lm32_elf_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-m32r.c (m32r_elf_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-m68k.c (elf_m68k_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-metag.c (elf_metag_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-or1k.c (or1k_elf_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-s390.c (elf_s390_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-sh.c (sh_elf_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-tic6x.c (elf32_tic6x_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-tilepro.c (tilepro_elf_adjust_dynamic_symbol): Likewise.
|
||||
* elf32-vax.c (elf_vax_adjust_dynamic_symbol): Likewise.
|
||||
* elf64-ppc.c (ppc64_elf_adjust_dynamic_symbol): Likewise.
|
||||
* elf64-s390.c (elf_s390_adjust_dynamic_symbol): Likewise.
|
||||
* elf64-sh64.c (sh64_elf64_adjust_dynamic_symbol): Likewise.
|
||||
* elf64-x86-64.c (elf_x86_64_adjust_dynamic_symbol): Likewise.
|
||||
* elfnn-aarch64.c (elfNN_aarch64_adjust_dynamic_symbol): Likewise.
|
||||
* elfxx-mips.c (_bfd_mips_elf_adjust_dynamic_symbol): Likewise.
|
||||
* elfxx-sparc.c (_bfd_sparc_elf_adjust_dynamic_symbol): Likewise.
|
||||
* elfxx-tilegx.c (tilegx_elf_adjust_dynamic_symbol): Likewise.
|
||||
|
||||
2014-12-11 Keith Seitz <keiths@redhat.com>
|
||||
|
||||
* elf.c (elf_parse_notes): Define convenience macro
|
||||
|
@ -196,6 +196,8 @@ struct elf_link_hash_entry
|
||||
unsigned int pointer_equality_needed : 1;
|
||||
/* Symbol is a unique global symbol. */
|
||||
unsigned int unique_global : 1;
|
||||
/* Symbol is defined with non-default visibility. */
|
||||
unsigned int protected_def : 1;
|
||||
|
||||
/* String table index in .dynstr if this is a dynamic symbol. */
|
||||
unsigned long dynstr_index;
|
||||
@ -2026,7 +2028,7 @@ extern bfd_boolean _bfd_elf_link_output_relocs
|
||||
struct elf_link_hash_entry **);
|
||||
|
||||
extern bfd_boolean _bfd_elf_adjust_dynamic_copy
|
||||
(struct elf_link_hash_entry *, asection *);
|
||||
(struct bfd_link_info *, struct elf_link_hash_entry *, asection *);
|
||||
|
||||
extern bfd_boolean _bfd_elf_dynamic_symbol_p
|
||||
(struct elf_link_hash_entry *, struct bfd_link_info *, bfd_boolean);
|
||||
|
@ -5024,7 +5024,7 @@ _bfd_mn10300_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Set the sizes of the dynamic sections. */
|
||||
|
@ -13339,7 +13339,7 @@ elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Allocate space in .plt, .got and associated reloc sections for
|
||||
|
@ -2437,7 +2437,7 @@ _bfd_cr16_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Set the sizes of the dynamic sections. */
|
||||
|
@ -3054,7 +3054,7 @@ elf_cris_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Adjust our "subclass" elements for an indirect symbol. */
|
||||
|
@ -1915,7 +1915,7 @@ elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
|
||||
sec = htab->sdynbss;
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (eh, sec);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, eh, sec);
|
||||
}
|
||||
|
||||
/* Allocate space in the .plt for entries that won't have relocations.
|
||||
|
@ -534,7 +534,7 @@ i370_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Increment the index of a dynamic symbol by a given amount. Called
|
||||
|
@ -2229,7 +2229,7 @@ elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
|
||||
s = htab->sdynbss;
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Allocate space in .plt, .got and associated reloc sections for
|
||||
|
@ -1892,7 +1892,7 @@ lm32_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Allocate space in .plt, .got and associated reloc sections for
|
||||
|
@ -1919,7 +1919,7 @@ m32r_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Allocate space in .plt, .got and associated reloc sections for
|
||||
|
@ -3237,7 +3237,7 @@ elf_m68k_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Set the sizes of the dynamic sections. */
|
||||
|
@ -2587,7 +2587,7 @@ elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
|
||||
s = htab->sdynbss;
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (eh, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, eh, s);
|
||||
}
|
||||
|
||||
/* Allocate space in .plt, .got and associated reloc sections for
|
||||
|
@ -2187,7 +2187,7 @@ or1k_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Allocate space in .plt, .got and associated reloc sections for
|
||||
|
@ -5628,7 +5628,7 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Generate a symbol to mark plt call stubs. For non-PIC code the sym is
|
||||
|
@ -1762,7 +1762,7 @@ elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
|
||||
s = htab->sdynbss;
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Allocate space in .plt, .got and associated reloc sections for
|
||||
|
@ -2919,7 +2919,7 @@ sh_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Allocate space in .plt, .got and associated reloc sections for
|
||||
|
@ -2168,7 +2168,7 @@ elf32_tic6x_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
|
||||
s = htab->sdynbss;
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
static bfd_boolean
|
||||
|
@ -2189,7 +2189,7 @@ tilepro_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, htab->sdynbss);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, htab->sdynbss);
|
||||
}
|
||||
|
||||
/* Allocate space in .plt, .got and associated reloc sections for
|
||||
|
@ -1043,7 +1043,7 @@ elf_vax_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* This function is called via elf_link_hash_traverse. It resets GOT
|
||||
|
@ -7121,7 +7121,7 @@ ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
|
||||
s = htab->dynbss;
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* If given a function descriptor symbol, hide both the function code
|
||||
|
@ -1707,7 +1707,7 @@ elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
|
||||
s = htab->sdynbss;
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Allocate space in .plt, .got and associated reloc sections for
|
||||
|
@ -3381,7 +3381,7 @@ sh64_elf64_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* This function is called via sh_elf_link_hash_traverse if we are
|
||||
|
@ -2445,7 +2445,7 @@ elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
|
||||
s = htab->sdynbss;
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Allocate space in .plt, .got and associated reloc sections for
|
||||
|
@ -873,6 +873,8 @@ elf_merge_st_other (bfd *abfd, struct elf_link_hash_entry *h,
|
||||
if (symvis - 1 < hvis - 1)
|
||||
h->other = symvis | (h->other & ~ELF_ST_VISIBILITY (-1));
|
||||
}
|
||||
else if (definition && ELF_ST_VISIBILITY (isym->st_other) != STV_DEFAULT)
|
||||
h->protected_def = 1;
|
||||
}
|
||||
|
||||
/* This function is called when we want to merge a new symbol with an
|
||||
@ -2637,7 +2639,8 @@ _bfd_elf_adjust_dynamic_symbol (struct elf_link_hash_entry *h, void *data)
|
||||
DYNBSS. */
|
||||
|
||||
bfd_boolean
|
||||
_bfd_elf_adjust_dynamic_copy (struct elf_link_hash_entry *h,
|
||||
_bfd_elf_adjust_dynamic_copy (struct bfd_link_info *info,
|
||||
struct elf_link_hash_entry *h,
|
||||
asection *dynbss)
|
||||
{
|
||||
unsigned int power_of_two;
|
||||
@ -2676,6 +2679,14 @@ _bfd_elf_adjust_dynamic_copy (struct elf_link_hash_entry *h,
|
||||
/* Increment the size of DYNBSS to make room for the symbol. */
|
||||
dynbss->size += h->size;
|
||||
|
||||
if (h->protected_def)
|
||||
{
|
||||
info->callbacks->einfo
|
||||
(_("%P: copy reloc against protected `%T' is invalid\n"),
|
||||
h->root.root.string);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -5542,7 +5542,7 @@ elfNN_aarch64_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
|
||||
s = htab->sdynbss;
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
|
||||
}
|
||||
|
||||
|
@ -9215,7 +9215,7 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
dynamic will now refer to the local copy instead. */
|
||||
hmips->possibly_dynamic_relocs = 0;
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, htab->sdynbss);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, htab->sdynbss);
|
||||
}
|
||||
|
||||
/* This function is called after all the input files have been read,
|
||||
|
@ -2211,7 +2211,7 @@ _bfd_sparc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
|
||||
s = htab->sdynbss;
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, s);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
||||
}
|
||||
|
||||
/* Allocate space in .plt, .got and associated reloc sections for
|
||||
|
@ -2456,7 +2456,7 @@ tilegx_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
h->needs_copy = 1;
|
||||
}
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, htab->sdynbss);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, htab->sdynbss);
|
||||
}
|
||||
|
||||
/* Allocate space in .plt, .got and associated reloc sections for
|
||||
|
Loading…
x
Reference in New Issue
Block a user