[PATCH v8 10/19] bfd: add support for copying Object Attributes v2

Matthieu Longo matthieu.longo@arm.com
Tue Jul 15 11:39:13 GMT 2025


The OAv2 section's content of the source file is copied to the
destination object file without any alteration of the attributes
or subsections (no deduplication nor sorting of subsections or
object attributes is performed).
For now, only ELF format is supported.
---
 bfd/elf-attrs.c | 54 +++++++++++++++++++++++++++++++++++++------------
 1 file changed, 41 insertions(+), 13 deletions(-)

diff --git a/bfd/elf-attrs.c b/bfd/elf-attrs.c
index 9fea83a097f..93105697b01 100644
--- a/bfd/elf-attrs.c
+++ b/bfd/elf-attrs.c
@@ -728,9 +728,9 @@ bfd_elf_add_obj_attr_int_string (bfd *abfd,
   return elf_add_obj_attr_int_string (abfd, vendor, tag, i, s, NULL);
 }
 
-/* Copy the object attributes from IBFD to OBFD.  */
-void
-_bfd_elf_copy_obj_attributes (bfd *ibfd, bfd *obfd)
+/* Copy object attributes v1 from IBFD to OBFD.  */
+static void
+oav1_copy_attributes (bfd *ibfd, bfd *obfd)
 {
   obj_attribute *in_attr;
   obj_attribute *out_attr;
@@ -738,16 +738,6 @@ _bfd_elf_copy_obj_attributes (bfd *ibfd, bfd *obfd)
   int i;
   obj_attr_vendor_t vendor;
 
-  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
-      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
-    return;
-
-  obj_attr_version_t version = elf_obj_attr_version (ibfd);
-  elf_obj_attr_version (obfd) = version;
-
-  if (version == OBJ_ATTR_VERSION_NONE)
-    return;
-
   for (vendor = OBJ_ATTR_FIRST; vendor <= OBJ_ATTR_LAST; vendor++)
     {
       in_attr
@@ -797,6 +787,44 @@ _bfd_elf_copy_obj_attributes (bfd *ibfd, bfd *obfd)
     }
 }
 
+/* Copy object attributes v2 from IBFD to OBFD.  */
+static void
+oav2_copy_attributes (bfd *ibfd, bfd *obfd)
+{
+  obj_attr_subsection_list *in_attr_subsecs = &elf_obj_attr_subsections (ibfd);
+  obj_attr_subsection_list *out_attr_subsecs = &elf_obj_attr_subsections (obfd);
+
+  for (obj_attr_subsection_v2 *isubsec = in_attr_subsecs->first;
+       isubsec != NULL;
+       isubsec = isubsec->next)
+    {
+      obj_attr_subsection_v2 *osubsec
+	  = _bfd_elf_obj_attr_subsection_v2_copy (isubsec);
+      LINKED_LIST_APPEND(obj_attr_subsection_v2) (out_attr_subsecs, osubsec);
+    }
+}
+
+/* Copy the object attributes from IBFD to OBFD.  */
+void
+_bfd_elf_copy_obj_attributes (bfd *ibfd, bfd *obfd)
+{
+  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
+      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
+    return;
+
+  obj_attr_version_t version = elf_obj_attr_version (ibfd);
+  elf_obj_attr_version (obfd) = version;
+
+  if (version == OBJ_ATTR_VERSION_NONE)
+    return;
+  else if (version == OBJ_ATTR_V1)
+    oav1_copy_attributes (ibfd, obfd);
+  else if (version == OBJ_ATTR_V2)
+    oav2_copy_attributes (ibfd, obfd);
+  else
+    abort ();
+}
+
 /* Determine whether a GNU object attribute tag takes an integer, a
    string or both.  */
 static int
-- 
2.50.1



More information about the Binutils mailing list