mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-26 05:47:26 +08:00

Consider a test-case consisting of source file test.c: ... extern int aaa; int main (void) { return 0; } ... and test-2.c: ... int aaa = 33; ... compiled with debug info only for test.c: ... $ gcc -c test.c -g; gcc -c test2.c; gcc test.o test2.o -g ... When trying to print aaa, we get: ... $ gdb -batch a.out -ex "print aaa" 'aaa' has unknown type; cast it to its declared type ... but with -readnow we have: ... $ gdb -readnow -batch a.out -ex "print aaa" $1 = 33 ... In the -readnow case, the symbol for aaa in the full symtab has LOC_UNRESOLVED, and the symbol type is combined with the minimal symbol address, to read the value and print it without cast. Without the -readnow, we create partial symbols, but the aaa decl is missing from the partial symtabs, so we find it only in the minimal symbols, resulting in the cast request. If the aaa decl would have been in the partial symtabs, it would have been found, and the full symtab would have been expanded, after which things would be as with -readnow. The function add_partial_symbol has a comment on the LOC_UNRESOLVED + minimal symbol addres construct at DW_TAG_variable handling: ... else if (pdi->is_external) { /* Global Variable. Don't enter into the minimal symbol tables as there is a minimal symbol table entry from the ELF symbols already. Enter into partial symbol table if it has a location descriptor or a type. If the location descriptor is missing, new_symbol will create a LOC_UNRESOLVED symbol, the address of the variable will then be determined from the minimal symbol table whenever the variable is referenced. ... but it's not triggered due to this test in scan_partial_symbols: ... case DW_TAG_variable: ... if (!pdi->is_declaration) { add_partial_symbol (pdi, cu); } ... Fix this in scan_partial_symbols by allowing external variable decls to be added to the partial symtabs. Build and reg-tested on x86_64-linux. The patch caused this regression: ... (gdb) print a_thread_local^M Cannot find thread-local storage for process 0, executable file tls/tls:^M Cannot find thread-local variables on this target^M (gdb) FAIL: gdb.threads/tls.exp: print a_thread_local ... while without the patch we have: ... (gdb) print a_thread_local^M Cannot read `a_thread_local' without registers^M (gdb) PASS: gdb.threads/tls.exp: print a_thread_local ... However, without the patch but with -readnow we have the same FAIL as with the patch (filed as PR25807). In other words, the patch has the effect that we get the same result with and without -readnow. This can be explained as follows. Without the patch, and without -readnow, we have two a_thread_locals, the def and the decl: ... $ gdb -batch outputs/gdb.threads/tls/tls \ -ex "maint expand-symtabs" \ -ex "print a_thread_local" \ -ex "maint print symbols" \ | grep "a_thread_local;" Cannot read `a_thread_local' without registers int a_thread_local; computed at runtime int a_thread_local; unresolved ... while without the patch and with -readnow, we have the opposite order: ... $ gdb -readnow -batch outputs/gdb.threads/tls/tls \ -ex "maint expand-symtabs" \ -ex "print a_thread_local" \ -ex "maint print symbols" \ | grep "a_thread_local;" Cannot find thread-local storage for process 0, executable file tls/tls: Cannot find thread-local variables on this target int a_thread_local; unresolved int a_thread_local; computed at runtime ... With the patch we have the same order with and without -readnow, but just a different one than before without -readnow. Mark the "Cannot find thread-local variables on this target" variant a PR25807 kfail. gdb/ChangeLog: 2020-04-22 Tom de Vries <tdevries@suse.de> PR symtab/25764 * dwarf2/read.c (scan_partial_symbols): Allow external variable decls in psymtabs. gdb/testsuite/ChangeLog: 2020-04-22 Tom de Vries <tdevries@suse.de> PR symtab/25764 * gdb.base/psym-external-decl-2.c: New test. * gdb.base/psym-external-decl.c: New test. * gdb.base/psym-external-decl.exp: New file. * gdb.threads/tls.exp: Add PR25807 kfail.
…
…
…
…
…
…
…
…
…
…
README for GNU development tools This directory contains various GNU compilers, assemblers, linkers, debuggers, etc., plus their support routines, definitions, and documentation. If you are receiving this as part of a GDB release, see the file gdb/README. If with a binutils release, see binutils/README; if with a libg++ release, see libg++/README, etc. That'll give you info about this package -- supported targets, how to use it, how to report bugs, etc. It is now possible to automatically configure and build a variety of tools with one command. To build all of the tools contained herein, run the ``configure'' script here, e.g.: ./configure make To install them (by default in /usr/local/bin, /usr/local/lib, etc), then do: make install (If the configure script can't determine your type of computer, give it the name as an argument, for instance ``./configure sun4''. You can use the script ``config.sub'' to test whether a name is recognized; if it is, config.sub translates it to a triplet specifying CPU, vendor, and OS.) If you have more than one compiler on your system, it is often best to explicitly set CC in the environment before running configure, and to also set CC when running make. For example (assuming sh/bash/ksh): CC=gcc ./configure make A similar example using csh: setenv CC gcc ./configure make Much of the code and documentation enclosed is copyright by the Free Software Foundation, Inc. See the file COPYING or COPYING.LIB in the various directories, for a description of the GNU General Public License terms under which you can copy the files. REPORTING BUGS: Again, see gdb/README, binutils/README, etc., for info on where and how to report problems.
Description
Languages
C
51.8%
Makefile
22.4%
Assembly
12.3%
C++
6%
Roff
1.4%
Other
5.4%