diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 36 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 4 | ||||
-rw-r--r-- | bfd/elf-m10300.c | 2 | ||||
-rw-r--r-- | bfd/elf32-arm.c | 2 | ||||
-rw-r--r-- | bfd/elf32-cr16.c | 2 | ||||
-rw-r--r-- | bfd/elf32-cris.c | 2 | ||||
-rw-r--r-- | bfd/elf32-hppa.c | 2 | ||||
-rw-r--r-- | bfd/elf32-i370.c | 2 | ||||
-rw-r--r-- | bfd/elf32-i386.c | 2 | ||||
-rw-r--r-- | bfd/elf32-lm32.c | 2 | ||||
-rw-r--r-- | bfd/elf32-m32r.c | 2 | ||||
-rw-r--r-- | bfd/elf32-m68k.c | 2 | ||||
-rw-r--r-- | bfd/elf32-metag.c | 2 | ||||
-rw-r--r-- | bfd/elf32-or1k.c | 2 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 2 | ||||
-rw-r--r-- | bfd/elf32-s390.c | 2 | ||||
-rw-r--r-- | bfd/elf32-sh.c | 2 | ||||
-rw-r--r-- | bfd/elf32-tic6x.c | 2 | ||||
-rw-r--r-- | bfd/elf32-tilepro.c | 2 | ||||
-rw-r--r-- | bfd/elf32-vax.c | 2 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 2 | ||||
-rw-r--r-- | bfd/elf64-s390.c | 2 | ||||
-rw-r--r-- | bfd/elf64-sh64.c | 2 | ||||
-rw-r--r-- | bfd/elf64-x86-64.c | 2 | ||||
-rw-r--r-- | bfd/elflink.c | 13 | ||||
-rw-r--r-- | bfd/elfnn-aarch64.c | 2 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 2 | ||||
-rw-r--r-- | bfd/elfxx-sparc.c | 2 | ||||
-rw-r--r-- | bfd/elfxx-tilegx.c | 2 |
29 files changed, 77 insertions, 28 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9443507..0db2820 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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 diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 6ce70bc..5e53cba 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -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); diff --git a/bfd/elf-m10300.c b/bfd/elf-m10300.c index f29025d..1dbb2f9 100644 --- a/bfd/elf-m10300.c +++ b/bfd/elf-m10300.c @@ -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. */ diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 1ff562c..5b2f66f 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -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 diff --git a/bfd/elf32-cr16.c b/bfd/elf32-cr16.c index f16f1c6..6dadcc1 100644 --- a/bfd/elf32-cr16.c +++ b/bfd/elf32-cr16.c @@ -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. */ diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c index 9b2b956..c516b2f 100644 --- a/bfd/elf32-cris.c +++ b/bfd/elf32-cris.c @@ -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. */ diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index 0588ebb..abc7124 100644 --- a/bfd/elf32-hppa.c +++ b/bfd/elf32-hppa.c @@ -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. diff --git a/bfd/elf32-i370.c b/bfd/elf32-i370.c index c9ed6e0..e28c257 100644 --- a/bfd/elf32-i370.c +++ b/bfd/elf32-i370.c @@ -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 diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 2bd7f43..e0eef28 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -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 diff --git a/bfd/elf32-lm32.c b/bfd/elf32-lm32.c index e694055..5f2b6b8 100644 --- a/bfd/elf32-lm32.c +++ b/bfd/elf32-lm32.c @@ -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 diff --git a/bfd/elf32-m32r.c b/bfd/elf32-m32r.c index 8dba9f0..e6b45ab 100644 --- a/bfd/elf32-m32r.c +++ b/bfd/elf32-m32r.c @@ -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 diff --git a/bfd/elf32-m68k.c b/bfd/elf32-m68k.c index 0058da4..9a42288 100644 --- a/bfd/elf32-m68k.c +++ b/bfd/elf32-m68k.c @@ -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. */ diff --git a/bfd/elf32-metag.c b/bfd/elf32-metag.c index 47ca5de..a68b51c 100644 --- a/bfd/elf32-metag.c +++ b/bfd/elf32-metag.c @@ -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 diff --git a/bfd/elf32-or1k.c b/bfd/elf32-or1k.c index 5cf29e1..e5b7bad 100644 --- a/bfd/elf32-or1k.c +++ b/bfd/elf32-or1k.c @@ -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 diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index b4d2075..8429e8f 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -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 diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index ebcb028..07e594f 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -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 diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c index 44a3aa7..a737044 100644 --- a/bfd/elf32-sh.c +++ b/bfd/elf32-sh.c @@ -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 diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c index 8381cfa..9f17979 100644 --- a/bfd/elf32-tic6x.c +++ b/bfd/elf32-tic6x.c @@ -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 diff --git a/bfd/elf32-tilepro.c b/bfd/elf32-tilepro.c index b9a31d5..0959924 100644 --- a/bfd/elf32-tilepro.c +++ b/bfd/elf32-tilepro.c @@ -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 diff --git a/bfd/elf32-vax.c b/bfd/elf32-vax.c index 1f41867..05e65e9 100644 --- a/bfd/elf32-vax.c +++ b/bfd/elf32-vax.c @@ -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 diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index cb58df1..26ae9ed 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -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 diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index b2f1aa5..9a874f2 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -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 diff --git a/bfd/elf64-sh64.c b/bfd/elf64-sh64.c index 311d7c3..7497929 100644 --- a/bfd/elf64-sh64.c +++ b/bfd/elf64-sh64.c @@ -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 diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 64b4634..40a2a87 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -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 diff --git a/bfd/elflink.c b/bfd/elflink.c index b023ec5..a01daf2 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -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; } diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 0879db9..4f0e0c6 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -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); } diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 8112849..db403b3 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -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, diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c index d5f92d4..a56493f 100644 --- a/bfd/elfxx-sparc.c +++ b/bfd/elfxx-sparc.c @@ -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 diff --git a/bfd/elfxx-tilegx.c b/bfd/elfxx-tilegx.c index e206bc7..90f4395 100644 --- a/bfd/elfxx-tilegx.c +++ b/bfd/elfxx-tilegx.c @@ -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 |