[PATCH v11 14/25] OAv2 merge: merge subsections and tags at file scope
Jan Beulich
jbeulich@suse.com
Thu Jan 8 14:02:09 GMT 2026
On 31.12.2025 00:05, Matthieu Longo wrote:
> Before merging input object files together, each input's object
> attributes must be sanitized to ensure that duplicate subsections and
> attributes are merged and properly sorted. Indeed, uniqueness and
> ordering of subsections and attributes are required prerequisites for
> the merge process.
> This operation also handles, on a best-effort basis, exotic objects
> produced by non-GNU assemblers, where duplicate subsections may appear
> across different sections, and similarly, duplicate attributes across
> subsections.
> It is importand to note that such cases are not covered by the Object
> Attributes specification, and the resulting behavior is implementation
> -defined. Other linkers may handle these inputs differently.
> ---
> bfd/elf-attrs.c | 182 +++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 179 insertions(+), 3 deletions(-)
Okay with ...
> +/* Merge two subsections together (object attributes v2 only).
> + The result is stored into subsec1. subsec2 is destroyed.
> + Return true if the merge was successful, false otherwise.
> + Note: subsec1 and subsec2 are expected to be sorted before the call to this
> + function. */
> +static bool
> +oav2_subsection_destructive_merge (const bfd *abfd,
> + obj_attr_subsection_v2_t *subsec1,
> + obj_attr_subsection_v2_t *subsec2)
> +{
> + BFD_ASSERT (subsec1->encoding == subsec2->encoding
> + && subsec1->optional == subsec2->optional);
> +
> + bool success = true;
> +
> + success &= oav2_compact_tags (abfd, subsec1);
> + success &= oav2_compact_tags (abfd, subsec2);
> +
> + obj_attr_v2_t *a1 = subsec1->first;
> + obj_attr_v2_t *a2 = subsec2->first;
> + while (a1 != NULL && a2 != NULL)
> + {
> + if (a1->tag < a2->tag)
> + {} /* Nothing to do, a1 is already in subsec1. */
> + else if (a1->tag > a2->tag)
> + {
> + /* a2 is missing in subsec1, add it. */
> + obj_attr_v2_t *previous
> + = LINKED_LIST_REMOVE(obj_attr_v2_t) (subsec2, a2);
> + LINKED_LIST_INSERT_BEFORE(obj_attr_v2_t) (subsec1, a2, a1);
... the style issue here (and further down) addressed.
Jan
More information about the Binutils
mailing list