diff --git a/gdb/Makefile.in b/gdb/Makefile.in index fc0c56564c2..7654fb1aa04 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -907,13 +907,22 @@ ALL_TARGET_OBS = \ vax-tdep.o \ windows-tdep.o \ x86-tdep.o \ - xcoffread.o \ xstormy16-tdep.o \ xtensa-config.o \ xtensa-linux-tdep.o \ xtensa-tdep.o \ z80-tdep.o +# Object files for reading specific types of debug information. +coff_SRCS = coffread.c coff-pe-read.c +dbx_SRCS = dbxread.c +elf_SRCS = elfread.c stap-probe.c dtrace-probe.c +macho_SRCS = machoread.c +mips_SRCS = mipsread.c +xcoff_SRCS = xcoffread.c +FORMAT_SRCS = @FORMAT_SRCS@ +FORMAT_OBS = $(patsubst %.c,%.o,$(FORMAT_SRCS)) + # The following native-target dependent variables are defined on # configure.nat. NAT_FILE = @NAT_FILE@ @@ -1070,8 +1079,6 @@ COMMON_SFILES = \ c-varobj.c \ charset.c \ cli-out.c \ - coff-pe-read.c \ - coffread.c \ complaints.c \ completer.c \ copying.c \ @@ -1085,7 +1092,6 @@ COMMON_SFILES = \ d-lang.c \ d-namespace.c \ d-valprint.c \ - dbxread.c \ dcache.c \ debug.c \ debuginfod-support.c \ @@ -1150,7 +1156,6 @@ COMMON_SFILES = \ memtag.c \ minidebug.c \ minsyms.c \ - mipsread.c \ namespace.c \ objc-lang.c \ objfiles.c \ @@ -1243,7 +1248,6 @@ SFILES = \ d-exp.y \ dtrace-probe.c \ elf-none-tdep.c \ - elfread.c \ f-exp.y \ gcore-elf.c \ gdb.c \ @@ -1870,7 +1874,6 @@ ALLDEPFILES = \ x86-gnu-nat.c \ x86-nat.c \ x86-tdep.c \ - xcoffread.c \ xstormy16-tdep.c \ xtensa-config.c \ xtensa-linux-nat.c \ @@ -1925,7 +1928,8 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \ $(patsubst %.c,%.o,$(COMMON_SFILES)) \ $(SUBDIR_CLI_OBS) \ $(SUBDIR_MI_OBS) \ - $(SUBDIR_TARGET_OBS) + $(SUBDIR_TARGET_OBS) \ + $(FORMAT_OBS) SUBDIRS = doc @subdirs@ data-directory CLEANDIRS = $(SUBDIRS) diff --git a/gdb/NEWS b/gdb/NEWS index 4c9aed421bb..a8c17318d7e 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -224,6 +224,17 @@ vFile:stat * Support for stabs debugging format and the a.out/dbx object format is deprecated, and will be removed in GDB 18. +* Configure changes + +--enable-binary-file-formats=[FORMAT,...] +--enable-binary-file-formats=all + A user can now decide to only compile support for certain file formats. + The available formats at this point are: dbx, coff, xcoff, elf, mach-o + and mips. Some targets require specific file formats to be available, + and in such cases, the configure script will warn the user and add + support anyway. By default, all formats will be compiled in, to + continue the behavior from before adding the switch. + * A new configure option was added, allowing support for the compile subsystem to be disabled at configure time, in the form of --disable-gdb-compile. diff --git a/gdb/README b/gdb/README index eca4181c751..5dc2e7e7ad3 100644 --- a/gdb/README +++ b/gdb/README @@ -417,6 +417,30 @@ more obscure GDB `configure' options are not listed here. There is no convenient way to generate a list of all available targets. +`--enable-binary-file-formats=FORMAT,FORMAT,...' +`--enable-binary-file-formats=all' + Configure GDB to only be be able to read selected file formats. + The special value "all" causes all file formats to be compiled + in, and is the the default behavior of the option. This option + is meant for advanced users who are sure of what they expect, + if you are unsure which options you will need on your debugging + sessions, we recommend that you not use this feature. The + accepted options are: + * coff: Main format on Windows systems, this is required to + compile with windows target support; + * dbx (also known as a.out): Legacy file format, this is + recommended if you know you will be dealing with this + file format; + * elf: Main format on Linux systems, this is heavily + recommended when compiling with linux support; + * macho: Main format on MacOS systems, this is heavily + recommended when compiling for those targets; + * mips (also known as ecoff): Main file format for targets + running on MIPS CPUs, this is heavily recommended when + supporting those targets; + * xcoff: Main format on AIX systems, this is required to + compile for AIX targets and rs6000 CPUs. + `--with-gdb-datadir=PATH' Set the GDB-specific data directory. GDB will look here for certain supporting files or scripts. This defaults to the `gdb' diff --git a/gdb/config.in b/gdb/config.in index 149aeaf979b..efc3100cb9e 100644 --- a/gdb/config.in +++ b/gdb/config.in @@ -745,6 +745,9 @@ /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS +/* Which binary file formats were requested at configure time. */ +#undef SUPPORTED_BINARY_FILE_FORMATS + /* automatically load a system-wide gdbinit file */ #undef SYSTEM_GDBINIT diff --git a/gdb/configure b/gdb/configure index 8fc3b04efbf..cdea00f8675 100755 --- a/gdb/configure +++ b/gdb/configure @@ -706,6 +706,7 @@ LIBGUI LTLIBLZMA LIBLZMA HAVE_LIBLZMA +FORMAT_SRCS SER_HARDWIRE WERROR_CFLAGS WARN_CFLAGS @@ -932,6 +933,7 @@ with_relocated_sources with_auto_load_dir with_auto_load_safe_path enable_targets +enable_binary_file_formats enable_gdb_mdebug_support enable_gdb_dwarf_support with_amd_dbgapi @@ -1645,6 +1647,10 @@ Optional Features: --disable-nls do not use Native Language Support --enable-targets=TARGETS alternative target configurations + --enable-binary-file-formats=FORMATS + enable support for selected file formats (default + 'all') available formats: coff, dbx, elf, macho, + mips, xcoff, all --enable-gdb-mdebug-support Enable support for the mdebug debuginfo format (default 'yes') @@ -11507,7 +11513,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11510 "configure" +#line 11516 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11613,7 +11619,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11616 "configure" +#line 11622 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -24882,6 +24888,18 @@ esac fi +# Check whether --enable-binary_file_formats was given. +if test "${enable_binary_file_formats+set}" = set; then : + enableval=$enable_binary_file_formats; case "${enableval}" in + yes | "") as_fn_error $? "enable-binary-file-formats option must specify file formats or 'all'" "$LINENO" 5 + ;; + no) enable_binary_file_formats= ;; + *) enable_binary_file_formats=$enableval ;; +esac +else + enable_binary_file_formats=all +fi + # Check whether to support mdebug/ecoff debug information. # Check whether --enable-gdb-mdebug-support was given. @@ -24986,10 +25004,21 @@ TARGET_OBS= all_targets= HAVE_NATIVE_GCORE_TARGET= +# File formats that will be enabled based on the selected +# target(s). These are chosen because they are required to +# compile one or more of the selected targets. +target_formats= + +# If all targets were requested, this is all formats that should +# accompany them. These are just the ones required for compilation +# to succeed, not the formats suggested based on targets. +all_target_formats="coff xcoff" + for targ_alias in `echo $target_alias $enable_targets | sed 's/,/ /g'` do if test "$targ_alias" = "all"; then all_targets=true + target_formats=$all_target_formats else # Canonicalize the secondary target names. result=`$ac_config_sub $targ_alias 2>/dev/null` @@ -31628,6 +31657,12 @@ fi # Note that WIN32APILIBS is set by GDB_AC_COMMON. WIN32LIBS="$WIN32LIBS $WIN32APILIBS" +# Object files to be used when building with support for all file formats. +# This should not have elf or macho, as support for those formats depends +# on BFD enabling them as well. +all_binary_file_srcs="\$(dbx_SRCS) \$(mips_SRCS) \$(coff_SRCS) \$(xcoff_SRCS)" + +bfd_supports_elf=no # Add ELF support to GDB, but only if BFD includes ELF support. OLD_CFLAGS=$CFLAGS @@ -31645,7 +31680,7 @@ WIN32LIBS="$WIN32LIBS $WIN32APILIBS" CC="./libtool --quiet --mode=link $CC" { $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 ${gdb_cv_var_elf+:} false; then : +if ${gdb_cv_var_bfd_elf+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -31664,24 +31699,23 @@ return bfd_get_elf_phdr_upper_bound (NULL); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - gdb_cv_var_elf=yes + gdb_cv_var_bfd_elf=yes else - gdb_cv_var_elf=no + gdb_cv_var_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: $gdb_cv_var_elf" >&5 -$as_echo "$gdb_cv_var_elf" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gdb_cv_var_bfd_elf" >&5 +$as_echo "$gdb_cv_var_bfd_elf" >&6; } CC=$OLD_CC CFLAGS=$OLD_CFLAGS LDFLAGS=$OLD_LDFLAGS LIBS=$OLD_LIBS -if test "$gdb_cv_var_elf" = yes; then - CONFIG_OBS="$CONFIG_OBS elfread.o stap-probe.o dtrace-probe.o \ - gcore-elf.o elf-none-tdep.o" +if test "$gdb_cv_var_bfd_elf" = yes; then + CONFIG_OBS="$CONFIG_OBS gcore-elf.o elf-none-tdep.o" $as_echo "#define HAVE_ELF 1" >>confdefs.h @@ -31744,9 +31778,12 @@ if test "$ac_res" != no; then : fi fi + bfd_supports_elf=yes + all_binary_file_srcs="$all_binary_file_srcs \$(elf_SRCS)" fi # Add macho support to GDB, but only if BFD includes it. +bfd_supports_macho=no OLD_CFLAGS=$CFLAGS OLD_LDFLAGS=$LDFLAGS @@ -31763,7 +31800,7 @@ fi CC="./libtool --quiet --mode=link $CC" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mach-O support in BFD" >&5 $as_echo_n "checking for Mach-O support in BFD... " >&6; } -if ${gdb_cv_var_macho+:} false; then : +if ${gdb_cv_var_bfd_macho+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -31782,30 +31819,81 @@ return bfd_mach_o_lookup_command (NULL, 0, NULL); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - gdb_cv_var_macho=yes + gdb_cv_var_bfd_macho=yes else - gdb_cv_var_macho=no + gdb_cv_var_bfd_macho=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: $gdb_cv_var_macho" >&5 -$as_echo "$gdb_cv_var_macho" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gdb_cv_var_bfd_macho" >&5 +$as_echo "$gdb_cv_var_bfd_macho" >&6; } CC=$OLD_CC CFLAGS=$OLD_CFLAGS LDFLAGS=$OLD_LDFLAGS LIBS=$OLD_LIBS -if test "$gdb_cv_var_macho" = yes; then - CONFIG_OBS="$CONFIG_OBS machoread.o" +if test "$gdb_cv_var_bfd_macho" = yes; then + bfd_supports_macho=yes + all_binary_file_srcs="$all_binary_file_srcs \$(macho_SRCS)" fi +FORMAT_SRCS= + +if test "$enable_binary_file_formats" != "all"; then + # Formats that are required by some requested target(s). + # Warn users that they are added, so no one is surprised. + for req in $target_formats; do + case ,$enable_binary_file_formats, in + *,$req,*) + # Do nothing. + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"$req is required to support one or more requested targets. Adding it\"" >&5 +$as_echo "$as_me: WARNING: \"$req is required to support one or more requested targets. Adding it\"" >&2;} + enable_binary_file_formats="${enable_binary_file_formats},$req" + ;; + esac + done + + +cat >>confdefs.h <<_ACEOF +#define SUPPORTED_BINARY_FILE_FORMATS "$enable_binary_file_formats" +_ACEOF + +fi + +enable_binary_file_formats=$(echo $enable_binary_file_formats | sed 's/,/ /g') + +# Go through all requested and required binary file formats to compile +# GDB, and double check that we can compile them. +for format in $enable_binary_file_formats +do + if test "$format" = "elf" && test "$bfd_supports_elf" != "yes"; then + as_fn_error but BFD does not support it." "\"elf support was requested" "$LINENO" 5; + elif test "$format" = "macho" && test "$bfd_supports_macho" != "yes"; then + as_fn_error but BFD does not support it." "\"Mach-O support was requested" "$LINENO" 5; + fi + + if test "$format" = "all"; then + FORMAT_SRCS="$all_binary_file_srcs" + # We don't break here in case the user requested Mach-O or ELF, but + # BFD is not configured to support it. If we were to break, we would + # silently drop the requested support instead of erroring out. + else + fmt=$(echo "$format _SRCS" | sed 's/ //') + FORMAT_SRCS="$FORMAT_SRCS \$($fmt)" + fi +done + + + # Add any host-specific objects to GDB. CONFIG_OBS="${CONFIG_OBS} ${gdb_host_obs}" # If building on ELF, look for lzma support for embedded compressed debug info. -if test "$gdb_cv_var_elf" = yes; then +if test "$gdb_cv_var_bfd_elf" = yes; then # Check whether --with-lzma was given. if test "${with_lzma+set}" = set; then : diff --git a/gdb/configure.ac b/gdb/configure.ac index 226e27e4fe5..2ef53fe5c56 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -191,6 +191,16 @@ AS_HELP_STRING([--enable-targets=TARGETS], [alternative target configurations]), ;; esac]) +AC_ARG_ENABLE(binary_file_formats, + AS_HELP_STRING([--enable-binary-file-formats=FORMATS], + [enable support for selected file formats (default 'all') + available formats: coff, dbx, elf, macho, mips, xcoff, all]), +[case "${enableval}" in + yes | "") AC_MSG_ERROR(enable-binary-file-formats option must specify file formats or 'all') + ;; + no) enable_binary_file_formats= ;; + *) enable_binary_file_formats=$enableval ;; +esac], [enable_binary_file_formats=all]) # Check whether to support mdebug/ecoff debug information. AC_ARG_ENABLE(gdb-mdebug-support, @@ -240,10 +250,21 @@ TARGET_OBS= all_targets= HAVE_NATIVE_GCORE_TARGET= +# File formats that will be enabled based on the selected +# target(s). These are chosen because they are required to +# compile one or more of the selected targets. +target_formats= + +# If all targets were requested, this is all formats that should +# accompany them. These are just the ones required for compilation +# to succeed, not the formats suggested based on targets. +all_target_formats="coff xcoff" + for targ_alias in `echo $target_alias $enable_targets | sed 's/,/ /g'` do if test "$targ_alias" = "all"; then all_targets=true + target_formats=$all_target_formats else # Canonicalize the secondary target names. result=`$ac_config_sub $targ_alias 2>/dev/null` @@ -1952,32 +1973,87 @@ fi # Note that WIN32APILIBS is set by GDB_AC_COMMON. WIN32LIBS="$WIN32LIBS $WIN32APILIBS" +# Object files to be used when building with support for all file formats. +# This should not have elf or macho, as support for those formats depends +# on BFD enabling them as well. +all_binary_file_srcs="\$(dbx_SRCS) \$(mips_SRCS) \$(coff_SRCS) \$(xcoff_SRCS)" + +bfd_supports_elf=no # Add ELF support to GDB, but only if BFD includes ELF support. -GDB_AC_CHECK_BFD([for ELF support in BFD], gdb_cv_var_elf, +GDB_AC_CHECK_BFD([for ELF support in BFD], gdb_cv_var_bfd_elf, [bfd_get_elf_phdr_upper_bound (NULL)], elf-bfd.h) -if test "$gdb_cv_var_elf" = yes; then - CONFIG_OBS="$CONFIG_OBS elfread.o stap-probe.o dtrace-probe.o \ - gcore-elf.o elf-none-tdep.o" +if test "$gdb_cv_var_bfd_elf" = yes; then + CONFIG_OBS="$CONFIG_OBS gcore-elf.o elf-none-tdep.o" AC_DEFINE(HAVE_ELF, 1, [Define if ELF support should be included.]) # -ldl is provided by bfd/Makefile.am (LIBDL) . if test "$plugins" = "yes"; then AC_SEARCH_LIBS(dlopen, dl) fi + bfd_supports_elf=yes + all_binary_file_srcs="$all_binary_file_srcs \$(elf_SRCS)" fi # Add macho support to GDB, but only if BFD includes it. -GDB_AC_CHECK_BFD([for Mach-O support in BFD], gdb_cv_var_macho, +bfd_supports_macho=no +GDB_AC_CHECK_BFD([for Mach-O support in BFD], gdb_cv_var_bfd_macho, [bfd_mach_o_lookup_command (NULL, 0, NULL)], mach-o.h) -if test "$gdb_cv_var_macho" = yes; then - CONFIG_OBS="$CONFIG_OBS machoread.o" +if test "$gdb_cv_var_bfd_macho" = yes; then + bfd_supports_macho=yes + all_binary_file_srcs="$all_binary_file_srcs \$(macho_SRCS)" fi +FORMAT_SRCS= + +if test "$enable_binary_file_formats" != "all"; then + # Formats that are required by some requested target(s). + # Warn users that they are added, so no one is surprised. + for req in $target_formats; do + case ,$enable_binary_file_formats, in + *,$req,*) + # Do nothing. + ;; + *) + AC_MSG_WARN("$req is required to support one or more requested targets. Adding it") + enable_binary_file_formats="${enable_binary_file_formats},$req" + ;; + esac + done + + AC_DEFINE_UNQUOTED(SUPPORTED_BINARY_FILE_FORMATS, "$enable_binary_file_formats", + Which binary file formats were requested at configure time. ) +fi + +enable_binary_file_formats=$(echo $enable_binary_file_formats | sed 's/,/ /g') + +# Go through all requested and required binary file formats to compile +# GDB, and double check that we can compile them. +for format in $enable_binary_file_formats +do + if test "$format" = "elf" && test "$bfd_supports_elf" != "yes"; then + AC_MSG_ERROR("elf support was requested, but BFD does not support it."); + elif test "$format" = "macho" && test "$bfd_supports_macho" != "yes"; then + AC_MSG_ERROR("Mach-O support was requested, but BFD does not support it."); + fi + + if test "$format" = "all"; then + FORMAT_SRCS="$all_binary_file_srcs" + # We don't break here in case the user requested Mach-O or ELF, but + # BFD is not configured to support it. If we were to break, we would + # silently drop the requested support instead of erroring out. + else + fmt=$(echo "$format _SRCS" | sed 's/ //') + FORMAT_SRCS="$FORMAT_SRCS \$($fmt)" + fi +done + +AC_SUBST(FORMAT_SRCS) + # Add any host-specific objects to GDB. CONFIG_OBS="${CONFIG_OBS} ${gdb_host_obs}" # If building on ELF, look for lzma support for embedded compressed debug info. -if test "$gdb_cv_var_elf" = yes; then +if test "$gdb_cv_var_bfd_elf" = yes; then AC_ARG_WITH(lzma, AS_HELP_STRING([--with-lzma], [support lzma compression (auto/yes/no)]), [], [with_lzma=auto]) diff --git a/gdb/configure.tgt b/gdb/configure.tgt index 255c77e9f8c..332f5b7513c 100644 --- a/gdb/configure.tgt +++ b/gdb/configure.tgt @@ -505,7 +505,7 @@ powerpc-*-openbsd*) ;; powerpc-*-aix* | rs6000-*-* | powerpc64-*-aix*) # Target: PowerPC running AIX - gdb_target_obs="rs6000-tdep.o rs6000-aix-tdep.o xcoffread.o \ + gdb_target_obs="rs6000-tdep.o rs6000-aix-tdep.o \ ppc-sysv-tdep.o solib-aix.o \ ravenscar-thread.o ppc-ravenscar-thread.o" ;; @@ -522,8 +522,8 @@ powerpc*-*-linux*) powerpc-*-lynx*178) # Target: PowerPC running Lynx178. gdb_target_obs="rs6000-tdep.o rs6000-lynx178-tdep.o \ - xcoffread.o ppc-sysv-tdep.o \ - ravenscar-thread.o ppc-ravenscar-thread.o" + ppc-sysv-tdep.o ravenscar-thread.o \ + ppc-ravenscar-thread.o" ;; powerpc*-*-*) # Target: PowerPC running eabi @@ -835,3 +835,17 @@ for t in x ${gdb_target_obs}; do gdb_have_gcore=true fi done + +# Decide which file formats are absolutely required based on +# the requested targets. Warn later that they are added, in +# case the user didn't manually request them, or all readers. +# It's fine to add the same format multiple times since the +# loop that reads the options to FORMAT_OBS will ensure that +# they are only added once. +for i in $gdb_target_obs; do + case "${i}" in + *"windows-tdep.o" ) target_formats="${target_formats} coff";; + "rs6000-aix-tdep.o" ) target_formats="${target_formats} xcoff";; + "rs6000-lynx178-tdep.o" ) target_formats="${target_formats} xcoff";; + esac +done diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 2bbaf14c584..d4a5a632c24 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -41277,6 +41277,14 @@ Configure @value{GDBN} for cross-debugging programs running on the specified list of targets. The special value @samp{all} configures @value{GDBN} for debugging programs running on any target it supports. +@item --enable-binary-file-formats=@r{[}@var{format}@r{]}@dots{} +@itemx --enable-binary-file-formats=all +Configure @value{GDBN} to support certain binary file formats. If a +format is the main (or only) file format for a given target, the +configure script may add support to it anyway, and warn the user. +If not given, all file formats that @value{GDBN} supports are compiled +in. + @item --with-gdb-datadir=@var{path} Set the @value{GDBN}-specific data directory. @value{GDBN} will look here for certain supporting files or scripts. This defaults to the diff --git a/gdb/top.c b/gdb/top.c index b097683e613..933efa03f90 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -1596,6 +1596,11 @@ This GDB was configured as follows:\n\ --with-system-gdbinit-dir=%s%s\n\ "), SYSTEM_GDBINIT_DIR, SYSTEM_GDBINIT_DIR_RELOCATABLE ? " (relocatable)" : ""); +#ifdef SUPPORTED_BINARY_FILE_FORMATS + gdb_printf (stream, _("\ + --enable-binary-file-formats=%s\n"), SUPPORTED_BINARY_FILE_FORMATS); +#endif + /* We assume "relocatable" will be printed at least once, thus we always print this text. It's a reasonably safe assumption for now. */ gdb_printf (stream, _("\n\