]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
OAv2 merge: create a section for object attributes
authorMatthieu Longo <matthieu.longo@arm.com>
Fri, 14 Nov 2025 18:44:46 +0000 (18:44 +0000)
committerMatthieu Longo <matthieu.longo@arm.com>
Thu, 22 Jan 2026 10:11:16 +0000 (10:11 +0000)
bfd copies object attributes to the output BFD only if the input BFD â€”
used to store the merge result— contains an object attribute section.
bfd_linear_find_first_with_obj_attrs() returns an input BFD that may or
may not already include such a section.  If no object attributes section
is found, the merge process must create one.

This patch implements create_object_attributes_section(), which constructs
the missing section with the appropriate flags, type, and alignment.  The
implementation is adapted from _bfd_elf_link_create_gnu_property_sec() in
bfd/elf-properties.c.  The code preserves the different alignment
requirements for 32-bit and 64-bit ELF formats, although the rationale for
this distinction remains unclear in the original source and patch history.

bfd/elf-attrs.c

index b9b8abd50179b926117475ef88f2f72870c1debb..4b943376016f70ccd980aab83249302516aba14d 100644 (file)
@@ -796,10 +796,24 @@ static asection *
 create_object_attributes_section (struct bfd_link_info *info,
                                  bfd *abfd)
 {
-  (void) info;
-  (void) abfd;
-  /* TO IMPLEMENT */
-  return NULL;
+  asection *sec;
+  const char *sec_name = get_elf_backend_data (abfd)->obj_attrs_section;
+  sec = bfd_make_section_with_flags (abfd,
+                                    sec_name,
+                                    (SEC_READONLY
+                                     | SEC_HAS_CONTENTS
+                                     | SEC_DATA));
+  if (sec == NULL)
+    info->callbacks->fatal (_("%P: failed to create %s section\n"), sec_name);
+
+  if (!bfd_set_section_alignment (sec, 2))
+    info->callbacks->fatal (_("%pA: failed to align section\n"), sec);
+
+  elf_section_type (sec) = get_elf_backend_data (abfd)->obj_attrs_section_type;
+
+  bfd_set_section_size (sec, bfd_elf_obj_attr_size (abfd));
+
+  return sec;
 }
 
 /* Translate GNU properties that have object attributes v2 equivalents.  */