[PATCH v9 06/19] bfd: write Object Attributes v2
Matthieu Longo
matthieu.longo@arm.com
Thu Nov 13 19:51:04 GMT 2025
On 07/11/2025 08:23, Jan Beulich wrote:
> On 05.11.2025 11:18, Matthieu Longo wrote:
>> On 30/10/2025 15:55, Jan Beulich wrote:
>>> On 01.09.2025 18:56, Matthieu Longo wrote:
>>>> --- a/gas/write.c
>>>> +++ b/gas/write.c
>>>> @@ -1919,6 +1919,8 @@ create_obj_attrs_section (void)
>>>> bfd_set_section_flags (s, SEC_READONLY | SEC_DATA);
>>>> frag_now_fix ();
>>>> char *p = frag_more (size);
>>>> +
>>>> + bfd_elf_obj_attr_finalize_contents (stdoutput);
>>>> bfd_elf_set_obj_attr_contents (stdoutput, (bfd_byte *)p, size);
>>>
>>> Why is another export needed from libbfd? Can't bfd_elf_set_obj_attr_contents()
>>> simply do whatever it takes? The other caller likely needs doing the same anyway?
>>
>> bfd_elf_set_obj_attr_contents() is also used in objcpy, and objcpy
>> should not change the order of subsections and attributes, but simply
>> make a copy of the data as they were in the original object.
>
> Is this the case already prior to your series? I can't seem to be able to
> identify the call path for that case. Besides the direct call from gas,
> bfd_elf_set_obj_attr_contents() is called only from
> _bfd_elf_write_section_build_attributes(), which in turn is called solely by
> bfd_elf_final_link(). And I can't see this being used by objcopy.
>
Sorry, I said something wrong. It is not used for objcopy but by the
linker in _bfd_elf_write_section_object_attributes().
In the case of the link, all the subsections and attributes are already
sorted by the merge, so no need to sort them again.
>> Another possibility might be to add a parameter to
>> bfd_elf_set_obj_attr_contents() to enable/disable the sorting.
>
> Can the distinction not be made by what struct bfd_link_info contains?
>
> Jan
Here is the new approach after having eliminated
bfd_elf_obj_attr_finalize_contents(). It relies on is_linker_output
being set to 1 in the case of the linker. Is it the approach that you
had in mind ?
/* Write the contents of the object attributes section to CONTENTS. */
void
bfd_elf_set_obj_attr_contents (bfd *abfd, bfd_byte *buffer, bfd_vma size)
{
if ((! abfd->is_linker_output)
&& elf_obj_attr_version (abfd) == OBJ_ATTR_V2)
/* Before dumping the data, sort subsections in alphabetical order, and
attributes according to their tag in numerical order. This is
useful
for diagnostic tools so that they dump the same output even if the
subsections or their attributes were not declared in the same
order in
different files.
This sorting is only performed in the case of the assembler. In the
case of the linker, the subsections and attributes are already
sorted
by the merge process. */
oav2_sort_subsections (&elf_obj_attr_subsections (abfd));
obj_attr_version_t version = elf_obj_attr_version (abfd);
if (version == OBJ_ATTR_V1)
oav1_write_section (abfd, buffer, size);
else if (version == OBJ_ATTR_V2)
oav2_write_section (abfd, buffer, size);
else
abort ();
}
Matthieu
More information about the Binutils
mailing list