[PATCH 2/8] bfd: move sec_info from ELF to general section struct
Jan Beulich
jbeulich@suse.com
Mon Oct 13 09:05:34 GMT 2025
More information about the Binutils mailing list
Mon Oct 13 09:05:34 GMT 2025
- Previous message (by thread): [PATCH 1/8] bfd: move merge_info from ELF to general link hash table
- Next message (by thread): [PATCH 3/8] bfd: simplify _bfd_{add_merge,write_merged}_section() interface
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
This is in preparation of supporting section merging also when the output
isn't ELF (or not of the same class). Note that it's also more consistent
this way, as the related sec_info_type field also live in the same struct.
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -839,6 +839,10 @@ typedef struct bfd_section
regions is enabled. */
struct bfd_section *already_assigned;
+ /* A pointer used for various section optimizations. .sec_info_type
+ qualifies which one it is. */
+ void *sec_info;
+
/* Explicitly specified section type, if non-zero. */
unsigned int type;
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -10234,8 +10234,7 @@ _bfd_elf_free_cached_info (bfd *abfd)
elf_section_data (sec)->relocs = NULL;
if (sec->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
{
- struct eh_frame_sec_info *sec_info
- = elf_section_data (sec)->sec_info;
+ struct eh_frame_sec_info *sec_info = sec->sec_info;
free (sec_info->cies);
}
}
@@ -13260,8 +13259,7 @@ _bfd_elf_rela_local_sym (bfd *abfd,
&& sec->sec_info_type == SEC_INFO_TYPE_MERGE)
{
rel->r_addend =
- _bfd_merged_section_offset (abfd, psec,
- elf_section_data (sec)->sec_info,
+ _bfd_merged_section_offset (abfd, psec, sec->sec_info,
sym->st_value + rel->r_addend);
if (sec != *psec)
{
@@ -13291,8 +13289,7 @@ _bfd_elf_rel_local_sym (bfd *abfd,
if (sec->sec_info_type != SEC_INFO_TYPE_MERGE)
return sym->st_value + addend;
- return _bfd_merged_section_offset (abfd, psec,
- elf_section_data (sec)->sec_info,
+ return _bfd_merged_section_offset (abfd, psec, sec->sec_info,
sym->st_value + addend);
}
@@ -13311,8 +13308,8 @@ _bfd_elf_section_offset (bfd *abfd,
switch (sec->sec_info_type)
{
case SEC_INFO_TYPE_STABS:
- return _bfd_stab_section_offset (sec, elf_section_data (sec)->sec_info,
- offset);
+ return _bfd_stab_section_offset (sec, sec->sec_info, offset);
+
case SEC_INFO_TYPE_EH_FRAME:
return _bfd_elf_eh_frame_section_offset (abfd, info, sec, offset);
@@ -13740,7 +13737,7 @@ _bfd_elf_slurp_secondary_reloc_section (
free (native_relocs);
/* Store the internal relocs. */
- elf_section_data (relsec)->sec_info = internal_relocs;
+ relsec->sec_info = internal_relocs;
}
}
@@ -13773,9 +13770,8 @@ _bfd_elf_copy_special_section_fields (co
if (osec == NULL)
return false;
- esd = elf_section_data (osec);
- BFD_ASSERT (esd->sec_info == NULL);
- esd->sec_info = elf_section_data (isec)->sec_info;
+ BFD_ASSERT (osec->sec_info == NULL);
+ osec->sec_info = isec->sec_info;
osection->sh_type = SHT_RELA;
osection->sh_link = elf_onesymtab (obfd);
if (osection->sh_link == 0)
@@ -13944,7 +13940,7 @@ _bfd_elf_write_secondary_reloc_section (
last_sym = NULL;
last_sym_idx = 0;
dst_rela = hdr->contents;
- src_irel = (arelent *) esd->sec_info;
+ src_irel = sec->sec_info;
if (src_irel == NULL)
{
_bfd_error_handler
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -1893,9 +1893,6 @@ struct bfd_elf_section_data
FIXME: In the future it might be better to change this into a list
of secondary reloc sections, making lookup easier and faster. */
bool has_secondary_relocs;
-
- /* A pointer used for various section optimizations. */
- void *sec_info;
};
#define elf_section_data(sec) ((struct bfd_elf_section_data*)(sec)->used_by_bfd)
--- a/bfd/elf-eh-frame.c
+++ b/bfd/elf-eh-frame.c
@@ -566,7 +566,7 @@ _bfd_elf_parse_eh_frame_entry (struct bf
sec->flags |= SEC_EXCLUDE;
sec->sec_info_type = SEC_INFO_TYPE_EH_FRAME_ENTRY;
- elf_section_data (sec)->sec_info = text_sec;
+ sec->sec_info = text_sec;
bfd_elf_record_eh_frame_entry (hdr_info, sec);
return true;
}
@@ -1046,7 +1046,7 @@ _bfd_elf_parse_eh_frame (bfd *abfd, stru
BFD_ASSERT (sec_info->count == num_entries);
BFD_ASSERT (cie_count == num_cies);
- elf_section_data (sec)->sec_info = sec_info;
+ sec->sec_info = sec_info;
sec->sec_info_type = SEC_INFO_TYPE_EH_FRAME;
if (!bfd_link_relocatable (info))
{
@@ -1078,10 +1078,10 @@ cmp_eh_frame_hdr (const void *a, const v
asection *sec;
sec = *(asection *const *)a;
- sec = (asection *) elf_section_data (sec)->sec_info;
+ sec = sec->sec_info;
text_a = sec->output_section->vma + sec->output_offset;
sec = *(asection *const *)b;
- sec = (asection *) elf_section_data (sec)->sec_info;
+ sec = sec->sec_info;
text_b = sec->output_section->vma + sec->output_offset;
if (text_a < text_b)
@@ -1105,10 +1105,10 @@ add_eh_frame_hdr_terminator (asection *s
{
/* See if there is a gap (presumably a text section without unwind info)
between these two entries. */
- text_sec = (asection *) elf_section_data (sec)->sec_info;
+ text_sec = sec->sec_info;
end = text_sec->output_section->vma + text_sec->output_offset
+ text_sec->size;
- text_sec = (asection *) elf_section_data (next)->sec_info;
+ text_sec = next->sec_info;
next_start = text_sec->output_section->vma + text_sec->output_offset;
if (end == next_start)
return;
@@ -1343,8 +1343,7 @@ find_merged_cie (bfd *abfd, struct bfd_l
static bfd_signed_vma
offset_adjust (bfd_vma offset, const asection *sec)
{
- struct eh_frame_sec_info *sec_info
- = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
+ struct eh_frame_sec_info *sec_info = sec->sec_info;
unsigned int lo, hi, mid;
struct eh_cie_fde *ent = NULL;
bfd_signed_vma delta;
@@ -1436,7 +1435,7 @@ _bfd_elf_adjust_eh_frame_global_symbol (
sym_sec = h->root.u.def.section;
if (sym_sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME
- || elf_section_data (sym_sec)->sec_info == NULL)
+ || sym_sec->sec_info == NULL)
return true;
delta = offset_adjust (h->root.u.def.value, sym_sec);
@@ -1496,7 +1495,7 @@ _bfd_elf_discard_section_eh_frame
if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
return false;
- sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
+ sec_info = sec->sec_info;
if (sec_info == NULL)
return false;
@@ -1771,7 +1770,7 @@ _bfd_elf_eh_frame_section_offset (bfd *o
if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
return offset;
- sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
+ sec_info = sec->sec_info;
if (offset >= sec->rawsize)
return offset - sec->rawsize + sec->size;
@@ -1854,7 +1853,7 @@ _bfd_elf_write_section_eh_frame_entry (b
bfd_vma addr;
bfd_vma last_addr;
bfd_vma offset;
- asection *text_sec = (asection *) elf_section_data (sec)->sec_info;
+ asection *text_sec = sec->sec_info;
if (!sec->rawsize)
sec->rawsize = sec->size;
@@ -1946,7 +1945,7 @@ _bfd_elf_write_section_eh_frame (bfd *ab
->elf_backend_eh_frame_address_size (abfd, sec));
BFD_ASSERT (ptr_size != 0);
- sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
+ sec_info = sec->sec_info;
htab = elf_hash_table (info);
hdr_info = &htab->eh_info;
--- a/bfd/elf-m10300.c
+++ b/bfd/elf-m10300.c
@@ -3393,7 +3393,7 @@ mn10300_elf_relax_section (bfd *abfd,
symval += irel->r_addend;
symval = _bfd_merged_section_offset (abfd, & sym_sec,
- elf_section_data (sym_sec)->sec_info,
+ sym_sec->sec_info,
symval);
if (ELF_ST_TYPE (isym->st_info) != STT_SECTION)
--- a/bfd/elf-sframe.c
+++ b/bfd/elf-sframe.c
@@ -249,7 +249,7 @@ _bfd_elf_parse_sframe (bfd *abfd,
goto fail_no_free;
}
- elf_section_data (sec)->sec_info = sfd_info;
+ sec->sec_info = sfd_info;
sec->sec_info_type = SEC_INFO_TYPE_SFRAME;
goto success;
@@ -288,7 +288,7 @@ _bfd_elf_discard_section_sframe
.rela.sframe get updated ?. */
keep = false;
- sfd_info = (struct sframe_dec_info *) elf_section_data (sec)->sec_info;
+ sfd_info = sec->sec_info;
/* Skip checking for the linker created .sframe sections
(for PLT sections). */
@@ -360,7 +360,7 @@ _bfd_elf_merge_section_sframe (bfd *abfd
if (sec->sec_info_type != SEC_INFO_TYPE_SFRAME)
return false;
- sfd_info = (struct sframe_dec_info *) elf_section_data (sec)->sec_info;
+ sfd_info = sec->sec_info;
sfd_ctx = sfd_info->sfd_ctx;
htab = elf_hash_table (info);
@@ -600,7 +600,7 @@ _bfd_elf_sframe_section_offset (bfd *out
if (sec->sec_info_type != SEC_INFO_TYPE_SFRAME)
return offset;
- sfd_info = elf_section_data (sec)->sec_info;
+ sfd_info = sec->sec_info;
sfd_ctx = sfd_info->sfd_ctx;
sfd_num_fdes = sframe_decoder_get_num_fidx (sfd_ctx);
--- a/bfd/elf32-nds32.c
+++ b/bfd/elf32-nds32.c
@@ -7489,7 +7489,7 @@ calculate_offset (bfd *abfd, asection *s
{
sym_sec = h->root.u.def.section;
symval = _bfd_merged_section_offset (abfd, &sym_sec,
- elf_section_data (sym_sec)->sec_info,
+ sym_sec->sec_info,
h->root.u.def.value);
symval = symval + sym_sec->output_section->vma
+ sym_sec->output_offset;
@@ -8629,13 +8629,11 @@ nds32_elf_rela_local_sym (bfd *abfd, Elf
{
if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
rel->r_addend =
- _bfd_merged_section_offset (abfd, psec,
- elf_section_data (sec)->sec_info,
+ _bfd_merged_section_offset (abfd, psec, sec->sec_info,
sym->st_value + rel->r_addend);
else
rel->r_addend =
- _bfd_merged_section_offset (abfd, psec,
- elf_section_data (sec)->sec_info,
+ _bfd_merged_section_offset (abfd, psec, sec->sec_info,
sym->st_value) + rel->r_addend;
if (sec != *psec)
@@ -8708,8 +8706,9 @@ calculate_memory_address (bfd *abfd, Elf
if (h->root.u.def.section->flags & SEC_MERGE)
{
sym_sec = h->root.u.def.section;
- symval = _bfd_merged_section_offset (abfd, &sym_sec, elf_section_data
- (sym_sec)->sec_info, h->root.u.def.value);
+ symval = _bfd_merged_section_offset (abfd, &sym_sec,
+ sym_sec->sec_info,
+ h->root.u.def.value);
symval = symval + sym_sec->output_section->vma
+ sym_sec->output_offset;
}
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -6115,14 +6115,14 @@ ppc_elf_relax_section (bfd *abfd,
if (htab->params->ppc476_workaround
|| htab->params->pic_fixup > 0)
{
- if (elf_section_data (isec)->sec_info == NULL)
+ if (isec->sec_info == NULL)
{
- elf_section_data (isec)->sec_info
+ isec->sec_info
= bfd_zalloc (abfd, sizeof (struct ppc_elf_relax_info));
- if (elf_section_data (isec)->sec_info == NULL)
+ if (isec->sec_info == NULL)
return false;
}
- relax_info = elf_section_data (isec)->sec_info;
+ relax_info = isec->sec_info;
trampbase -= relax_info->workaround_size;
}
@@ -6382,8 +6382,7 @@ ppc_elf_relax_section (bfd *abfd,
toff += irel->r_addend;
toff
- = _bfd_merged_section_offset (abfd, &tsec,
- elf_section_data (tsec)->sec_info,
+ = _bfd_merged_section_offset (abfd, &tsec, tsec->sec_info,
toff);
if (sym_type != STT_SECTION
@@ -7019,7 +7018,7 @@ ppc_elf_relocate_section (bfd *output_bf
&& !strcmp (input_section->output_section->name,
".tls_vars"));
if (input_section->sec_info_type == SEC_INFO_TYPE_TARGET)
- relax_info = elf_section_data (input_section)->sec_info;
+ relax_info = input_section->sec_info;
rel = wrel = relocs;
relend = relocs + input_section->reloc_count;
for (; rel < relend; wrel++, rel++)
--- a/bfd/elf32-rl78.c
+++ b/bfd/elf32-rl78.c
@@ -1891,8 +1891,7 @@ rl78_offset_for_reloc (bfd * abfd,
if ((ssec->flags & SEC_MERGE)
&& ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
symval = _bfd_merged_section_offset (abfd, & ssec,
- elf_section_data (ssec)->sec_info,
- symval);
+ ssec->sec_info, symval);
}
/* Now make the offset relative to where the linker is putting it. */
--- a/bfd/elf32-rx.c
+++ b/bfd/elf32-rx.c
@@ -1808,7 +1808,7 @@ rx_offset_for_reloc (bfd * abfd,
if ((ssec->flags & SEC_MERGE)
&& ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
symval = _bfd_merged_section_offset (abfd, & ssec,
- elf_section_data (ssec)->sec_info,
+ ssec->sec_info,
symval);
}
--- a/bfd/elf64-alpha.c
+++ b/bfd/elf64-alpha.c
@@ -4261,8 +4261,7 @@ elf64_alpha_relocate_section (bfd *outpu
msec = sec;
ent->addend =
_bfd_merged_section_offset (output_bfd, &msec,
- elf_section_data (sec)->
- sec_info,
+ sec->sec_info,
sym->st_value + ent->addend);
ent->addend -= sym->st_value;
ent->addend += msec->output_section->vma
--- a/bfd/elf64-ia64-vms.c
+++ b/bfd/elf64-ia64-vms.c
@@ -3472,8 +3472,7 @@ elf64_ia64_relocate_section (bfd *output
msec = sym_sec;
dynent->addend =
_bfd_merged_section_offset (output_bfd, &msec,
- elf_section_data (msec)->
- sec_info,
+ msec->sec_info,
sym->st_value
+ dynent->addend);
dynent->addend -= sym->st_value;
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -3452,7 +3452,7 @@ _bfd_elf_link_sec_merge_syms (struct elf
h->root.u.def.value =
_bfd_merged_section_offset (output_bfd,
&h->root.u.def.section,
- elf_section_data (sec)->sec_info,
+ sec->sec_info,
h->root.u.def.value);
}
@@ -6130,14 +6130,11 @@ elf_link_add_object_symbols (bfd *abfd,
&& (stab->flags & SEC_MERGE) == 0
&& !bfd_is_abs_section (stab->output_section))
{
- struct bfd_elf_section_data *secdata;
-
- secdata = elf_section_data (stab);
if (! _bfd_link_section_stabs (abfd, &htab->stab_info, stab,
- stabstr, &secdata->sec_info,
+ stabstr, &stab->sec_info,
&string_offset))
goto error_return;
- if (secdata->sec_info)
+ if (stab->sec_info)
stab->sec_info_type = SEC_INFO_TYPE_STABS;
}
}
@@ -8211,14 +8208,11 @@ _bfd_elf_merge_sections (bfd *obfd, stru
if ((sec->flags & SEC_MERGE) != 0
&& !bfd_is_abs_section (sec->output_section))
{
- struct bfd_elf_section_data *secdata;
-
- secdata = elf_section_data (sec);
if (! _bfd_add_merge_section (obfd,
&info->hash->merge_info,
- sec, &secdata->sec_info))
+ sec, &sec->sec_info))
return false;
- else if (secdata->sec_info)
+ else if (sec->sec_info)
sec->sec_info_type = SEC_INFO_TYPE_MERGE;
}
@@ -11510,7 +11504,7 @@ elf_link_input_bfd (struct elf_final_lin
&& ELF_ST_TYPE (isym->st_info) != STT_SECTION)
isym->st_value =
_bfd_merged_section_offset (output_bfd, &isec,
- elf_section_data (isec)->sec_info,
+ isec->sec_info,
isym->st_value);
}
@@ -12245,12 +12239,11 @@ elf_link_input_bfd (struct elf_final_lin
if (! (_bfd_write_section_stabs
(output_bfd,
&elf_hash_table (flinfo->info)->stab_info,
- o, &elf_section_data (o)->sec_info, contents)))
+ o, &o->sec_info, contents)))
return false;
break;
case SEC_INFO_TYPE_MERGE:
- if (! _bfd_write_merged_section (output_bfd, o,
- elf_section_data (o)->sec_info))
+ if (! _bfd_write_merged_section (output_bfd, o, o->sec_info))
return false;
break;
case SEC_INFO_TYPE_EH_FRAME:
@@ -14720,7 +14713,7 @@ bfd_elf_gc_sections (bfd *abfd, struct b
false))
{
_bfd_elf_parse_eh_frame (sub, info, sec, &cookie);
- if (elf_section_data (sec)->sec_info
+ if (sec->sec_info
&& (sec->flags & SEC_LINKER_CREATED) == 0)
elf_eh_frame_section (sub) = sec;
fini_reloc_cookie_for_section (&cookie, sec);
@@ -15232,8 +15225,7 @@ bfd_elf_discard_info (bfd *output_bfd, s
if (!init_reloc_cookie_for_section (&cookie, info, i, false))
return -1;
- if (_bfd_discard_section_stabs (abfd, i,
- elf_section_data (i)->sec_info,
+ if (_bfd_discard_section_stabs (abfd, i, i->sec_info,
bfd_elf_reloc_symbol_deleted_p,
&cookie))
changed = 1;
--- a/bfd/elfnn-ia64.c
+++ b/bfd/elfnn-ia64.c
@@ -557,8 +557,7 @@ elfNN_ia64_relax_section (bfd *abfd, ase
if (symtype == STT_SECTION)
toff += irel->r_addend;
- toff = _bfd_merged_section_offset (abfd, &tsec,
- elf_section_data (tsec)->sec_info,
+ toff = _bfd_merged_section_offset (abfd, &tsec, tsec->sec_info,
toff);
if (symtype != STT_SECTION)
@@ -3868,8 +3867,7 @@ elfNN_ia64_relocate_section (bfd *output
msec = sym_sec;
dynent->addend =
_bfd_merged_section_offset (output_bfd, &msec,
- elf_section_data (msec)->
- sec_info,
+ msec->sec_info,
sym->st_value
+ dynent->addend);
dynent->addend -= sym->st_value;
--- a/bfd/elfnn-loongarch.c
+++ b/bfd/elfnn-loongarch.c
@@ -6017,8 +6017,8 @@ loongarch_elf_relax_section (bfd *abfd,
symval += rel->r_addend;
symval = _bfd_merged_section_offset (abfd, &sym_sec,
- elf_section_data (sym_sec)->sec_info,
- symval);
+ sym_sec->sec_info,
+ symval);
if (symtype != STT_SECTION)
symval += rel->r_addend;
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -5622,8 +5622,7 @@ _bfd_riscv_relax_section (bfd *abfd, ase
symval += rel->r_addend;
symval = _bfd_merged_section_offset (abfd, &sym_sec,
- elf_section_data (sym_sec)->sec_info,
- symval);
+ sym_sec->sec_info, symval);
if (symtype != STT_SECTION)
symval += rel->r_addend;
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -4545,14 +4545,11 @@ mips_elf_resolve_got_page_ref (void **re
specifies the offset _from_ the first byte. */
if (sec->flags & SEC_MERGE)
{
- void *secinfo;
-
- secinfo = elf_section_data (sec)->sec_info;
if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
- addend = _bfd_merged_section_offset (ref->u.abfd, &sec, secinfo,
+ addend = _bfd_merged_section_offset (ref->u.abfd, &sec, sec->sec_info,
isym->st_value + ref->addend);
else
- addend = _bfd_merged_section_offset (ref->u.abfd, &sec, secinfo,
+ addend = _bfd_merged_section_offset (ref->u.abfd, &sec, sec->sec_info,
isym->st_value) + ref->addend;
}
else
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -3694,8 +3694,8 @@ bool _bfd_unrecognized_reloc
/* symbol, */ \
(struct bfd_symbol *) SYM, \
\
- /* map_head, map_tail, already_assigned, type */ \
- { NULL }, { NULL }, NULL, 0 \
+ /* map_head, map_tail, already_assigned, sec_info, type */ \
+ { NULL }, { NULL }, NULL, NULL, 0 \
\
}
--- a/bfd/section.c
+++ b/bfd/section.c
@@ -565,6 +565,10 @@ CODE_FRAGMENT
. regions is enabled. *}
. struct bfd_section *already_assigned;
.
+. {* A pointer used for various section optimizations. sec_info_type
+ยด. qualifies which one it is. *}
+. void *sec_info;
+.
. {* Explicitly specified section type, if non-zero. *}
. unsigned int type;
.
@@ -747,8 +751,8 @@ INTERNAL
. {* symbol, *} \
. (struct bfd_symbol *) SYM, \
. \
-. {* map_head, map_tail, already_assigned, type *} \
-. { NULL }, { NULL }, NULL, 0 \
+. {* map_head, map_tail, already_assigned, sec_info, type *} \
+. { NULL }, { NULL }, NULL, NULL, 0 \
. \
. }
.
- Previous message (by thread): [PATCH 1/8] bfd: move merge_info from ELF to general link hash table
- Next message (by thread): [PATCH 3/8] bfd: simplify _bfd_{add_merge,write_merged}_section() interface
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list