aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog9
-rw-r--r--bfd/arc-got.h94
-rw-r--r--ld/ChangeLog5
-rw-r--r--ld/testsuite/ld-arc/got-weak.d12
-rw-r--r--ld/testsuite/ld-arc/got-weak.s7
5 files changed, 90 insertions, 37 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index d878d05..a69b50c 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,12 @@
+2021-09-014 Cupertino Miranda <cmiranda@synopsys.com>
+ Claudiu Zissulescu <claziss@synopsys.com>
+
+ * arc-got.h (arc_static_sym_data): New structure.
+ (get_static_sym_data): New function.
+ (relocate_fix_got_relocs_for_got_info): Move the computation fo
+ symbol value and section to above introduced function, and use
+ this new function.
+
2021-09-07 Luis Machado <luis.machado@linaro.org>
Revert: [AArch64] MTE corefile support
diff --git a/bfd/arc-got.h b/bfd/arc-got.h
index 76fc761..c45d981 100644
--- a/bfd/arc-got.h
+++ b/bfd/arc-got.h
@@ -262,6 +262,48 @@ arc_fill_got_info_for_reloc (enum tls_type_e type,
return true;
}
+struct arc_static_sym_data {
+ bfd_vma sym_value;
+ const char *symbol_name;
+};
+
+static struct arc_static_sym_data
+get_static_sym_data (unsigned long r_symndx,
+ Elf_Internal_Sym *local_syms,
+ asection **local_sections,
+ struct elf_link_hash_entry *h,
+ struct arc_relocation_data *reloc_data)
+{
+ static const char local_name[] = "(local)";
+ struct arc_static_sym_data ret = { 0, NULL };
+
+ if (h != NULL)
+ {
+ BFD_ASSERT (h->root.type != bfd_link_hash_undefweak
+ && h->root.type != bfd_link_hash_undefined);
+ /* TODO: This should not be here. */
+ reloc_data->sym_value = h->root.u.def.value;
+ reloc_data->sym_section = h->root.u.def.section;
+
+ ret.sym_value = h->root.u.def.value
+ + h->root.u.def.section->output_section->vma
+ + h->root.u.def.section->output_offset;
+
+ ret.symbol_name = h->root.root.string;
+ }
+ else
+ {
+ Elf_Internal_Sym *sym = local_syms + r_symndx;
+ asection *sec = local_sections[r_symndx];
+
+ ret.sym_value = sym->st_value
+ + sec->output_section->vma
+ + sec->output_offset;
+
+ ret.symbol_name = local_name;
+ }
+ return ret;
+}
static bfd_vma
relocate_fix_got_relocs_for_got_info (struct got_entry ** list_p,
@@ -290,38 +332,7 @@ relocate_fix_got_relocs_for_got_info (struct got_entry ** list_p,
&& SYMBOL_REFERENCES_LOCAL (info, h))))
{
const char ATTRIBUTE_UNUSED *symbol_name;
- static const char local_name[] = "(local)";
- asection *tls_sec = NULL;
- bfd_vma sym_value = 0;
-
- if (h != NULL)
- {
- /* TODO: This should not be here. */
- reloc_data->sym_value = h->root.u.def.value;
- reloc_data->sym_section = h->root.u.def.section;
-
- sym_value = h->root.u.def.value
- + h->root.u.def.section->output_section->vma
- + h->root.u.def.section->output_offset;
-
- tls_sec = elf_hash_table (info)->tls_sec;
-
- symbol_name = h->root.root.string;
- }
- else
- {
- Elf_Internal_Sym *sym = local_syms + r_symndx;
- asection *sec = local_sections[r_symndx];
-
- sym_value = sym->st_value
- + sec->output_section->vma
- + sec->output_offset;
-
- tls_sec = elf_hash_table (info)->tls_sec;
-
- symbol_name = local_name;
- }
-
+ asection *tls_sec = elf_hash_table (info)->tls_sec;
if (entry && !entry->processed)
{
@@ -335,8 +346,12 @@ relocate_fix_got_relocs_for_got_info (struct got_entry ** list_p,
if (h == NULL || h->forced_local
|| !elf_hash_table (info)->dynamic_sections_created)
{
+ struct arc_static_sym_data tmp =
+ get_static_sym_data (r_symndx, local_syms, local_sections,
+ h, reloc_data);
+
bfd_put_32 (output_bfd,
- sym_value - sec_vma
+ tmp.sym_value - sec_vma
+ (elf_hash_table (info)->dynamic_sections_created
? 0
: (align_power (0,
@@ -355,7 +370,7 @@ relocate_fix_got_relocs_for_got_info (struct got_entry ** list_p,
+ entry->offset
+ (entry->existing_entries == TLS_GOT_MOD_AND_OFF
? 4 : 0)),
- symbol_name);
+ tmp.symbol_name);
}
}
break;
@@ -366,8 +381,12 @@ relocate_fix_got_relocs_for_got_info (struct got_entry ** list_p,
bfd_vma ATTRIBUTE_UNUSED sec_vma
= tls_sec->output_section->vma;
+ struct arc_static_sym_data tmp =
+ get_static_sym_data (r_symndx, local_syms, local_sections,
+ h, reloc_data);
+
bfd_put_32 (output_bfd,
- sym_value - sec_vma
+ tmp.sym_value - sec_vma
+ (elf_hash_table (info)->dynamic_sections_created
? 0
: (align_power (TCB_SIZE,
@@ -386,7 +405,7 @@ relocate_fix_got_relocs_for_got_info (struct got_entry ** list_p,
+ entry->offset
+ (entry->existing_entries == TLS_GOT_MOD_AND_OFF
? 4 : 0)),
- symbol_name);
+ tmp.symbol_name);
}
break;
@@ -415,7 +434,8 @@ relocate_fix_got_relocs_for_got_info (struct got_entry ** list_p,
"@ %#08lx for sym %s in got offset %#lx\n",
(long) (reloc_data->sym_value + sec_vma),
(long) (htab->sgot->output_section->vma
- + htab->sgot->output_offset + entry->offset),
+ + htab->sgot->output_offset
+ + entry->offset),
symbol_name,
(long) entry->offset);
}
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 28deefc..ebcd4cd 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,8 @@
+2021-09-14 Claudiu Zissulescu <claziss@synopsys.com>
+
+ * ld-arc/got-weak.d: New file.
+ * ld-arc/got-weak.s: Likewise.
+
2021-07-26 Roland McGrath <mcgrathr@google.com>
* testsuite/ld-x86-64/x86-64.exp (Build textrel-1): Use --warn-textrel.
diff --git a/ld/testsuite/ld-arc/got-weak.d b/ld/testsuite/ld-arc/got-weak.d
new file mode 100644
index 0000000..cf15069
--- /dev/null
+++ b/ld/testsuite/ld-arc/got-weak.d
@@ -0,0 +1,12 @@
+#source: got-weak.s
+#as:
+#ld: -Bstatic
+#objdump: -d
+
+[^:]*: file format elf32-.*arc
+
+
+Disassembly of section \.text:
+
+00000100 <.*>:
+ 100: 2730 7f80 0000 2014 ld r0,\[pcl,0x2014\].*
diff --git a/ld/testsuite/ld-arc/got-weak.s b/ld/testsuite/ld-arc/got-weak.s
new file mode 100644
index 0000000..8ea18be
--- /dev/null
+++ b/ld/testsuite/ld-arc/got-weak.s
@@ -0,0 +1,7 @@
+ .cpu archs
+
+ .weak symb
+ .global __start
+ .text
+__start:
+ ld r0,[pcl,@symb@gotpc]