[PATCH v8 12/19] Merge of Object Attributes v2 during linkage (generic logic)

Jan Beulich jbeulich@suse.com
Mon Sep 1 13:57:09 GMT 2025


On 01.09.2025 15:53, Matthieu Longo wrote:
> On 2025-09-01 08:37, Jan Beulich wrote:
>> On 29.08.2025 18:37, Matthieu Longo wrote:
>>> On 2025-08-22 10:50, Jan Beulich wrote:
>>>> On 15.07.2025 13:39, Matthieu Longo wrote:
>>>>> +/* Merge object attributes from object file ABFD into REF_BFD.  */
>>>>> +static bool
>>>>> +oav2_subsections_merge (struct bfd_link_info *info, bfd *ref_bfd, bfd *abfd)
>>>>> +{
>>>>> +  bool success = true;
>>>>> +  obj_attr_subsection_list *out_frozen_subsecs
>>>>> +    = &elf_obj_attr_subsections (info->output_bfd);
>>>>> +  obj_attr_subsection_list *abfd_subsecs = &elf_obj_attr_subsections (abfd);
>>>>> +  obj_attr_subsection_list *ref_subsecs = &elf_obj_attr_subsections (ref_bfd);
>>>>> +
>>>>> +  obj_attr_subsection_v2 *s_frozen_first = out_frozen_subsecs->first;
>>>>> +  obj_attr_subsection_v2 *s_abfd = abfd_subsecs->first;
>>>>> +  obj_attr_subsection_v2 *s_ref = ref_subsecs->first;
>>>>> +
>>>>> +  /* Translate object attributes from abfd to GNU properties if they have an
>>>>> +     equivalence.  */
>>>>> +  _bfd_elf_translate_relevant_obj_attrs_to_gnu_props (abfd);
>>>>
>>>> How does this call fit here? Below you're only dealing with attributes,
>>>> afaict.
>>>
>>> ABFD is an input file. It might have either GNU properties only, object
>>> attributes only, or both.
>>>
>>> Before the merge of object attributes occur, we need to make sure that
>>> the GNU properties are translated to their object attributes equivalents
>>> (if they exists).
>>>
>>> In the same way, before the merge of GNU properties, we need to make
>>> sure that the object attributes are translated to their GNU properties
>>> equivalents (if they exists).
>>>
>>> In this implementation, the merge of object attributes always occurs
>>> before the merge of GNU properties.
>>
>> May I then ask that you extend the comment some, to mention not only what
>> is done, but also why it's done here?
>>
> 
> ABFD is an input file that may contain GNU properties, object 
> attributes, or both.  Before merging object attributes, we must first 
> translate any GNU properties into their equivalent object attributes (if 
> such equivalents exist) since they may not already be present.
> 
> Note: object attributes are always merged before GNU properties. 
> Ideally, there would be a single internal representation, with an 
> abstraction level flexible enough to capture both GNU properties and 
> object attributes without loss.  In such a design, merge order would be 
> irrelevant, and translation would occur only at the I/O boundaries 
> during deserialization of GNU properties and object attributes.
> 
> 
> Is this clear enough ?

Yes; it's maybe a little too verbose now.

>>>>> +      else /* (subsec->encoding == NTBS)  */
>>>>> +	{
>>>>> +	  if (strcmp (a->vals.string_val, a->next->vals.string_val) != 0)
>>>>
>>>> Code in obj_attr_v2_tag_merge_ADD() suggests that vals.string_val can be NULL,
>>>> in which case it would be invalid to pass to strcmp().
>>>
>>> oav2_file_scope_merge_subsections(), which calls oav2_compact_tags(), is
>>> called before oav2_merge_attrs().
>>> It compacts the content of subsections before the merge process starts,
>>> because the merge process has for the following requirements on an input
>>> object file:
>>> - the subsections have to be sorted in alphabetical order.
>>> - the attributes inside a subsection have to be sorted in ascending order.
>>> - the subsections and their attributes have to be unique.
>>>
>>> The value of a string attribute can only be NULL if this attribute was
>>> created by the merge process.
>>> Since this code runs before the merge process, no worry about the string
>>> being NULL and strcmp() can work assuming that the string will never be
>>> NULL.
>>
>> As that's far from obvious here, may I ask that you add a comment and maybe
>> also an assertion?
> 
> What about this ?
> 
> /* For NTBS encoding, ensure that the string value of the attributes is 
>   not NULL.
>     Note: a string attribute can only be NULL if it was created during 
> the merge process.  Since tag compaction occurs before merging begins, 
> this assertion guarantees that the function is never called in a context 
> where the assumption does not hold.  */
>    BFD_ASSERT
>      (subsec->encoding == OA_ENC_ULEB128 ||
>       (a->val.string_val != NULL && a->next->val.string_val != NULL));

Looks okay.

Jan


More information about the Binutils mailing list