backtrace: The BFD API changed in newer versions
authorTobias Brunner <tobias@strongswan.org>
Wed, 5 May 2021 09:37:21 +0000 (11:37 +0200)
committerTobias Brunner <tobias@strongswan.org>
Wed, 5 May 2021 14:17:54 +0000 (16:17 +0200)
configure.ac
src/libstrongswan/utils/backtrace.c

index bc1099c..61a6a92 100644 (file)
@@ -1271,6 +1271,11 @@ if test x$bfd_backtraces = xtrue; then
        AC_CHECK_LIB([bfd],[bfd_init],[LIBS="$LIBS"],[AC_MSG_ERROR([binutils libbfd not found!])],[])
        AC_CHECK_HEADER([bfd.h],[AC_DEFINE([HAVE_BFD_H],,[have binutils bfd.h])],
                [AC_MSG_ERROR([binutils bfd.h header not found!])])
+       AC_CHECK_DECLS(
+               [bfd_section_flags, bfd_get_section_flags,
+                bfd_section_vma, bfd_get_section_vma,
+                bfd_section_size, bfd_get_section_size], [], [],
+               [[#include <bfd.h>]])
        BFDLIB="-lbfd"
        AC_SUBST(BFDLIB)
 fi
index 146f91c..788fc6b 100644 (file)
@@ -144,6 +144,32 @@ void backtrace_deinit()
 #include <collections/hashtable.h>
 #include <threading/mutex.h>
 
+/* interface changes for newer BFD versions, note that older versions declared
+ * some of the new functions as macros but with different arguments */
+#if HAVE_DECL_BFD_GET_SECTION_FLAGS
+#define get_section_flags(a, s) bfd_get_section_flags(a, s)
+#elif HAVE_DECL_BFD_SECTION_FLAGS
+#define get_section_flags(a, s) bfd_section_flags(s)
+#else
+#error Unknown BFD API
+#endif
+
+#if HAVE_DECL_BFD_GET_SECTION_VMA
+#define get_section_vma(a, s) bfd_get_section_vma(a, s)
+#elif HAVE_DECL_BFD_SECTION_VMA
+#define get_section_vma(a, s) bfd_section_vma(s)
+#else
+#error Unknown BFD API
+#endif
+
+#if HAVE_DECL_BFD_GET_SECTION_SIZE
+#define get_section_size bfd_get_section_size
+#elif HAVE_DECL_BFD_SECTION_SIZE
+#define get_section_size bfd_section_size
+#else
+#error Unknown BFD API
+#endif
+
 /**
  * Hashtable-cached bfd handle
  */
@@ -248,12 +274,12 @@ static void find_addr(bfd *abfd, asection *section, bfd_find_data_t *data)
        char fbuf[512] = "", sbuf[512] = "";
        u_int line;
 
-       if (!data->found || (bfd_get_section_flags(abfd, section) & SEC_ALLOC) != 0)
+       if (!data->found || (get_section_flags(abfd, section) & SEC_ALLOC) != 0)
        {
-               vma = bfd_get_section_vma(abfd, section);
+               vma = get_section_vma(abfd, section);
                if (data->vma >= vma)
                {
-                       size = bfd_get_section_size(section);
+                       size = get_section_size(section);
                        if (data->vma < vma + size)
                        {
                                data->found = bfd_find_nearest_line(abfd, section,