[PATCH] Limit BFD_SUPPORTS_PLUGINS check to plugin.h and targets.c
Alan Modra
amodra@gmail.com
Mon Aug 18 22:25:40 GMT 2025
On Mon, Aug 18, 2025 at 06:16:19AM -0700, H.J. Lu wrote:
> Minimize the BFD_SUPPORTS_PLUGINS check to make code more readable and
> maintainable by:
>
> 1. Update bfd/plugin.h to define plugin functions as static inline if
> BFD_SUPPORTS_PLUGINS is 0.
> 2. Add get_plugin_target to return "plugin" if plugin is enabled.
> 3. Remove BFD_SUPPORTS_PLUGINS check from all bfd and binutils files
> except plugin.h and targets.c.
> 4. Replace the remaining BFD_SUPPORTS_PLUGINS checks with a function so
> that plugin availability is checked at run time.
You neglected to compile this on a target that disables plugins, like
i386-msdos.
OK with the following on top of your patch, and the plugin.c changelog
entry corrected. I put back the #if BFD_SUPPORTS_PLUGINS in plugin.c
so that unused code is not compiled into libbfd with
--enable-targets=all (and so that --disable-plugins would catch errors
like the plugin_vec reference in format.c).
diff --git a/bfd/format.c b/bfd/format.c
index b2cf416e0e2..81f29c5f54f 100644
--- a/bfd/format.c
+++ b/bfd/format.c
@@ -516,18 +516,17 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
have target_defaulted false. Failing that, bfd_find_target will
have chosen a default target, and target_defaulted will be true. */
fail_targ = NULL;
- if (abfd->format == bfd_object
+ if (bfd_plugin_enabled ()
+ && abfd->format == bfd_object
&& abfd->target_defaulted
&& !abfd->is_linker_input
&& abfd->plugin_format != bfd_plugin_no)
{
- extern const bfd_target plugin_vec;
-
if (bfd_seek (abfd, 0, SEEK_SET) != 0)
goto err_ret;
- BFD_ASSERT (save_targ != &plugin_vec);
- abfd->xvec = &plugin_vec;
+ BFD_ASSERT (save_targ != bfd_plugin_vec ());
+ abfd->xvec = bfd_plugin_vec ();
bfd_set_error (bfd_error_no_error);
cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
if (cleanup)
diff --git a/bfd/plugin.c b/bfd/plugin.c
index 393011432a8..5e5a0b70a04 100644
--- a/bfd/plugin.c
+++ b/bfd/plugin.c
@@ -21,6 +21,8 @@
#include "sysdep.h"
#include "bfd.h"
+#if BFD_SUPPORTS_PLUGINS
+
#include <assert.h>
#ifdef HAVE_DLFCN_H
#include <dlfcn.h>
@@ -656,16 +658,6 @@ bfd_link_plugin_object_p (bfd *abfd)
return false;
}
-extern const bfd_target plugin_vec;
-
-/* Return TRUE if TARGET is a pointer to plugin_vec. */
-
-bool
-bfd_plugin_target_p (const bfd_target *target)
-{
- return target == &plugin_vec;
-}
-
/* Register OBJECT_P to be used by bfd_plugin_object_p. */
void
@@ -1030,3 +1022,4 @@ const bfd_target plugin_vec =
NULL /* backend_data. */
};
+#endif /* BFD_SUPPORTS_PLUGINS */
diff --git a/bfd/plugin.h b/bfd/plugin.h
index d78186ba7f6..f16c45c8fa0 100644
--- a/bfd/plugin.h
+++ b/bfd/plugin.h
@@ -27,10 +27,22 @@ struct ld_plugin_input_file;
void bfd_plugin_set_program_name (const char *);
int bfd_plugin_open_input (bfd *, struct ld_plugin_input_file *);
void bfd_plugin_set_plugin (const char *);
-bool bfd_plugin_target_p (const bfd_target *);
bool bfd_link_plugin_object_p (bfd *);
void register_ld_plugin_object_p (bfd_cleanup (*object_p) (bfd *, bool));
void bfd_plugin_close_file_descriptor (bfd *, int);
+
+static inline const bfd_target *
+bfd_plugin_vec (void)
+{
+ extern const bfd_target plugin_vec;
+ return &plugin_vec;
+}
+
+static inline bool
+bfd_plugin_target_p (const bfd_target *target)
+{
+ return target == bfd_plugin_vec ();
+}
#else
static inline void
bfd_plugin_set_program_name (const char *name ATTRIBUTE_UNUSED)
@@ -49,12 +61,6 @@ bfd_plugin_set_plugin (const char *p ATTRIBUTE_UNUSED)
{
}
-static inline bool
-bfd_plugin_target_p (const bfd_target *target ATTRIBUTE_UNUSED)
-{
- return false;
-}
-
static inline bool
bfd_link_plugin_object_p (bfd *abfd ATTRIBUTE_UNUSED)
{
@@ -72,6 +78,18 @@ bfd_plugin_close_file_descriptor (bfd *abfd ATTRIBUTE_UNUSED,
int fd ATTRIBUTE_UNUSED)
{
}
+
+static inline const bfd_target *
+bfd_plugin_vec (void)
+{
+ return NULL;
+}
+
+static inline bool
+bfd_plugin_target_p (const bfd_target *target ATTRIBUTE_UNUSED)
+{
+ return false;
+}
#endif
#endif
--
Alan Modra
More information about the Binutils
mailing list