mirror of
git://sourceware.org/git/valgrind.git
synced 2026-01-12 00:19:31 +08:00
To implement QGetTlsAddr, gdbsrv has to know how to get the glibc dtv address and the module id from the link_map. These 2 things are dependent on the internals of glibc. The dependency is mostly isolated in a few lines of arch dependent code or in an external utility that used a hack + -ldl lib to find the offset of the modid in the link_map structure. Tested on x86/amd64/ppc64/s390x. Somewhat tested on ppc32 and arm64. Untested/a few #ifdef-ed lines not compiled on arm/mips32/mips64 and darwin. For more background info about thread local storage handling, see 'ELF Handling For Thread-Local Storage' http://www.akkadia.org/drepper/tls.pdf Changes: * auxprogs/getoff.c new auxilliary program to get platform specific offsets (currently only the offset for the module id in struct link_map). * configure.ac : check for dlinfo(RTLD_DI_TLS_MODID) needed for getoff.c * new gdbserver_tests/hgtls, testing various types of __thread variables * various m_gdbserver files: - implement decoding of the QGetTlsAddr query - for each platform: platform specific code to get the dtv - call to external program getoff-<platform> the first time an __thread variable is printed. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14283
38 lines
723 B
Plaintext
38 lines
723 B
Plaintext
# connect gdb to Valgrind gdbserver:
|
|
target remote | ./vgdb --wait=60 --vgdb-prefix=./vgdb-prefix-hgtls
|
|
echo vgdb launched process attached\n
|
|
monitor v.set vgdb-error 999999
|
|
#
|
|
#
|
|
# insert break:
|
|
break tls.c:55
|
|
command
|
|
set $tls_ip = main
|
|
if test == &tests[0]
|
|
set $tls_ip = &race
|
|
end
|
|
if test == &tests[1]
|
|
set $tls_ip = &local
|
|
end
|
|
if test == &tests[2]
|
|
set $tls_ip = &global
|
|
end
|
|
if test == &tests[3]
|
|
set $tls_ip = &static_extern
|
|
end
|
|
if test == &tests[4]
|
|
set $tls_ip = &so_extern
|
|
end
|
|
if test == &tests[5]
|
|
set $tls_ip = &so_local
|
|
end
|
|
if test == &tests[6]
|
|
set $tls_ip = &global
|
|
end
|
|
printf "test %s tls_ip %p ip %p equal %d\n", test->name, $tls_ip, ip, $tls_ip == ip
|
|
continue
|
|
end
|
|
# continue till the end
|
|
continue
|
|
quit
|