diff options
author | Claudiu Zissulescu <claziss@synopsys.com> | 2016-04-05 16:34:12 +0200 |
---|---|---|
committer | Claudiu Zissulescu <claziss@synopsys.com> | 2016-04-05 16:47:58 +0200 |
commit | 94e5c97160abbcf2274f8d58dc2900bc85c1c384 (patch) | |
tree | 06b7c5f518759bb7aac249098aee961121032ce7 /bfd/elf32-arc.c | |
parent | 6ec1f28285f0a24587f7b5935e6d3fd4011fbb01 (diff) | |
download | gdb-94e5c97160abbcf2274f8d58dc2900bc85c1c384.zip gdb-94e5c97160abbcf2274f8d58dc2900bc85c1c384.tar.gz gdb-94e5c97160abbcf2274f8d58dc2900bc85c1c384.tar.bz2 |
[ARC] Dynamic relocs verification for dynindx == -1.
bfd/
2016-04-05 Cupertino Miranda <cmiranda@synopsys.com>
* elf32-arc.c (name_for_global_symbol): Added assert to check for
symbol index.
(elf_arc_relocate_section): Added and changed asserts, validating
the synamic symbol index.
(elf_arc_finish_dynamic_symbol): Do not fill the dynamic
relocation if symbol has dynindx set to -1.
Diffstat (limited to 'bfd/elf32-arc.c')
-rw-r--r-- | bfd/elf32-arc.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c index 488b86f..a7c0330 100644 --- a/bfd/elf32-arc.c +++ b/bfd/elf32-arc.c @@ -64,6 +64,7 @@ name_for_global_symbol (struct elf_link_hash_entry *h) _rel.r_addend = ADDEND; \ _rel.r_offset = (_htab->s##SECTION)->output_section->vma \ + (_htab->s##SECTION)->output_offset + OFFSET; \ + BFD_ASSERT ((long) SYM_IDX != -1); \ _rel.r_info = ELF32_R_INFO (SYM_IDX, TYPE); \ bfd_elf32_swap_reloca_out (BFD, &_rel, _loc); \ } @@ -1495,11 +1496,13 @@ elf_arc_relocate_section (bfd * output_bfd, else if (r_type == R_ARC_PC32 || r_type == R_ARC_32_PCREL) { - BFD_ASSERT (h != NULL && h->dynindx != -1); + BFD_ASSERT (h != NULL); if ((input_section->flags & SEC_ALLOC) != 0) relocate = FALSE; else relocate = TRUE; + + BFD_ASSERT (h->dynindx != -1); outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); } else @@ -1535,6 +1538,8 @@ elf_arc_relocate_section (bfd * output_bfd, relocate = FALSE; else relocate = TRUE; + + BFD_ASSERT (h->dynindx != -1); outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARC_32); } } @@ -2001,6 +2006,8 @@ GOT_ENTRY_OFFSET = 0x%x, GOT_ENTRY_VMA = 0x%x, for symbol %s\n", + htab->sgotplt->output_offset + got_offset); rel.r_addend = 0; + + BFD_ASSERT (h->dynindx != -1); rel.r_info = ELF32_R_INFO (h->dynindx, R_ARC_JMP_SLOT); loc = htab->srelplt->contents; @@ -2199,7 +2206,10 @@ elf_arc_finish_dynamic_symbol (bfd * output_bfd, { ADD_RELA (output_bfd, got, got_offset, 0, R_ARC_RELATIVE, 0); } - else + /* Do not fully understand the side effects of this condition. + The relocation space might still being reserved. Perhaps + I should clear its value. */ + else if (h->dynindx != -1) { ADD_RELA (output_bfd, got, got_offset, h->dynindx, R_ARC_GLOB_DAT, 0); @@ -2274,6 +2284,8 @@ GOT_OFFSET = 0x%x, GOT_VMA = 0x%x, INDEX = %d, ADDEND = 0x%x\n", Elf_Internal_Rela rel; rel.r_addend = 0; rel.r_offset = rel_offset; + + BFD_ASSERT (h->dynindx != -1); rel.r_info = ELF32_R_INFO (h->dynindx, R_ARC_COPY); bfd_elf32_swap_reloca_out (output_bfd, &rel, loc); |