backtrace: The BFD API changed in newer versions

This commit is contained in:
Tobias Brunner 2021-05-05 11:37:21 +02:00
parent 1de13f9037
commit f0a20dd2b8
2 changed files with 34 additions and 3 deletions

View 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

View 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,