Fix libctf build on non-ELF targets.

All machinery works as on ELF, except for automatic loading of ELF
string and symbol tables in the BFD-style open machinery.

        * Makefile.def (dependencies): configure-libctf depends on all-bfd
        and all its deps.
        * Makefile.in: Regenerated.

libctf/
        * configure.in: Check for bfd_section_from_elf_index.
        * configure: Regenerate.
        * config.h.in [HAVE_BFD_ELF]: Likewise.
        * libctf/ctf_open_bfd (ctf_bfdopen_ctfsect): Use it.
        abfd is potentially unused now.
This commit is contained in:
Nick Alcock 2019-05-29 11:11:37 +02:00 committed by Jose E. Marchesi
parent 90f879191c
commit 9698cf9b1c
8 changed files with 195 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2019-05-28 Nick Alcock <nick.alcock@oracle.com>
* Makefile.def (dependencies): configure-libctf depends on all-bfd
and all its deps.
* Makefile.in: Regenerated.
2019-05-28 Nick Alcock <nick.alcock@oracle.com>
* MAINTAINERS: Add libctf.

View File

@ -522,6 +522,11 @@ dependencies = { module=all-fastjar; on=all-libiberty; };
dependencies = { module=all-libctf; on=all-libiberty; hard=true; };
dependencies = { module=all-libctf; on=all-bfd; };
dependencies = { module=all-libctf; on=all-zlib; };
// So that checking for ELF support in BFD from libctf configure is possible.
dependencies = { module=configure-libctf; on=all-bfd; };
dependencies = { module=configure-libctf; on=all-intl; };
dependencies = { module=configure-libctf; on=all-zlib; };
dependencies = { module=configure-libctf; on=all-libiconv; };
// Warning, these are not well tested.
dependencies = { module=all-bison; on=all-intl; };

View File

@ -50930,6 +50930,34 @@ all-stage3-libctf: maybe-all-stage3-zlib
all-stage4-libctf: maybe-all-stage4-zlib
all-stageprofile-libctf: maybe-all-stageprofile-zlib
all-stagefeedback-libctf: maybe-all-stagefeedback-zlib
configure-libctf: maybe-all-bfd
configure-stage1-libctf: maybe-all-stage1-bfd
configure-stage2-libctf: maybe-all-stage2-bfd
configure-stage3-libctf: maybe-all-stage3-bfd
configure-stage4-libctf: maybe-all-stage4-bfd
configure-stageprofile-libctf: maybe-all-stageprofile-bfd
configure-stagefeedback-libctf: maybe-all-stagefeedback-bfd
configure-libctf: maybe-all-intl
configure-stage1-libctf: maybe-all-stage1-intl
configure-stage2-libctf: maybe-all-stage2-intl
configure-stage3-libctf: maybe-all-stage3-intl
configure-stage4-libctf: maybe-all-stage4-intl
configure-stageprofile-libctf: maybe-all-stageprofile-intl
configure-stagefeedback-libctf: maybe-all-stagefeedback-intl
configure-libctf: maybe-all-zlib
configure-stage1-libctf: maybe-all-stage1-zlib
configure-stage2-libctf: maybe-all-stage2-zlib
configure-stage3-libctf: maybe-all-stage3-zlib
configure-stage4-libctf: maybe-all-stage4-zlib
configure-stageprofile-libctf: maybe-all-stageprofile-zlib
configure-stagefeedback-libctf: maybe-all-stagefeedback-zlib
configure-libctf: maybe-all-libiconv
configure-stage1-libctf: maybe-all-stage1-libiconv
configure-stage2-libctf: maybe-all-stage2-libiconv
configure-stage3-libctf: maybe-all-stage3-libiconv
configure-stage4-libctf: maybe-all-stage4-libiconv
configure-stageprofile-libctf: maybe-all-stageprofile-libiconv
configure-stagefeedback-libctf: maybe-all-stagefeedback-libiconv
all-bison: maybe-all-build-texinfo
all-flex: maybe-all-build-bison
all-flex: maybe-all-m4

View File

@ -1,3 +1,11 @@
2019-05-28 Nick Alcock <nick.alcock@oracle.com>
* configure.in: Check for bfd_section_from_elf_index.
* configure: Regenerate.
* config.h.in [HAVE_BFD_ELF]: Likewise.
* libctf/ctf_open_bfd (ctf_bfdopen_ctfsect): Use it.
abfd is potentially unused now.
2019-05-28 Nick Alcock <nick.alcock@oracle.com>
* Makefile.am: New.

View File

@ -1,5 +1,8 @@
/* config.h.in. Generated from configure.ac by autoheader. */
/* Whether libbfd was configured for an ELF target. */
#undef HAVE_BFD_ELF
/* Define to 1 if you have the <byteswap.h> header file. */
#undef HAVE_BYTESWAP_H

108
libctf/configure vendored
View File

@ -5974,6 +5974,114 @@ $as_echo "#define HAVE_MMAP 1" >>confdefs.h
fi
rm -f conftest.mmap conftest.txt
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5
$as_echo_n "checking for library containing dlopen... " >&6; }
if ${ac_cv_search_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
;
return 0;
}
_ACEOF
for ac_lib in '' dl; do
if test -z "$ac_lib"; then
ac_res="none required"
else
ac_res=-l$ac_lib
LIBS="-l$ac_lib $ac_func_search_save_LIBS"
fi
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_search_dlopen=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext
if ${ac_cv_search_dlopen+:} false; then :
break
fi
done
if ${ac_cv_search_dlopen+:} false; then :
else
ac_cv_search_dlopen=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5
$as_echo "$ac_cv_search_dlopen" >&6; }
ac_res=$ac_cv_search_dlopen
if test "$ac_res" != no; then :
test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
fi
# Similar to GDB_AC_CHECK_BFD.
OLD_CFLAGS=$CFLAGS
OLD_LDFLAGS=$LDFLAGS
OLD_LIBS=$LIBS
# Put the old CFLAGS/LDFLAGS last, in case the user's (C|LD)FLAGS
# points somewhere with bfd, with -I/foo/lib and -L/foo/lib. We
# always want our bfd.
CFLAGS="-I${srcdir}/../include -I../bfd -I${srcdir}/../bfd $CFLAGS"
ZLIBDIR=`echo $zlibdir | sed 's,\$(top_builddir)/,,g'`
LDFLAGS="-L../bfd -L../libiberty $ZLIBDIR $LDFLAGS"
intl=`echo $LIBINTL | sed 's,${top_builddir}/,,g'`
LIBS="-lbfd -liberty -lz $intl $LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ELF support in BFD" >&5
$as_echo_n "checking for ELF support in BFD... " >&6; }
if ${ac_cv_libctf_bfd_elf+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdlib.h>
#include "bfd.h"
#include "elf-bfd.h"
int
main ()
{
(void) bfd_section_from_elf_index (NULL, 0);
return 0;
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_libctf_bfd_elf=yes
else
ac_cv_libctf_bfd_elf=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libctf_bfd_elf" >&5
$as_echo "$ac_cv_libctf_bfd_elf" >&6; }
CFLAGS=$OLD_CFLAGS
LDFLAGS=$OLD_LDFLAGS
LIBS=$OLD_LIBS
if test $ac_cv_libctf_bfd_elf = yes; then
$as_echo "#define HAVE_BFD_ELF 1" >>confdefs.h
fi
for ac_header in byteswap.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "byteswap.h" "ac_cv_header_byteswap_h" "$ac_includes_default"

View File

@ -55,6 +55,37 @@ AM_MAINTAINER_MODE
ACX_PROG_CC_WARNING_OPTS([-Wall], [ac_libctf_warn_cflags])
AC_FUNC_MMAP
AC_SEARCH_LIBS(dlopen, dl)
# Similar to GDB_AC_CHECK_BFD.
OLD_CFLAGS=$CFLAGS
OLD_LDFLAGS=$LDFLAGS
OLD_LIBS=$LIBS
# Put the old CFLAGS/LDFLAGS last, in case the user's (C|LD)FLAGS
# points somewhere with bfd, with -I/foo/lib and -L/foo/lib. We
# always want our bfd.
CFLAGS="-I${srcdir}/../include -I../bfd -I${srcdir}/../bfd $CFLAGS"
ZLIBDIR=`echo $zlibdir | sed 's,\$(top_builddir)/,,g'`
LDFLAGS="-L../bfd -L../libiberty $ZLIBDIR $LDFLAGS"
intl=`echo $LIBINTL | sed 's,${top_builddir}/,,g'`
LIBS="-lbfd -liberty -lz $intl $LIBS"
AC_CACHE_CHECK([for ELF support in BFD], ac_cv_libctf_bfd_elf,
[AC_TRY_LINK([#include <stdlib.h>
#include "bfd.h"
#include "elf-bfd.h"],
[(void) bfd_section_from_elf_index (NULL, 0);
return 0;],
[ac_cv_libctf_bfd_elf=yes],
[ac_cv_libctf_bfd_elf=no])])
CFLAGS=$OLD_CFLAGS
LDFLAGS=$OLD_LDFLAGS
LIBS=$OLD_LIBS
if test $ac_cv_libctf_bfd_elf = yes; then
AC_DEFINE([HAVE_BFD_ELF], 1,
[Whether libbfd was configured for an ELF target.])
fi
AC_CHECK_HEADERS(byteswap.h)
AC_CHECK_FUNCS(pread)

View File

@ -119,7 +119,8 @@ ctf_bfdopen (struct bfd *abfd, int *errp)
later. */
ctf_archive_t *
ctf_bfdopen_ctfsect (struct bfd *abfd, const ctf_sect_t *ctfsect, int *errp)
ctf_bfdopen_ctfsect (struct bfd *abfd _libctf_unused_,
const ctf_sect_t *ctfsect, int *errp)
{
struct ctf_archive *arc = NULL;
ctf_archive_t *arci;
@ -129,6 +130,7 @@ ctf_bfdopen_ctfsect (struct bfd *abfd, const ctf_sect_t *ctfsect, int *errp)
const char *bfderrstr = NULL;
int is_archive;
#ifdef HAVE_BFD_ELF
asection *sym_asect;
ctf_sect_t symsect, strsect;
/* TODO: handle SYMTAB_SHNDX. */
@ -178,6 +180,7 @@ ctf_bfdopen_ctfsect (struct bfd *abfd, const ctf_sect_t *ctfsect, int *errp)
symsectp = &symsect;
}
}
#endif
if (ctfsect->cts_size > sizeof (uint64_t) &&
((*(uint64_t *) ctfsect->cts_data) == CTFA_MAGIC))
@ -203,9 +206,11 @@ ctf_bfdopen_ctfsect (struct bfd *abfd, const ctf_sect_t *ctfsect, int *errp)
if (arci)
return arci;
err_free_sym:
#ifdef HAVE_BFD_ELF
free ((void *) symsect.cts_data);
err_free_str:
free ((void *) strsect.cts_data);
#endif
err: _libctf_unused_;
if (bfderrstr)
{