diff options
author | Nick Alcock <nick.alcock@oracle.com> | 2019-05-29 11:11:37 +0200 |
---|---|---|
committer | Jose E. Marchesi <jose.marchesi@oracle.com> | 2019-05-29 11:11:37 +0200 |
commit | 9698cf9b1c485edbbeabc9f65bfd0fdef92e3854 (patch) | |
tree | 5dbe117ab7f582cb95faec5ce3b183c7d6397155 /libctf | |
parent | 90f879191c1bc8455527f66fb4ab46873aa870aa (diff) | |
download | fsf-binutils-gdb-9698cf9b1c485edbbeabc9f65bfd0fdef92e3854.zip fsf-binutils-gdb-9698cf9b1c485edbbeabc9f65bfd0fdef92e3854.tar.gz fsf-binutils-gdb-9698cf9b1c485edbbeabc9f65bfd0fdef92e3854.tar.bz2 |
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.
Diffstat (limited to 'libctf')
-rw-r--r-- | libctf/ChangeLog | 8 | ||||
-rw-r--r-- | libctf/config.h.in | 3 | ||||
-rwxr-xr-x | libctf/configure | 108 | ||||
-rw-r--r-- | libctf/configure.ac | 31 | ||||
-rw-r--r-- | libctf/ctf-open-bfd.c | 7 |
5 files changed, 156 insertions, 1 deletions
diff --git a/libctf/ChangeLog b/libctf/ChangeLog index a4fd3b1..879aeed 100644 --- a/libctf/ChangeLog +++ b/libctf/ChangeLog @@ -1,5 +1,13 @@ 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. * Makefile.in: Regenerated. * config.h.in: Likewise. diff --git a/libctf/config.h.in b/libctf/config.h.in index 8d87b3d..8292010 100644 --- a/libctf/config.h.in +++ b/libctf/config.h.in @@ -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 diff --git a/libctf/configure b/libctf/configure index 2213393..1c03401 100755 --- a/libctf/configure +++ b/libctf/configure @@ -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" diff --git a/libctf/configure.ac b/libctf/configure.ac index 2d0cf86..2df1093 100644 --- a/libctf/configure.ac +++ b/libctf/configure.ac @@ -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) diff --git a/libctf/ctf-open-bfd.c b/libctf/ctf-open-bfd.c index d6d442e..5e34d12 100644 --- a/libctf/ctf-open-bfd.c +++ b/libctf/ctf-open-bfd.c @@ -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) { |