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
#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
*/
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,