[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