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: [email protected]
Reporter: [email protected]
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.
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-threads
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.