[Bug 238485] Failed to read TLS variables for -static -lpthread executables
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Tue Jun 11 06:55:33 UTC 2019
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=238485
Bug ID: 238485
Summary: Failed to read TLS variables for -static -lpthread
executables
Product: Base System
Version: 12.0-RELEASE
Hardware: Any
OS: Any
Status: New
Severity: Affects Many People
Priority: ---
Component: threads
Assignee: threads at FreeBSD.org
Reporter: rajendra.sy at gmail.com
On any platform build test app as below & print a TLS variable to see the error
message.
$ clang -static -g -o tls src/tls.c -lpthread
ADM64: FreeBSD-12
-----
[amd64-fbsd12] # lldb ./tls
(lldb) target create "./tls"
Current executable set to './tls' (x86_64).
(lldb) b 12
Breakpoint 1: where = tls`start_thread + 97 at tls.c:13, address =
0x0000000000222341
(lldb) r
Process 84810 launching
Process 84810 launched: './tls' (x86_64)
foo is 0xbad1 boo is 0xcab1 thread sleeping for 5 seconds
Process 84810 stopped
* thread #2, name = 'tls', stop reason = breakpoint 1.1
frame #0: 0x0000000000222341 tls`start_thread(in=0x00000000004c9ed0) at
tls.c:13
10 boo = (*(int *)in)+51888; // 0xcab_
11 printf("foo is 0x%x boo is 0x%x thread sleeping for 5 seconds\n",
foo, boo);
12 while (1) {
-> 13 sleep(5);
14 break;
15 }
16 return NULL;
(lldb) p foo
error: Couldn't materialize: couldn't get the value of variable foo: No TLS
data currently exists for this thread.
error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression
RPI-2: FreeBSD-11
-----
rpi2-fbsd11] # /usr/bin/gdb ./tls
GNU gdb 6.1.1 [FreeBSD]
(gdb) b 12
Breakpoint 1 at 0x84e0: file src/tls.c, line 12.
(gdb) r
(gdb) p foo
Cannot find executable file `/b/syrajendra/test/lldb/test-prgms/step/tls'
link_map in dynamic linker's module list
[rpi2-fbsd11] # /usr/local/bin/gdb ./tls
GNU gdb (GDB) 8.2.1 [GDB v8.2.1 for FreeBSD]
(gdb) b 12
Breakpoint 1 at 0x84e0: file src/tls.c, line 12.
(gdb) r
(gdb) p foo
Cannot find thread-local variables on this target
ADM64: FreeBSD-11
------
[amd64-fbsd11] # /usr/local/bin/gdb ./tls
GNU gdb (GDB) 8.1 [GDB v8.1 for FreeBSD]
(gdb) b 12
Breakpoint 1 at 0x400521: file src/tls.c, line 12.
(gdb) r
(gdb) p foo
Cannot find thread-local variables on this target
******
On Linux: debuggers use these below 2 API's from "thread_db.h" to fetch TLS var
address.
1. For executables with shared libs: td_thr_tls_get_addr()
2. For executables with static libs: td_thr_tlsbase()
On FreeBSD, I see only td_thr_tls_get_addr() API.
Is possible to add td_thr_tlsbase() API?
Or
How to get TLS variable address without td_thr_tlsbase() API from a static
executable?
Here is the tls.c code:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#define MAX_THREADS 5
int __thread foo;
int __thread boo;
void* start_thread(void *in) {
foo = (*(int *)in)+47824; // 0xbad_
boo = (*(int *)in)+51888; // 0xcab_
printf("foo is 0x%x boo is 0x%x thread sleeping for 5 seconds\n", foo,
boo);
while (1) {
sleep(5);
break;
}
return NULL;
}
int main(void) {
pthread_t threads[MAX_THREADS];
int i;
static int count[MAX_THREADS];
for (i=0; i<MAX_THREADS; i++) {
count[i] = i + 1;
pthread_create(&threads[i], NULL, start_thread, (void *)&count[i]);
}
for (i=0; i<MAX_THREADS; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-threads
mailing list