[PATCH 14/15] s390: Use elf_append_rela helper
Jens Remus
jremus@linux.ibm.com
Fri Nov 7 16:34:57 GMT 2025
This simplifies the code. Inspired by x86-64.
bfd/
* elf64-s390.c (elf_s390_relocate_section,
elf_s390_finish_dynamic_symbol): Use elf_append_rela helper.
* elf32-s390.c (elf_s390_relocate_section,
elf_s390_finish_dynamic_symbol): Likewise.
Signed-off-by: Jens Remus <jremus@linux.ibm.com>
---
bfd/elf32-s390.c | 52 +++++++++++++++---------------------------------
bfd/elf64-s390.c | 52 +++++++++++++++---------------------------------
2 files changed, 32 insertions(+), 72 deletions(-)
diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c
index 8ad7ca5a729a..c5cba3ef02c1 100644
--- a/bfd/elf32-s390.c
+++ b/bfd/elf32-s390.c
@@ -2343,7 +2343,6 @@ elf_s390_relocate_section (bfd *output_bfd,
{
asection *srelgot;
Elf_Internal_Rela outrel;
- bfd_byte *loc;
srelgot = htab->elf.srelgot;
if (srelgot == NULL)
@@ -2354,9 +2353,7 @@ elf_s390_relocate_section (bfd *output_bfd,
+ off);
outrel.r_info = ELF32_R_INFO (0, R_390_RELATIVE);
outrel.r_addend = relocation;
- loc = srelgot->contents;
- loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
- bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+ elf_append_rela (output_bfd, srelgot, &outrel);
}
local_got_offsets[r_symndx] |= 1;
@@ -2590,7 +2587,6 @@ elf_s390_relocate_section (bfd *output_bfd,
Elf_Internal_Rela outrel;
bool skip, relocate;
asection *sreloc;
- bfd_byte *loc;
/* When generating a shared object, these relocations
are copied into the output file to be resolved at run
@@ -2673,9 +2669,7 @@ elf_s390_relocate_section (bfd *output_bfd,
if (sreloc == NULL)
abort ();
- loc = sreloc->contents;
- loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
- bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+ elf_append_rela (output_bfd, sreloc, &outrel);
/* If this reloc is against an external symbol, we do
not want to fiddle with the addend. Otherwise, we
@@ -2692,7 +2686,6 @@ elf_s390_relocate_section (bfd *output_bfd,
{
Elf_Internal_Rela outrel;
asection *sreloc;
- bfd_byte *loc;
outrel.r_offset = rel->r_offset
+ input_section->output_section->vma
@@ -2701,9 +2694,7 @@ elf_s390_relocate_section (bfd *output_bfd,
sreloc = elf_section_data (input_section)->sreloc;
if (sreloc == NULL)
abort ();
- loc = sreloc->contents;
- loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
- bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
+ elf_append_rela (output_bfd, sreloc, &outrel);
}
/* Fall through. */
@@ -2754,12 +2745,14 @@ elf_s390_relocate_section (bfd *output_bfd,
else
{
Elf_Internal_Rela outrel;
- bfd_byte *loc;
int dr_type, indx;
+ asection *sreloc;
if (htab->elf.srelgot == NULL)
abort ();
+ sreloc = htab->elf.srelgot;
+
outrel.r_offset = (htab->elf.sgot->output_section->vma
+ htab->elf.sgot->output_offset + off);
@@ -2773,10 +2766,7 @@ elf_s390_relocate_section (bfd *output_bfd,
else
outrel.r_addend = 0;
outrel.r_info = ELF32_R_INFO (indx, dr_type);
- loc = htab->elf.srelgot->contents;
- loc += htab->elf.srelgot->reloc_count++
- * sizeof (Elf32_External_Rela);
- bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+ elf_append_rela (output_bfd, sreloc, &outrel);
if (r_type == R_390_TLS_GD32)
{
@@ -2792,9 +2782,7 @@ elf_s390_relocate_section (bfd *output_bfd,
outrel.r_info = ELF32_R_INFO (indx, R_390_TLS_DTPOFF);
outrel.r_offset += GOT_ENTRY_SIZE;
outrel.r_addend = 0;
- htab->elf.srelgot->reloc_count++;
- loc += sizeof (Elf32_External_Rela);
- bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+ elf_append_rela (output_bfd, sreloc, &outrel);
}
}
@@ -2870,11 +2858,13 @@ elf_s390_relocate_section (bfd *output_bfd,
else
{
Elf_Internal_Rela outrel;
- bfd_byte *loc;
+ asection *sreloc;
if (htab->elf.srelgot == NULL)
abort ();
+ sreloc = htab->elf.srelgot;
+
outrel.r_offset = (htab->elf.sgot->output_section->vma
+ htab->elf.sgot->output_offset + off);
@@ -2882,10 +2872,7 @@ elf_s390_relocate_section (bfd *output_bfd,
htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
outrel.r_info = ELF32_R_INFO (0, R_390_TLS_DTPMOD);
outrel.r_addend = 0;
- loc = htab->elf.srelgot->contents;
- loc += htab->elf.srelgot->reloc_count++
- * sizeof (Elf32_External_Rela);
- bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+ elf_append_rela (output_bfd, sreloc, &outrel);
htab->tls_ldm_got.offset |= 1;
}
relocation = htab->elf.sgot->output_offset + off;
@@ -2899,7 +2886,6 @@ elf_s390_relocate_section (bfd *output_bfd,
a R_390_TLS_TPOFF relocation. */
Elf_Internal_Rela outrel;
asection *sreloc;
- bfd_byte *loc;
int indx;
outrel.r_offset = rel->r_offset
@@ -2917,9 +2903,7 @@ elf_s390_relocate_section (bfd *output_bfd,
sreloc = elf_section_data (input_section)->sreloc;
if (sreloc == NULL)
abort ();
- loc = sreloc->contents;
- loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
- bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+ elf_append_rela (output_bfd, sreloc, &outrel);
}
else
{
@@ -3481,7 +3465,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
&& elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE_NLT)
{
Elf_Internal_Rela rela;
- bfd_byte *loc;
+ asection *relgot = htab->elf.srelgot;
/* This symbol has an entry in the global offset table. Set it
up. */
@@ -3542,16 +3526,13 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
rela.r_addend = 0;
}
- loc = htab->elf.srelgot->contents;
- loc += htab->elf.srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
- bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
+ elf_append_rela (output_bfd, relgot, &rela);
}
if (h->needs_copy)
{
Elf_Internal_Rela rela;
asection *s;
- bfd_byte *loc;
/* This symbols needs a copy reloc. Set it up. */
@@ -3571,8 +3552,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
s = htab->elf.sreldynrelro;
else
s = htab->elf.srelbss;
- loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
- bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
+ elf_append_rela (output_bfd, s, &rela);
}
/* Mark some specially defined symbols as absolute. */
diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c
index da661206c641..6ba67553f03c 100644
--- a/bfd/elf64-s390.c
+++ b/bfd/elf64-s390.c
@@ -2588,7 +2588,6 @@ elf_s390_relocate_section (bfd *output_bfd,
{
asection *srelgot;
Elf_Internal_Rela outrel;
- bfd_byte *loc;
srelgot = htab->elf.srelgot;
if (srelgot == NULL)
@@ -2599,9 +2598,7 @@ elf_s390_relocate_section (bfd *output_bfd,
+ off);
outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
outrel.r_addend = relocation;
- loc = srelgot->contents;
- loc += srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
- bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
+ elf_append_rela (output_bfd, srelgot, &outrel);
}
local_got_offsets[r_symndx] |= 1;
@@ -2947,7 +2944,6 @@ elf_s390_relocate_section (bfd *output_bfd,
Elf_Internal_Rela outrel;
bool skip, relocate;
asection *sreloc;
- bfd_byte *loc;
/* When generating a shared object, these relocations
are copied into the output file to be resolved at run
@@ -3030,9 +3026,7 @@ elf_s390_relocate_section (bfd *output_bfd,
if (sreloc == NULL)
abort ();
- loc = sreloc->contents;
- loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
- bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
+ elf_append_rela (output_bfd, sreloc, &outrel);
/* If this reloc is against an external symbol, we do
not want to fiddle with the addend. Otherwise, we
@@ -3049,7 +3043,6 @@ elf_s390_relocate_section (bfd *output_bfd,
{
Elf_Internal_Rela outrel;
asection *sreloc;
- bfd_byte *loc;
outrel.r_offset = rel->r_offset
+ input_section->output_section->vma
@@ -3058,9 +3051,7 @@ elf_s390_relocate_section (bfd *output_bfd,
sreloc = elf_section_data (input_section)->sreloc;
if (sreloc == NULL)
abort ();
- loc = sreloc->contents;
- loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
- bfd_elf64_swap_reloc_out (output_bfd, &outrel, loc);
+ elf_append_rela (output_bfd, sreloc, &outrel);
}
/* Fall through. */
@@ -3111,12 +3102,14 @@ elf_s390_relocate_section (bfd *output_bfd,
else
{
Elf_Internal_Rela outrel;
- bfd_byte *loc;
int dr_type, indx;
+ asection *sreloc;
if (htab->elf.srelgot == NULL)
abort ();
+ sreloc = htab->elf.srelgot;
+
outrel.r_offset = (htab->elf.sgot->output_section->vma
+ htab->elf.sgot->output_offset + off);
@@ -3130,10 +3123,7 @@ elf_s390_relocate_section (bfd *output_bfd,
else
outrel.r_addend = 0;
outrel.r_info = ELF64_R_INFO (indx, dr_type);
- loc = htab->elf.srelgot->contents;
- loc += htab->elf.srelgot->reloc_count++
- * sizeof (Elf64_External_Rela);
- bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
+ elf_append_rela (output_bfd, sreloc, &outrel);
if (r_type == R_390_TLS_GD64)
{
@@ -3149,9 +3139,7 @@ elf_s390_relocate_section (bfd *output_bfd,
outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_DTPOFF);
outrel.r_offset += GOT_ENTRY_SIZE;
outrel.r_addend = 0;
- htab->elf.srelgot->reloc_count++;
- loc += sizeof (Elf64_External_Rela);
- bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
+ elf_append_rela (output_bfd, sreloc, &outrel);
}
}
@@ -3227,11 +3215,13 @@ elf_s390_relocate_section (bfd *output_bfd,
else
{
Elf_Internal_Rela outrel;
- bfd_byte *loc;
+ asection *sreloc;
if (htab->elf.srelgot == NULL)
abort ();
+ sreloc = htab->elf.srelgot;
+
outrel.r_offset = (htab->elf.sgot->output_section->vma
+ htab->elf.sgot->output_offset + off);
@@ -3239,10 +3229,7 @@ elf_s390_relocate_section (bfd *output_bfd,
htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
outrel.r_info = ELF64_R_INFO (0, R_390_TLS_DTPMOD);
outrel.r_addend = 0;
- loc = htab->elf.srelgot->contents;
- loc += htab->elf.srelgot->reloc_count++
- * sizeof (Elf64_External_Rela);
- bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
+ elf_append_rela (output_bfd, sreloc, &outrel);
htab->tls_ldm_got.offset |= 1;
}
relocation = htab->elf.sgot->output_offset + off;
@@ -3256,7 +3243,6 @@ elf_s390_relocate_section (bfd *output_bfd,
a R_390_TLS_TPOFF relocation. */
Elf_Internal_Rela outrel;
asection *sreloc;
- bfd_byte *loc;
int indx;
outrel.r_offset = rel->r_offset
@@ -3274,9 +3260,7 @@ elf_s390_relocate_section (bfd *output_bfd,
sreloc = elf_section_data (input_section)->sreloc;
if (sreloc == NULL)
abort ();
- loc = sreloc->contents;
- loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
- bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
+ elf_append_rela (output_bfd, sreloc, &outrel);
}
else
{
@@ -3700,7 +3684,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
&& elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE_NLT)
{
Elf_Internal_Rela rela;
- bfd_byte *loc;
+ asection *relgot = htab->elf.srelgot;
/* This symbol has an entry in the global offset table. Set it
up. */
@@ -3761,16 +3745,13 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
rela.r_addend = 0;
}
- loc = htab->elf.srelgot->contents;
- loc += htab->elf.srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
- bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
+ elf_append_rela (output_bfd, relgot, &rela);
}
if (h->needs_copy)
{
Elf_Internal_Rela rela;
asection *s;
- bfd_byte *loc;
/* This symbols needs a copy reloc. Set it up. */
@@ -3790,8 +3771,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
s = htab->elf.sreldynrelro;
else
s = htab->elf.srelbss;
- loc = s->contents + s->reloc_count++ * sizeof (Elf64_External_Rela);
- bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
+ elf_append_rela (output_bfd, s, &rela);
}
/* Mark some specially defined symbols as absolute. */
--
2.48.1
More information about the Binutils
mailing list