[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