diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2008-12-02 14:51:01 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2008-12-02 14:51:01 +0000 |
commit | e0740f779c1471fbc565ceedae93dea09bc0eadf (patch) | |
tree | 2a5d38d0d285c60457f1be35f6b5ef641c863e8f /gdb/findvar.c | |
parent | c29235ac9f1b955c3f4c89c5c8bc4ea4d4f80ae1 (diff) | |
download | gdb-e0740f779c1471fbc565ceedae93dea09bc0eadf.zip gdb-e0740f779c1471fbc565ceedae93dea09bc0eadf.tar.gz gdb-e0740f779c1471fbc565ceedae93dea09bc0eadf.tar.bz2 |
gdb/
Fix resolving external references to TLS variables.
* findvar.c: Include `objfiles.h'.
(read_var_value <LOC_UNRESOLVED>): New variable `obj_section'. Handle
SEC_THREAD_LOCAL variables.
* printcmd.c (address_info <LOC_UNRESOLVED>): Handle SEC_THREAD_LOCAL
variables.
gdb/testsuite/
Test resolving external references to TLS variables.
* gdb.threads/tls.exp: New tests to examine A_THREAD_LOCAL and
FILE2_THREAD_LOCAL.
(testfile2, srcfile2): New variables.
* gdb.threads/tls.c (file2_thread_local)
(function_referencing_file2_thread_local): New.
* gdb.threads/tls2.c: New file.
Diffstat (limited to 'gdb/findvar.c')
-rw-r--r-- | gdb/findvar.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/gdb/findvar.c b/gdb/findvar.c index 4796721..f7b6e63 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -34,6 +34,7 @@ #include "regcache.h" #include "user-regs.h" #include "block.h" +#include "objfiles.h" /* Basic byte-swapping routines. GDB has needed these for a long time... All extract a target-format integer at ADDR which is LEN bytes long. */ @@ -536,6 +537,7 @@ read_var_value (struct symbol *var, struct frame_info *frame) case LOC_UNRESOLVED: { struct minimal_symbol *msym; + struct obj_section *obj_section; msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL, NULL); if (msym == NULL) @@ -545,6 +547,11 @@ read_var_value (struct symbol *var, struct frame_info *frame) SYMBOL_OBJ_SECTION (msym)); else addr = SYMBOL_VALUE_ADDRESS (msym); + + obj_section = SYMBOL_OBJ_SECTION (msym); + if (obj_section + && (obj_section->the_bfd_section->flags & SEC_THREAD_LOCAL) != 0) + addr = target_translate_tls_address (obj_section->objfile, addr); } break; |