Commit: Do not build libctf for non-ELF targets

Message ID 87o93l7dsq.fsf@redhat.com
State New
Headers show
Series
  • Commit: Do not build libctf for non-ELF targets
Related show

Commit Message

Nick Clifton May 29, 2019, 10:31 a.m.
Hi Guys,

  I just noticed this morning that the new libctf library does not build
  for non-ELF based targets.  So I am applying the patch below to fix
  this issue.  Ideally I would like a better way to detect non-ELF
  targets, but for now I am using just a simple list of known triples.

Cheers
  Nick

./ChangeLog
2019-05-29  Nick Clifton  <nickc@redhat.com>

	* configure.ac (noconfigdirs): Add libctf if the target does not use
	the ELF file format.
	* configure: Regenerate.

binutils/ChangeLog
2019-05-29  Nick Clifton  <nickc@redhat.com>

	* configure.ac (LIBCTF): Export.  Set to empty for non-ELF based
	targets.
	(HAVE_LIBCTF): Define if libctf support is available.
	* Makefile.am (LIBCTF): Set value to @LIBCTF@.
	* objdump.c: Make CTF code conditional upon HAVE_LIBCTF being
	defined.
	* readelf.c: Likewise.
	* configure: Regenerate.
	* Makefile.in: Regenerate.
	* config.in: Regenerate.

Comments

Nix May 29, 2019, 12:28 p.m. | #1
On 29 May 2019, Nick Clifton said:

> Hi Guys,

>

>   I just noticed this morning that the new libctf library does not build

>   for non-ELF based targets.  So I am applying the patch below to fix

>   this issue.  Ideally I would like a better way to detect non-ELF

>   targets, but for now I am using just a simple list of known triples.


We just pushed a fix that arranges that it *does* build on non-ELF
targets with nearly full capabilities (all you lose is the ability to
automatically associate the ELF string and symbol tables with a
newly-opened CTF file, which isn't meaningful on non-ELF anyway), which
means that objdump and readelf keep working with CTF support even on
non-ELF and don't need to change at all. So you can probably revert this
one :)

(btw, the method I used to discern ELFness was stolen from GDB: an
AC_TRY_LINK() against the bfd_*_elf_*() function causing the trouble,
and associated LIBS/LDFLAGS/CFLAGS adjustments and dep changes so we
don't configure libctf before libbfd has finished building.)

-- 
NULL && (void)

Patch

diff --git a/binutils/Makefile.am b/binutils/Makefile.am
index 128494ca9e..c37a5b521d 100644
--- a/binutils/Makefile.am
+++ b/binutils/Makefile.am
@@ -161,7 +161,7 @@  BFDLIB = ../bfd/libbfd.la
 
 OPCODES = ../opcodes/libopcodes.la
 
-LIBCTF = ../libctf/libctf.a
+LIBCTF = @LIBCTF@
 
 LIBIBERTY = ../libiberty/libiberty.a
 
diff --git a/binutils/configure.ac b/binutils/configure.ac
index b1cd4552f2..71be51e6a6 100644
--- a/binutils/configure.ac
+++ b/binutils/configure.ac
@@ -393,6 +393,35 @@  changequote([,])dnl
     fi
 done
 
+
+AC_MSG_CHECKING([for libctf support])
+case "${target}" in
+  *-*-pe | *-*-*vms* | *-*-darwin | *-*-*coff* | *-*-wince | *-*-mingw*)
+    AC_CACHE_VAL(bu_cv_libctf_support, bu_cv_libctf_support=no)
+    ;;
+  *-*-aout | *-*-osf* | *-*-go32 | *-*-macos* | *-*-rhapsody*)
+    AC_CACHE_VAL(bu_cv_libctf_support, bu_cv_libctf_support=no)
+    ;;
+  *-*-netbsdpe | *-*-cygwin* | *-*-pep | *-*-msdos | *-*-winnt)
+    AC_CACHE_VAL(bu_cv_libctf_support, bu_cv_libctf_support=no)
+    ;;
+  ns32k-*-* | pdp11-*-* | *-*-aix* | *-*-netbsdaout)
+    AC_CACHE_VAL(bu_cv_libctf_support, bu_cv_libctf_support=no)
+    ;;
+  *)
+    AC_CACHE_VAL(bu_cv_libctf_support, bu_cv_libctf_support=yes)
+  ;;      
+esac
+AC_MSG_RESULT($bu_cv_libctf_support)
+if test $bu_cv_libctf_support = yes; then
+  AC_DEFINE(HAVE_LIBCTF, 1, [Is libctf available?])
+fi
+LIBCTF=
+if test $bu_cv_libctf_support = yes; then
+  LIBCTF=../libctf/libctf.a
+fi
+
+
 # Uniq objdump private vector, build objdump target ofiles.
 od_files=
 f=""
@@ -449,6 +478,7 @@  AC_SUBST(BUILD_MISC)
 AC_SUBST(BUILD_INSTALL_MISC)
 AC_SUBST(OBJDUMP_DEFS)
 AC_SUBST(OBJDUMP_PRIVATE_OFILES)
+AC_SUBST(LIBCTF)
 
 AC_DEFINE_UNQUOTED(TARGET, "${target}", [Configured target name.])
 
diff --git a/binutils/objdump.c b/binutils/objdump.c
index 156331b502..382ba35855 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -56,7 +56,9 @@ 
 #include "bucomm.h"
 #include "elfcomm.h"
 #include "dwarf.h"
+#ifdef HAVE_LIBCTF
 #include "ctf-api.h"
+#endif
 #include "getopt.h"
 #include "safe-ctype.h"
 #include "dis-asm.h"
@@ -99,9 +101,11 @@  static bfd_boolean with_source_code;	/* -S */
 static int show_raw_insn;		/* --show-raw-insn */
 static int dump_dwarf_section_info;	/* --dwarf */
 static int dump_stab_section_info;	/* --stabs */
+#ifdef HAVE_LIBCTF
 static int dump_ctf_section_info;       /* --ctf */
 static char *dump_ctf_section_name;
 static char *dump_ctf_parent_name;	/* --ctf-parent */
+#endif
 static int do_demangle;			/* -C, --demangle */
 static bfd_boolean disassemble;		/* -d */
 static bfd_boolean disassemble_all;	/* -D */
@@ -228,8 +232,12 @@  usage (FILE *stream, int status)
           =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
           =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
           =addr,=cu_index,=links,=follow-links]\n\
-                           Display DWARF info in the file\n\
-  --ctf=SECTION            Display CTF info from SECTION\n\
+                           Display DWARF info in the file\n"));
+#ifdef HAVE_LIBCTF
+  fprintf (stream, _("\
+  --ctf=SECTION            Display CTF info from SECTION\n"));
+#endif
+  fprintf (stream, _("\
   -t, --syms               Display the contents of the symbol table(s)\n\
   -T, --dynamic-syms       Display the contents of the dynamic symbol table\n\
   -r, --reloc              Display the relocation entries in the file\n\
@@ -278,8 +286,11 @@  usage (FILE *stream, int status)
       --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
                              or deeper\n\
       --dwarf-check          Make additional dwarf internal consistency checks.\
-      \n\
+      \n"));
+#ifdef HAVE_LIBCTF
+      fprintf (stream, _("\
       --ctf-parent=SECTION     Use SECTION as the CTF parent\n\n"));
+#endif
       list_supported_targets (program_name, stream);
       list_supported_architectures (program_name, stream);
 
@@ -314,9 +325,11 @@  enum option_values
     OPTION_DWARF_START,
     OPTION_RECURSE_LIMIT,
     OPTION_NO_RECURSE_LIMIT,
-    OPTION_INLINES,
+#ifdef HAVE_LIBCTF
     OPTION_CTF,
-    OPTION_CTF_PARENT
+    OPTION_CTF_PARENT,
+#endif
+    OPTION_INLINES
   };
 
 static struct option long_options[]=
@@ -359,8 +372,10 @@  static struct option long_options[]=
   {"special-syms", no_argument, &dump_special_syms, 1},
   {"include", required_argument, NULL, 'I'},
   {"dwarf", optional_argument, NULL, OPTION_DWARF},
+#ifdef HAVE_LIBCTF
   {"ctf", required_argument, NULL, OPTION_CTF},
   {"ctf-parent", required_argument, NULL, OPTION_CTF_PARENT},
+#endif
   {"stabs", no_argument, NULL, 'G'},
   {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
   {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
@@ -3199,6 +3214,7 @@  dump_bfd_header (bfd *abfd)
 }
 
 
+#ifdef HAVE_LIBCTF
 /* Formatting callback function passed to ctf_dump.  Returns either the pointer
    it is passed, or a pointer to newly-allocated storage, in which case
    dump_ctf() will free it when it no longer needs it.  */
@@ -3216,6 +3232,7 @@  dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED,
 }
 
 /* Make a ctfsect suitable for ctf_bfdopen_ctfsect().  */
+
 static ctf_sect_t
 make_ctfsect (const char *name, bfd_byte *data,
 	      bfd_size_type size)
@@ -3331,8 +3348,8 @@  dump_ctf (bfd *abfd, const char *sect_name, const char *parent_name)
   free (parentdata);
   free (ctfdata);
 }
+#endif /* HAVE_LIBCTF */
 
-
 static void
 dump_bfd_private_header (bfd *abfd)
 {
@@ -4043,8 +4060,10 @@  dump_bfd (bfd *abfd, bfd_boolean is_mainfile)
     dump_symbols (abfd, TRUE);
   if (dump_dwarf_section_info)
     dump_dwarf (abfd);
+#ifdef HAVE_LIBCTF
   if (dump_ctf_section_info)
     dump_ctf (abfd, dump_ctf_section_name, dump_ctf_parent_name);
+#endif
   if (dump_stab_section_info)
     dump_stabs (abfd);
   if (dump_reloc_info && ! disassemble)
@@ -4484,6 +4503,7 @@  main (int argc, char **argv)
 	case OPTION_DWARF_CHECK:
 	  dwarf_check = TRUE;
 	  break;
+#ifdef HAVE_LIBCTF
         case OPTION_CTF:
           dump_ctf_section_info = TRUE;
           dump_ctf_section_name = xstrdup (optarg);
@@ -4492,6 +4512,7 @@  main (int argc, char **argv)
 	case OPTION_CTF_PARENT:
 	  dump_ctf_parent_name = xstrdup (optarg);
 	  break;
+#endif
 	case 'G':
 	  dump_stab_section_info = TRUE;
 	  seenflag = TRUE;
@@ -4551,9 +4572,10 @@  main (int argc, char **argv)
     }
 
   free_only_list ();
+#ifdef HAVE_LIBCTF
   free (dump_ctf_section_name);
   free (dump_ctf_parent_name);
-
+#endif
   END_PROGRESS (program_name);
 
   return exit_status;
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 5ae58574fb..2615e8bc87 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -60,7 +60,9 @@ 
 #include "bucomm.h"
 #include "elfcomm.h"
 #include "dwarf.h"
+#ifdef HAVE_LIBCTF
 #include "ctf-api.h"
+#endif
 
 #include "elf/common.h"
 #include "elf/external.h"
@@ -184,7 +186,9 @@  typedef struct elf_section_list
 #define DEBUG_DUMP	(1 << 2)	/* The -w command line switch.  */
 #define STRING_DUMP     (1 << 3)	/* The -p command line switch.  */
 #define RELOC_DUMP      (1 << 4)	/* The -R command line switch.  */
+#ifdef HAVE_LIBCTF
 #define CTF_DUMP        (1 << 5)        /* The --ctf command line switch.  */
+#endif
 
 typedef unsigned char dump_type;
 
@@ -251,16 +255,20 @@  static bfd_boolean do_dump = FALSE;
 static bfd_boolean do_version = FALSE;
 static bfd_boolean do_histogram = FALSE;
 static bfd_boolean do_debugging = FALSE;
+#ifdef HAVE_LIBCTF
 static bfd_boolean do_ctf = FALSE;
+#endif
 static bfd_boolean do_arch = FALSE;
 static bfd_boolean do_notes = FALSE;
 static bfd_boolean do_archive_index = FALSE;
 static bfd_boolean is_32bit_elf = FALSE;
 static bfd_boolean decompress_dumps = FALSE;
 
+#ifdef HAVE_LIBCTF
 static char *dump_ctf_parent_name;
 static char *dump_ctf_symtab_name;
 static char *dump_ctf_strtab_name;
+#endif
 
 struct group_list
 {
@@ -4401,10 +4409,12 @@  get_section_type_name (Filedata * filedata, unsigned int sh_type)
 #define OPTION_DWARF_DEPTH	514
 #define OPTION_DWARF_START	515
 #define OPTION_DWARF_CHECK	516
+#ifdef HAVE_LIBCTF
 #define OPTION_CTF_DUMP		517
 #define OPTION_CTF_PARENT	518
 #define OPTION_CTF_SYMBOLS	519
 #define OPTION_CTF_STRINGS	520
+#endif
 
 static struct option options[] =
 {
@@ -4443,11 +4453,13 @@  static struct option options[] =
   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
 
+#ifdef HAVE_LIBCTF
   {"ctf",              required_argument, 0, OPTION_CTF_DUMP},
 
   {"ctf-symbols",      required_argument, 0, OPTION_CTF_SYMBOLS},
   {"ctf-strings",      required_argument, 0, OPTION_CTF_STRINGS},
   {"ctf-parent",       required_argument, 0, OPTION_CTF_PARENT},
+#endif
 
   {"version",	       no_argument, 0, 'v'},
   {"wide",	       no_argument, 0, 'W'},
@@ -4498,6 +4510,7 @@  usage (FILE * stream)
   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
                          or deeper\n"));
+#ifdef HAVE_LIBCTF
   fprintf (stream, _("\
   --ctf=<number|name>    Display CTF info from section <number|name>\n\
   --ctf-parent=<number|name>\n\
@@ -4506,6 +4519,7 @@  usage (FILE * stream)
                          Use section <number|name> as the CTF external symtab\n\n\
   --ctf-strings=<number|name>\n\
                          Use section <number|name> as the CTF external strtab\n\n"));
+#endif
 
 #ifdef SUPPORT_DISASSEMBLY
   fprintf (stream, _("\
@@ -4734,6 +4748,7 @@  parse_args (Filedata * filedata, int argc, char ** argv)
 	case OPTION_DWARF_CHECK:
 	  dwarf_check = TRUE;
 	  break;
+#ifdef HAVE_LIBCTF
 	case OPTION_CTF_DUMP:
 	  do_ctf = TRUE;
 	  request_dump (filedata, CTF_DUMP);
@@ -4747,6 +4762,7 @@  parse_args (Filedata * filedata, int argc, char ** argv)
 	case OPTION_CTF_PARENT:
 	  dump_ctf_parent_name = strdup (optarg);
 	  break;
+#endif
 	case OPTION_DYN_SYMS:
 	  do_dyn_syms = TRUE;
 	  break;
@@ -13808,10 +13824,11 @@  dump_section_as_bytes (Elf_Internal_Shdr *  section,
   return TRUE;
 }
 
+#ifdef HAVE_LIBCTF
 static ctf_sect_t *
 shdr_to_ctf_sect (ctf_sect_t *buf, Elf_Internal_Shdr *shdr, Filedata *filedata)
 {
-  buf->cts_name = SECTION_NAME(shdr);
+  buf->cts_name = SECTION_NAME (shdr);
   buf->cts_type = shdr->sh_type;
   buf->cts_flags = shdr->sh_flags;
   buf->cts_size = shdr->sh_size;
@@ -13964,6 +13981,7 @@  dump_section_as_ctf (Elf_Internal_Shdr * section, Filedata * filedata)
   free (strdata);
   return ret;
 }
+#endif /* HAVE_LIBCTF */
 
 static bfd_boolean
 load_specific_debug_section (enum dwarf_section_display_enum  debug,
@@ -14303,11 +14321,13 @@  process_section_contents (Filedata * filedata)
 	    res = FALSE;
 	}
 
+#ifdef HAVE_LIBCTF
       if (dump & CTF_DUMP)
 	{
 	  if (! dump_section_as_ctf (section, filedata))
 	    res = FALSE;
 	}
+#endif
     }
 
   /* Check to see if the user requested a
@@ -20187,9 +20207,11 @@  main (int argc, char ** argv)
   if (cmdline.dump_sects != NULL)
     free (cmdline.dump_sects);
 
+#ifdef HAVE_LIBCTF
   free (dump_ctf_symtab_name);
   free (dump_ctf_strtab_name);
   free (dump_ctf_parent_name);
+#endif
 
   return err ? EXIT_FAILURE : EXIT_SUCCESS;
 }
diff --git a/configure.ac b/configure.ac
index c84263c516..c205698cd6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -901,6 +901,22 @@  case "${target}" in
     ;;
 esac
 
+# Targets that do not use the ELF file format cannot support libctf.
+case "${target}" in
+  *-*-pe | *-*-*vms* | *-*-darwin | *-*-*coff* | *-*-wince | *-*-mingw*)
+    noconfigdirs="$noconfigdirs libctf"
+    ;;
+  *-*-aout | *-*-osf* | *-*-go32 | *-*-macos* | *-*-rhapsody*)
+    noconfigdirs="$noconfigdirs libctf"
+    ;;
+  *-*-netbsdpe | *-*-cygwin* | *-*-pep | *-*-msdos | *-*-winnt)
+    noconfigdirs="$noconfigdirs libctf"
+    ;;
+  ns32k-*-* | pdp11-*-* | *-*-aix* | *-*-netbsdaout)
+    noconfigdirs="$noconfigdirs libctf"
+    ;;
+esac
+
 case "${target}" in
   *-*-chorusos)
     ;;