[PATCH v1] bfd/ELF: fix BFD library build --enable-shared

Matthieu Longo matthieu.longo@arm.com
Thu Jan 22 19:04:37 GMT 2026


The patch series that added support for Object Attributes v2 introduced
regressions when building the BFD library as a shared object.

Incorrect usages of ATTRIBUTE_HIDDEN caused the following link-time errors:

/usr/bin/ld: config/obj-elf-attr.o: in function `obj_attr_v2_record':
obj-elf-attr.c: undefined reference to `bfd_elf_obj_attr_v2_init'
obj-elf-attr.c: undefined reference to `_bfd_obj_attr_v2_find_by_tag'
obj-elf-attr.c: undefined reference to `obj_attr_v2_t_append'
/usr/bin/ld: config/obj-elf-attr.o: in function `obj_attr_v2_subsection_record':
obj-elf-attr.c: undefined reference to `obj_attr_subsection_v2_t_append'
obj-elf-attr.c: undefined reference to `obj_attr_subsection_v2_t_remove'
obj-elf-attr.c: undefined reference to `obj_attr_subsection_v2_t_append'

This patch fixes the symbol visibility so that the BFD library links
correctly when built with --enable-shared.
---
 bfd/elf-attrs.c           | 32 +++++++++++++++++++++++++++++---
 bfd/elf-bfd.h             | 39 +++++++++++++++++++++++++++++++--------
 bfd/elfnn-aarch64.c       |  2 +-
 bfd/elfxx-aarch64.c       |  6 +++---
 gas/config/obj-elf-attr.c |  2 +-
 5 files changed, 65 insertions(+), 16 deletions(-)

diff --git a/bfd/elf-attrs.c b/bfd/elf-attrs.c
index 0dcff17e874..40a4561b959 100644
--- a/bfd/elf-attrs.c
+++ b/bfd/elf-attrs.c
@@ -3193,7 +3193,7 @@ _bfd_elf_obj_attr_v2_cmp (const obj_attr_v2_t *a1, const obj_attr_v2_t *a2)
    This allows an early return if we find a higher numbered tag.  */
 
 obj_attr_v2_t *
-_bfd_obj_attr_v2_find_by_tag (const obj_attr_subsection_v2_t *subsec,
+bfd_obj_attr_v2_find_by_tag (const obj_attr_subsection_v2_t *subsec,
 			      obj_attr_tag_t tag,
 			      bool sorted)
 {
@@ -3214,8 +3214,21 @@ _bfd_obj_attr_v2_find_by_tag (const obj_attr_subsection_v2_t *subsec,
    implemented with a merge sort.
    See more details in libiberty/doubly-linked-list.h  */
 
-LINKED_LIST_MUTATIVE_OPS_DECL (obj_attr_subsection_v2_t,
+LINKED_LIST_DEFN_APPEND(obj_attr_subsection_v2_t,
+			obj_attr_v2_t, /* extern */)
+LINKED_LIST_DEFN_PREPEND(obj_attr_subsection_v2_t,
+			 obj_attr_v2_t, /* extern */)
+LINKED_LIST_DEFN_INSERT_BEFORE(obj_attr_subsection_v2_t,
 			       obj_attr_v2_t, /* extern */)
+LINKED_LIST_DEFN_POP_FRONT(obj_attr_subsection_v2_t,
+			   obj_attr_v2_t, /* extern */)
+LINKED_LIST_DEFN_POP_BACK(obj_attr_subsection_v2_t,
+			  obj_attr_v2_t, /* extern */)
+LINKED_LIST_DEFN_REMOVE(obj_attr_subsection_v2_t,
+			obj_attr_v2_t, /* extern */)
+LINKED_LIST_DEFN_SWAP(obj_attr_subsection_v2_t,
+		      obj_attr_v2_t, /* extern */)
+
 LINKED_LIST_MERGE_SORT_DECL (obj_attr_subsection_v2_t,
 			     obj_attr_v2_t, /* extern */)
 
@@ -3360,8 +3373,21 @@ bfd_obj_attr_subsection_v2_find_by_name (obj_attr_subsection_v2_t *first,
    implemented with a merge sort.
    See more details in libiberty/doubly-linked-list.h  */
 
-LINKED_LIST_MUTATIVE_OPS_DECL (obj_attr_subsection_list_t,
+LINKED_LIST_DEFN_APPEND(obj_attr_subsection_list_t,
+			obj_attr_subsection_v2_t, /* extern */)
+LINKED_LIST_DEFN_PREPEND(obj_attr_subsection_list_t,
+			 obj_attr_subsection_v2_t, /* extern */)
+LINKED_LIST_DEFN_INSERT_BEFORE(obj_attr_subsection_list_t,
 			       obj_attr_subsection_v2_t, /* extern */)
+LINKED_LIST_DEFN_POP_FRONT(obj_attr_subsection_list_t,
+			   obj_attr_subsection_v2_t, /* extern */)
+LINKED_LIST_DEFN_POP_BACK(obj_attr_subsection_list_t,
+			  obj_attr_subsection_v2_t, /* extern */)
+LINKED_LIST_DEFN_REMOVE(obj_attr_subsection_list_t,
+			obj_attr_subsection_v2_t, /* extern */)
+LINKED_LIST_DEFN_SWAP(obj_attr_subsection_list_t,
+		      obj_attr_subsection_v2_t, /* extern */)
+
 LINKED_LIST_MERGE_SORT_DECL (obj_attr_subsection_list_t,
 			     obj_attr_subsection_v2_t, /* extern */)
 
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index f368986dd05..ec57ad7c9a4 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -3214,17 +3214,29 @@ extern bool _bfd_elf_read_notes
   (bfd *, file_ptr, bfd_size_type, size_t) ATTRIBUTE_HIDDEN;
 
 extern obj_attr_v2_t *bfd_elf_obj_attr_v2_init (obj_attr_tag_t,
-  union obj_attr_value_v2) ATTRIBUTE_HIDDEN;
+  union obj_attr_value_v2);
 extern void _bfd_elf_obj_attr_v2_free (obj_attr_v2_t *, obj_attr_encoding_v2_t)
   ATTRIBUTE_HIDDEN;
 extern obj_attr_v2_t *_bfd_elf_obj_attr_v2_copy (const obj_attr_v2_t *,
   obj_attr_encoding_v2_t) ATTRIBUTE_HIDDEN;
 extern int _bfd_elf_obj_attr_v2_cmp (const obj_attr_v2_t *,
   const obj_attr_v2_t *) ATTRIBUTE_HIDDEN;
-extern obj_attr_v2_t * _bfd_obj_attr_v2_find_by_tag
-  (const obj_attr_subsection_v2_t *, obj_attr_tag_t, bool) ATTRIBUTE_HIDDEN;
-LINKED_LIST_MUTATIVE_OPS_PROTOTYPE (obj_attr_subsection_v2_t,
-				    obj_attr_v2_t, ATTRIBUTE_HIDDEN);
+extern obj_attr_v2_t * bfd_obj_attr_v2_find_by_tag
+  (const obj_attr_subsection_v2_t *, obj_attr_tag_t, bool);
+LINKED_LIST_DECL_APPEND(obj_attr_subsection_v2_t,
+			obj_attr_v2_t, extern);
+LINKED_LIST_DECL_PREPEND(obj_attr_subsection_v2_t,
+			 obj_attr_v2_t, ATTRIBUTE_HIDDEN);
+LINKED_LIST_DECL_INSERT_BEFORE(obj_attr_subsection_v2_t,
+			       obj_attr_v2_t, ATTRIBUTE_HIDDEN);
+LINKED_LIST_DECL_POP_FRONT(obj_attr_subsection_v2_t,
+			   obj_attr_v2_t, ATTRIBUTE_HIDDEN);
+LINKED_LIST_DECL_POP_BACK(obj_attr_subsection_v2_t,
+			  obj_attr_v2_t, ATTRIBUTE_HIDDEN);
+LINKED_LIST_DECL_REMOVE(obj_attr_subsection_v2_t,
+			obj_attr_v2_t, ATTRIBUTE_HIDDEN);
+LINKED_LIST_DECL_SWAP(obj_attr_subsection_v2_t,
+		      obj_attr_v2_t, ATTRIBUTE_HIDDEN);
 LINKED_LIST_MERGE_SORT_PROTOTYPE_ (obj_attr_v2_t, ATTRIBUTE_HIDDEN);
 LINKED_LIST_MERGE_SORT_PROTOTYPE (obj_attr_subsection_v2_t,
 				  obj_attr_v2_t, ATTRIBUTE_HIDDEN);
@@ -3239,9 +3251,20 @@ extern obj_attr_subsection_v2_t *bfd_obj_attr_subsection_v2_find_by_name
   (obj_attr_subsection_v2_t *, const char *, bool);
 extern obj_attr_subsection_scope_v2_t bfd_elf_obj_attr_subsection_v2_scope
   (const bfd *, const char *);
-LINKED_LIST_MUTATIVE_OPS_PROTOTYPE (obj_attr_subsection_list_t,
-				    obj_attr_subsection_v2_t,
-				    ATTRIBUTE_HIDDEN);
+LINKED_LIST_DECL_APPEND(obj_attr_subsection_list_t,
+			obj_attr_subsection_v2_t, extern);
+LINKED_LIST_DECL_PREPEND(obj_attr_subsection_list_t,
+			 obj_attr_subsection_v2_t, ATTRIBUTE_HIDDEN);
+LINKED_LIST_DECL_INSERT_BEFORE(obj_attr_subsection_list_t,
+			       obj_attr_subsection_v2_t, ATTRIBUTE_HIDDEN);
+LINKED_LIST_DECL_POP_FRONT(obj_attr_subsection_list_t,
+			   obj_attr_subsection_v2_t, ATTRIBUTE_HIDDEN);
+LINKED_LIST_DECL_POP_BACK(obj_attr_subsection_list_t,
+			  obj_attr_subsection_v2_t, ATTRIBUTE_HIDDEN);
+LINKED_LIST_DECL_REMOVE(obj_attr_subsection_list_t,
+			obj_attr_subsection_v2_t, extern);
+LINKED_LIST_DECL_SWAP(obj_attr_subsection_list_t,
+		      obj_attr_subsection_v2_t, ATTRIBUTE_HIDDEN);
 LINKED_LIST_MERGE_SORT_PROTOTYPE_ (obj_attr_subsection_v2_t, ATTRIBUTE_HIDDEN);
 LINKED_LIST_MERGE_SORT_PROTOTYPE (obj_attr_subsection_list_t,
 				  obj_attr_subsection_v2_t, ATTRIBUTE_HIDDEN);
diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index 78bab74c197..08077fb74f8 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -10632,7 +10632,7 @@ elfNN_aarch64_link_setup_object_attributes (struct bfd_link_info *info)
   if (aeabi_feature_and_bits_subsec != NULL)
     {
       const obj_attr_v2_t *attr_bti
-	= _bfd_obj_attr_v2_find_by_tag (aeabi_feature_and_bits_subsec,
+	= bfd_obj_attr_v2_find_by_tag (aeabi_feature_and_bits_subsec,
 					Tag_Feature_BTI, true);
       if (attr_bti && attr_bti->val.uint == 1)
 	tdata->sw_protections.plt_type |= PLT_BTI;
diff --git a/bfd/elfxx-aarch64.c b/bfd/elfxx-aarch64.c
index c09e8521333..3864c204c98 100644
--- a/bfd/elfxx-aarch64.c
+++ b/bfd/elfxx-aarch64.c
@@ -956,7 +956,7 @@ obj_attr_v2_record_tag_value (obj_attr_subsection_v2_t *subsec,
 			      bool value)
 {
   obj_attr_v2_t *attr;
-  attr = _bfd_obj_attr_v2_find_by_tag (subsec, tag, false);
+  attr = bfd_obj_attr_v2_find_by_tag (subsec, tag, false);
   if (attr != NULL)
     {
       if (attr->val.uint != value)
@@ -1175,11 +1175,11 @@ aarch64_check_pauthabi_attributes (const struct bfd_link_info *info)
   int version_id = 0;
 
   const obj_attr_v2_t *attr
-    = _bfd_obj_attr_v2_find_by_tag (subsec, Tag_PAuth_Platform, true);
+    = bfd_obj_attr_v2_find_by_tag (subsec, Tag_PAuth_Platform, true);
   if (attr != NULL)
     platform_id = attr->val.uint;
 
-  attr = _bfd_obj_attr_v2_find_by_tag (subsec, Tag_PAuth_Schema, true);
+  attr = bfd_obj_attr_v2_find_by_tag (subsec, Tag_PAuth_Schema, true);
   if (attr != NULL)
     version_id = attr->val.uint;
 
diff --git a/gas/config/obj-elf-attr.c b/gas/config/obj-elf-attr.c
index 7a4493d673c..fc354bfa7e9 100644
--- a/gas/config/obj-elf-attr.c
+++ b/gas/config/obj-elf-attr.c
@@ -1063,7 +1063,7 @@ obj_attr_v2_record (obj_attr_tag_t key, arg_t *arg_val)
   /* Go over the list of already recorded attributes and check for
      redefinitions (which are forbidden).  */
   bool skip_recording = false;
-  obj_attr_v2_t *recorded_attr = _bfd_obj_attr_v2_find_by_tag
+  obj_attr_v2_t *recorded_attr = bfd_obj_attr_v2_find_by_tag
     (elf_obj_attr_subsections (stdoutput).last, obj_attr->tag, false);
   if (recorded_attr != NULL)
     {
-- 
2.52.0



More information about the Binutils mailing list