[Buildroot] [PATCH] toolchain: add gdb wrapper that automatically passes the gdbinit file

Thomas De Schampheleire patrickdepinguin at gmail.com
Tue Feb 2 15:23:16 UTC 2016


On Tue, Feb 2, 2016 at 3:20 PM, Thomas De Schampheleire
<patrickdepinguin at gmail.com> wrote:
> From: Thomas De Schampheleire <thomas.de.schampheleire at gmail.com>
>
> Buildroot already provided a gdbinit file to set the right sysroot, but
> required users to pass this file explicitly when invoking gdb.
>
> Make the process a bit more user-friendly by creating a gdb wrapper that
> passes the gdbinit file to the real gdb program.
>
> The code needs to take into account several cases (internal toolchain,
> external toolchain, ...) because the name and type of the real gdb program
> differs.
>
> The documentation is updated to reflect this change.
>
> Signed-off-by: Thomas De Schampheleire <thomas.de.schampheleire at gmail.com>
> ---
>  docs/manual/using-buildroot-debugger.txt           |  7 +++--
>  package/gdb/gdb.mk                                 |  2 +-
>  toolchain/helpers.mk                               | 36 +++++++++++++++++++---
>  toolchain/toolchain-external/toolchain-external.mk | 10 +++---
>  4 files changed, 42 insertions(+), 13 deletions(-)
>
> diff --git a/docs/manual/using-buildroot-debugger.txt b/docs/manual/using-buildroot-debugger.txt
> index b5063ca..8422229 100644
> --- a/docs/manual/using-buildroot-debugger.txt
> +++ b/docs/manual/using-buildroot-debugger.txt
> @@ -35,7 +35,7 @@ Then, on the host, you should start the cross gdb using the following
>  command line:
>
>  ----------------------------
> -<buildroot>/output/host/usr/bin/<tuple>-gdb -x <buildroot>/output/staging/usr/share/buildroot/gdbinit foo
> +<buildroot>/output/host/usr/bin/<tuple>-gdb foo
>  ----------------------------
>
>  Of course, +foo+ must be available in the current directory, built
> @@ -43,8 +43,9 @@ with debugging symbols. Typically you start this command from the
>  directory where +foo+ is built (and not from +output/target/+ as the
>  binaries in that directory are stripped).
>
> -The +<buildroot>/output/staging/usr/share/buildroot/gdbinit+ file will tell the
> -cross gdb where to find the libraries of the target.
> +Since Buildroot 2016.02, the above gdb program is actually a wrapper script
> +that passes a gdbinit file. The gdbinit file tells the cross gdb where to find
> +the libraries of the target.
>
>  Finally, to connect to the target from the cross gdb:
>
> diff --git a/package/gdb/gdb.mk b/package/gdb/gdb.mk
> index 3b0f501..1bafe7e 100644
> --- a/package/gdb/gdb.mk
> +++ b/package/gdb/gdb.mk
> @@ -184,7 +184,7 @@ endef
>
>  HOST_GDB_POST_INSTALL_HOOKS += HOST_GDB_ADD_SYMLINK
>
> -HOST_GDB_POST_INSTALL_HOOKS += gen_gdbinit_file
> +HOST_GDB_POST_INSTALL_HOOKS += setup_gdb_wrapper
>
>  $(eval $(autotools-package))
>  $(eval $(host-autotools-package))
> diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk
> index 02cc0bb..592a551 100644
> --- a/toolchain/helpers.mk
> +++ b/toolchain/helpers.mk
> @@ -421,8 +421,36 @@ check_unusable_toolchain = \
>         fi
>
>  #
> -# Generate gdbinit file for use with Buildroot
> -#
> -gen_gdbinit_file = \
> +# Create a gdb wrapper that sources a minimal gdbinit file. We don't need to
> +# create a gdbtui wrapper because that one actually calls gdb.
> +# For internal toolchains:
> +# - if BR2_PACKAGE_HOST_GDB is set, gdb is built by buildroot and a real file at
> +#   $(TARGET_CROSS)gdb ( == $(HOST_DIR)/usr/bin/$(GNU_TARGET_NAME)-gdb )
> +# For external toolchains:
> +# - if BR2_PACKAGE_HOST_GDB is not set, gdb is provided by the external
> +#   toolchain and $(TARGET_CROSS)gdb is a symlink.
> +# - if BR2_PACKAGE_HOST_GDB is set, gdb is built by buildroot and a real file at
> +#   $(HOST_DIR)/usr/bin/$(GNU_TARGET_NAME)-gdb
> +#
> +define setup_gdb_wrapper
>         mkdir -p $(STAGING_DIR)/usr/share/buildroot/ ; \
> -       echo "set sysroot $(STAGING_DIR)" > $(STAGING_DIR)/usr/share/buildroot/gdbinit
> +       echo "set sysroot $(STAGING_DIR)" > $(STAGING_DIR)/usr/share/buildroot/gdbinit ; \
> +       if [ -f $(TARGET_CROSS)gdb -a ! -e $(TARGET_CROSS)gdb.real ]; then \
> +               gdb_wrapper=$(TARGET_CROSS)gdb ; \
> +               real_gdb=$${gdb_wrapper}.real ; \
> +               mv $${gdb_wrapper} $${real_gdb} ; \
> +       elif [ -L $(TARGET_CROSS)gdb ]; then \
> +               gdb_wrapper=$(TARGET_CROSS)gdb ; \
> +               real_gdb=`readlink -f $(TARGET_CROSS)gdb`; \
> +               rm $(TARGET_CROSS)gdb ; \

should this have a '-f' statement? In my testing it was not needed,
but I don't know if there are other cases...

> +       elif [ -f $(HOST_DIR)/usr/bin/$(GNU_TARGET_NAME)-gdb ]; then \
> +               gdb_wrapper=$(HOST_DIR)/usr/bin/$(GNU_TARGET_NAME)-gdb ; \
> +               real_gdb=$${gdb_wrapper}.real ; \
> +               mv $${gdb_wrapper} $${real_gdb} ; \
> +       fi ; \
> +       if [ -n "$${gdb_wrapper}" ]; then \
> +               echo "#!/bin/sh" > $${gdb_wrapper} ; \
> +               echo "$${real_gdb} -x $(STAGING_DIR)/usr/share/buildroot/gdbinit \$$@" >> $${gdb_wrapper} ; \
> +               chmod +x $${gdb_wrapper} ; \
> +       fi
> +endef
> diff --git a/toolchain/toolchain-external/toolchain-external.mk b/toolchain/toolchain-external/toolchain-external.mk
> index 518afd6..9b6cef8 100644
> --- a/toolchain/toolchain-external/toolchain-external.mk
> +++ b/toolchain/toolchain-external/toolchain-external.mk
> @@ -727,12 +727,12 @@ define TOOLCHAIN_EXTERNAL_INSTALL_WRAPPER
>  endef
>
>  #
> -# Generate gdbinit file for use with Buildroot
> +# Generate gdb wrapper and gdbinit file for use with Buildroot
>  #
> -define TOOLCHAIN_EXTERNAL_INSTALL_GDBINIT
> +define TOOLCHAIN_EXTERNAL_INSTALL_GDB_WRAPPER
>         $(Q)if test -f $(TARGET_CROSS)gdb ; then \
> -               $(call MESSAGE,"Installing gdbinit"); \
> -               $(gen_gdbinit_file); \
> +               $(call MESSAGE,"Creating gdb wrapper and gdbinit file"); \
> +               $(setup_gdb_wrapper); \
>         fi
>  endef
>
> @@ -756,7 +756,7 @@ define TOOLCHAIN_EXTERNAL_INSTALL_STAGING_CMDS
>         $(TOOLCHAIN_EXTERNAL_CREATE_STAGING_LIB_SYMLINK)
>         $(TOOLCHAIN_EXTERNAL_INSTALL_SYSROOT_LIBS)
>         $(TOOLCHAIN_EXTERNAL_INSTALL_WRAPPER)
> -       $(TOOLCHAIN_EXTERNAL_INSTALL_GDBINIT)
> +       $(TOOLCHAIN_EXTERNAL_INSTALL_GDB_WRAPPER)
>  endef
>
>  # Even though we're installing things in both the staging, the host
> --
> 2.4.10
>



More information about the buildroot mailing list