Skip to contentSkip to conversation

docs/manual/using-buildroot-debugger: suggest '-ix' iso '-x' when loading gdbinit

PATCH Applied Thomas De Schampheleire 3 participants 7 messages Sep 13, 2021 – Oct 4, 2021

lore
Share & tools
lore
#0 lore raw

PATCH 1/2 docs/manual/using-buildroot-debugger: suggest '-ix' iso '-x' when loading gdbinit

From: Thomas De Schampheleire <[email protected]>

A gdbinit file passed via '-x' will be read _after_ parsing any object/core file passed on the command-line. In cross-compilation context, this is particularly a problem when loading a core file, because without the 'sysroot' specified in the gdbinit file, it will give a lot of warnings, like:

warning: .dynamic section for "/lib/libstdc++.so.6" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/librt.so.1" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libm.so.6" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libgcc_s.so.1" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libc.so.6" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/ld-linux.so.2" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libanl.so.1" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libdl.so.2" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libpthread.so.0" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/usr/lib/libz.so.1" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libnss_files.so.2" is not at the expected address (wrong library or version mismatch?)

warning: Could not load shared library symbols for 17 libraries, e.g. [...] Use the "info sharedlibrary" command to see the complete listing. Do you need "set solib-search-path" or "set sysroot"?

In contrast, the '-ix' option will load the specified gdbinit file _before_ parsing object/core files. This will remove said warnings.

See also: https://sourceware.org/bugzilla/show_bug.cgi?id=28330

---
 docs/manual/using-buildroot-debugger.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
docs/manual/using-buildroot-debugger.txt +1 -1
index d5293beb53..9a8a7dfbaf 100644
@@ -35,7 +35,7 @@ Then, on the host, you should start the cross gdb using the following
 command line:
 
 ----------------------------
-<buildroot>/output/host/bin/<tuple>-gdb -x <buildroot>/output/staging/usr/share/buildroot/gdbinit foo
+<buildroot>/output/host/bin/<tuple>-gdb -ix <buildroot>/output/staging/usr/share/buildroot/gdbinit foo
 ----------------------------
 
 Of course, +foo+ must be available in the current directory, built
Signature · 6 lines
2.32.0

_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot
#1 lore raw

PATCH 2/2 toolchain/helpers.mk: gdbinit: set auto-load-safe-path before sysroot

From: Thomas De Schampheleire <[email protected]>

The gdbinit supplied by Buildroot does two things:
A. specify the sysroot where gdb can find shared libraries
B. mark the sysroot as a 'safe path' for its auto-load feature, to make sure
that pretty printers for libstdc++.so are added automatically (see commit 6fb3216a80c64c08375429d89497eaeec5622150)

When debugging a core file, and the gdbinit file is specified via '-x' rather than '-ix', then the order of these settings matters: If you first set the sysroot, then gdb will immediately start finding the shared libraries it needs for the core file, detect libstdc++ and its associated libstdc++-gdb.py file, then give a big warning about safe paths:

warning: File ".../i686-buildroot-linux-gnu/sysroot/lib/libstdc++.so.6.0.24-gdb.py"
auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
To enable execution of this file add

          add-auto-load-safe-path .../i686-buildroot-linux-gnu/sysroot/lib/libstdc++.so.6.0.24-gdb.py

line to your configuration file "/home/me/.gdbinit".
To completely disable this security protection add
set auto-load safe-path /
line to your configuration file "/home/me/.gdbinit".
For more information about this security protection see the "Auto-loading safe path" section in the GDB manual. E.g., run from the shell:
info "(gdb)Auto-loading safe path"

and the pretty printing code is not loaded. This is because the second line from the gdbinit file was not yet parsed at this point.

By changing the order (first configuring the safe path, then setting the sysroot), this issue does not appear and everything is as expected.

Note that when '-ix' were used instead of '-x' to pass the gdbinit file to gdb, then the order would not matter, because the entire gdbinit file would be parsed before considering the core file.
However, even though the Buildroot manual now suggests '-ix', users may not have noticed this change and continue to use '-x'.

---
 toolchain/helpers.mk | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
toolchain/helpers.mk +2 -2
index 1dfb52ac38..ef8e9a5f64 100644
@@ -481,8 +481,8 @@ check_toolchain_ssp = \
 #
 gen_gdbinit_file = \
 	mkdir -p $(STAGING_DIR)/usr/share/buildroot/ ; \
-	echo "set sysroot $(STAGING_DIR)" > $(STAGING_DIR)/usr/share/buildroot/gdbinit ; \
-	echo "add-auto-load-safe-path $(STAGING_DIR)" >> $(STAGING_DIR)/usr/share/buildroot/gdbinit
+	echo "add-auto-load-safe-path $(STAGING_DIR)" > $(STAGING_DIR)/usr/share/buildroot/gdbinit ; \
+	echo "set sysroot $(STAGING_DIR)" >> $(STAGING_DIR)/usr/share/buildroot/gdbinit
 
 # Given a path, determine the relative prefix (../) needed to return to the
 # root level. Note that the last component is treated as a file component; use a
Signature · 6 lines
2.32.0

_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot
#2 lore raw

Re: [Buildroot] [PATCH 2/2] toolchain/helpers.mk: gdbinit: set auto-load-safe-path before sysroot

Quoted 30 lines · Thomas De Schampheleire

From: Thomas De Schampheleire <[email protected]>

The gdbinit supplied by Buildroot does two things:
A. specify the sysroot where gdb can find shared libraries
B. mark the sysroot as a 'safe path' for its auto-load feature, to make sure
that pretty printers for libstdc++.so are added automatically (see commit 6fb3216a80c64c08375429d89497eaeec5622150)

When debugging a core file, and the gdbinit file is specified via '-x' rather than '-ix', then the order of these settings matters: If you first set the sysroot, then gdb will immediately start finding the shared libraries it needs for the core file, detect libstdc++ and its associated libstdc++-gdb.py file, then give a big warning about safe paths:

warning: File ".../i686-buildroot-linux-gnu/sysroot/lib/libstdc++.so.6.0.24-gdb.py"
auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
To enable execution of this file add

           add-auto-load-safe-path .../i686-buildroot-linux-gnu/sysroot/lib/libstdc++.so.6.0.24-gdb.py

line to your configuration file "/home/me/.gdbinit".
To completely disable this security protection add
set auto-load safe-path /
line to your configuration file "/home/me/.gdbinit".
For more information about this security protection see the "Auto-loading safe path" section in the GDB manual. E.g., run from the shell:
info "(gdb)Auto-loading safe path"

and the pretty printing code is not loaded. This is because the second line from the gdbinit file was not yet parsed at this point.

Quoted 8 lines

By changing the order (first configuring the safe path, then setting the sysroot), this issue does not appear and everything is as expected.

Note that when '-ix' were used instead of '-x' to pass the gdbinit file to gdb, then the order would not matter, because the entire gdbinit file would be parsed before considering the core file.
However, even though the Buildroot manual now suggests '-ix', users may not have noticed this change and continue to use '-x'.

Whaa, excellent, not content with fixing a bug once, you fix it twice!

Applied to master, thanks. :-)

Regards,
Arnout

Quoted 12 lines
---
  toolchain/helpers.mk | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)
toolchain/helpers.mk +0 -0
index 1dfb52ac38..ef8e9a5f64 100644

toolchain/helpers.mk check_toolchain_ssp = \ · line 488

Quoted 10 lines
toolchain/helpers.mk +2 -2
@@ -481,8 +481,8 @@ check_toolchain_ssp = \
  #
  gen_gdbinit_file = \
  	mkdir -p $(STAGING_DIR)/usr/share/buildroot/ ; \
-	echo "set sysroot $(STAGING_DIR)" > $(STAGING_DIR)/usr/share/buildroot/gdbinit ; \
-	echo "add-auto-load-safe-path $(STAGING_DIR)" >> $(STAGING_DIR)/usr/share/buildroot/gdbinit
+	echo "add-auto-load-safe-path $(STAGING_DIR)" > $(STAGING_DIR)/usr/share/buildroot/gdbinit ; \
+	echo "set sysroot $(STAGING_DIR)" >> $(STAGING_DIR)/usr/share/buildroot/gdbinit
 
  # Given a path, determine the relative prefix (../) needed to return to the
  # root level. Note that the last component is treated as a file component; use a

_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

#3 lore raw

Re: [Buildroot] [PATCH 2/2] toolchain/helpers.mk: gdbinit: set auto-load-safe-path before sysroot

Hi Arnout,

Quoted 37 lines · Arnout Vandecappelle
Quoted 33 lines · Thomas De Schampheleire

From: Thomas De Schampheleire <[email protected]>

The gdbinit supplied by Buildroot does two things:
A. specify the sysroot where gdb can find shared libraries
B. mark the sysroot as a 'safe path' for its auto-load feature, to make sure
that pretty printers for libstdc++.so are added automatically (see commit 6fb3216a80c64c08375429d89497eaeec5622150)

When debugging a core file, and the gdbinit file is specified via '-x' rather than '-ix', then the order of these settings matters: If you first set the sysroot, then gdb will immediately start finding the shared libraries it needs for the core file, detect libstdc++ and its associated libstdc++-gdb.py file, then give a big warning about safe paths:

warning: File ".../i686-buildroot-linux-gnu/sysroot/lib/libstdc++.so.6.0.24-gdb.py"
auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
To enable execution of this file add

           add-auto-load-safe-path .../i686-buildroot-linux-gnu/sysroot/lib/libstdc++.so.6.0.24-gdb.py

line to your configuration file "/home/me/.gdbinit".
To completely disable this security protection add
set auto-load safe-path /
line to your configuration file "/home/me/.gdbinit".
For more information about this security protection see the "Auto-loading safe path" section in the GDB manual. E.g., run from the shell:
info "(gdb)Auto-loading safe path"

and the pretty printing code is not loaded. This is because the second line from the gdbinit file was not yet parsed at this point.

By changing the order (first configuring the safe path, then setting the sysroot), this issue does not appear and everything is as expected.

Quoted 7 lines
Quoted 5 lines

Note that when '-ix' were used instead of '-x' to pass the gdbinit file to gdb, then the order would not matter, because the entire gdbinit file would be parsed before considering the core file.
However, even though the Buildroot manual now suggests '-ix', users may not have noticed this change and continue to use '-x'.

Whaa, excellent, not content with fixing a bug once, you fix it twice!

Just to clarify: there were two sets of warnings:

1. problems loading shared libraries
2. problems with the auto-load path / pretty printers

Switching from -x to -ix solves both problems.
But if you stick with '-x', this second patch only fixes the second problem, not the first.

Best regards,
Thomas
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

#4 lore raw

Re: [Buildroot] [PATCH 2/2] toolchain/helpers.mk: gdbinit: set auto-load-safe-path before sysroot

In reply to Thomas De Schampheleire
Quoted 34 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Thomas" == Thomas De Schampheleire <[email protected]> writes:

From: Thomas De Schampheleire <[email protected]> The gdbinit supplied by Buildroot does two things:
A. specify the sysroot where gdb can find shared libraries
B. mark the sysroot as a 'safe path' for its auto-load feature, to make sure
that pretty printers for libstdc++.so are added automatically (see commit 6fb3216a80c64c08375429d89497eaeec5622150)

When debugging a core file, and the gdbinit file is specified via '-x' rather than '-ix', then the order of these settings matters: If you first set the sysroot, then gdb will immediately start finding the shared libraries it needs for the core file, detect libstdc++ and its associated libstdc++-gdb.py file, then give a big warning about safe paths:

warning: File ".../i686-buildroot-linux-gnu/sysroot/lib/libstdc++.so.6.0.24-gdb.py"
auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
To enable execution of this file add

          add-auto-load-safe-path .../i686-buildroot-linux-gnu/sysroot/lib/libstdc++.so.6.0.24-gdb.py

line to your configuration file "/home/me/.gdbinit".
To completely disable this security protection add
set auto-load safe-path /
line to your configuration file "/home/me/.gdbinit".
For more information about this security protection see the "Auto-loading safe path" section in the GDB manual. E.g., run from the shell:
info "(gdb)Auto-loading safe path"

and the pretty printing code is not loaded. This is because the second line from the gdbinit file was not yet parsed at this point.

By changing the order (first configuring the safe path, then setting the sysroot), this issue does not appear and everything is as expected.

Quoted 7 lines

Note that when '-ix' were used instead of '-x' to pass the gdbinit file to gdb, then the order would not matter, because the entire gdbinit file would be parsed before considering the core file.
However, even though the Buildroot manual now suggests '-ix', users may not have noticed this change and continue to use '-x'.

Committed to 2021.08.x, thanks.

Signature · 5 lines
Bye, Peter Korsgaard
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot
#5 lore raw
In reply to Thomas De Schampheleire
Quoted 20 lines · Thomas De Schampheleire

From: Thomas De Schampheleire <[email protected]>

A gdbinit file passed via '-x' will be read _after_ parsing any object/core file passed on the command-line. In cross-compilation context, this is particularly a problem when loading a core file, because without the 'sysroot' specified in the gdbinit file, it will give a lot of warnings, like:

warning: .dynamic section for "/lib/libstdc++.so.6" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/librt.so.1" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libm.so.6" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libgcc_s.so.1" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libc.so.6" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/ld-linux.so.2" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libanl.so.1" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libdl.so.2" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libpthread.so.0" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/usr/lib/libz.so.1" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libnss_files.so.2" is not at the expected address (wrong library or version mismatch?)

Quoted 6 lines

warning: Could not load shared library symbols for 17 libraries, e.g. [...] Use the "info sharedlibrary" command to see the complete listing. Do you need "set solib-search-path" or "set sysroot"?

In contrast, the '-ix' option will load the specified gdbinit file _before_ parsing object/core files. This will remove said warnings.

I didn't know this!

Applied to master, thanks.

Regards,
Arnout

Quoted 14 lines

See also: https://sourceware.org/bugzilla/show_bug.cgi?id=28330

---
  docs/manual/using-buildroot-debugger.txt | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
docs/manual/using-buildroot-debugger.txt +0 -0
index d5293beb53..9a8a7dfbaf 100644

docs/manual/using-buildroot-debugger.txt Then, on the host, you should start the cross gdb using the following · line 41

Quoted 8 lines
docs/manual/using-buildroot-debugger.txt +1 -1
@@ -35,7 +35,7 @@ Then, on the host, you should start the cross gdb using the following
  command line:
 
  ----------------------------
-<buildroot>/output/host/bin/<tuple>-gdb -x <buildroot>/output/staging/usr/share/buildroot/gdbinit foo
+<buildroot>/output/host/bin/<tuple>-gdb -ix <buildroot>/output/staging/usr/share/buildroot/gdbinit foo
  ----------------------------
 
  Of course, +foo+ must be available in the current directory, built

_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

#6 lore raw
In reply to Thomas De Schampheleire
Quoted 25 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Thomas" == Thomas De Schampheleire <[email protected]> writes:

From: Thomas De Schampheleire <[email protected]> A gdbinit file passed via '-x' will be read _after_ parsing any object/core file passed on the command-line. In cross-compilation context, this is particularly a problem when loading a core file, because without the 'sysroot' specified in the gdbinit file, it will give a lot of warnings, like:

warning: .dynamic section for "/lib/libstdc++.so.6" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/librt.so.1" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libm.so.6" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libgcc_s.so.1" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libc.so.6" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/ld-linux.so.2" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libanl.so.1" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libdl.so.2" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libpthread.so.0" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/usr/lib/libz.so.1" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libnss_files.so.2" is not at the expected address (wrong library or version mismatch?)

warning: Could not load shared library symbols for 17 libraries, e.g. [...] Use the "info sharedlibrary" command to see the complete listing. Do you need "set solib-search-path" or "set sysroot"?

Quoted 6 lines

In contrast, the '-ix' option will load the specified gdbinit file _before_ parsing object/core files. This will remove said warnings.

See also: https://sourceware.org/bugzilla/show_bug.cgi?id=28330

Committed to 2021.02.x, 2021.05.x and 2021.08.x, thanks.

Signature · 5 lines
Bye, Peter Korsgaard
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot