Re: GDB TLS testing [actually running some tests finally: a success with -pthread used]

Mark Millard via freebsd-ppc <[email protected]>
Newsgroups gmane.os.freebsd.devel.ppc
Message-ID <[email protected]>

On 2019-Jan-22, at 22:53, Mark Millard <[email protected]> wrote:



> On 2019-Jan-22, at 19:19, Mark Millard <marklmi at yahoo.com> wrote:
> 
> 
> 
>> On 2019-Jan-22, at 18:32, Mark Millard <marklm at yahoo.com> wrote:
>> 
>> 
>> 
>>> On 2019-Jan-22, at 17:06, Mark Millard <marklmi at yahoo.com> wrote:
>>> 
>>> 
>>> 
>>> . . .
>>> So I'm trying:
>>> 
>>> # git clean -f
>>> # rm */config.cache */*/config.cache
>>> # env CPATH=/usr/local/include ./configure
>>> . . .
>>> # env CPATH=/usr/local/include gmake
>>> . . .
>>> 
>>> in order to try to add paths after the command line -I paths.
>>> 
>>> . . . This looks like it built. I've not used the build yet.
>>> 
>> 
>> Looking at a *.core did not go well for my context:
>> 
>> # cc -g -O2 tls_gdb_test.c 
>> tls_gdb_test.c:16:2: warning: indirection of non-volatile null pointer will be deleted, not trap [-Wnull-dereference]
>>       *(char *)NULL = 1;
>>       ^~~~~~~~~~~~~
>> tls_gdb_test.c:16:2: note: consider using __builtin_trap() or qualifying pointer with 'volatile'
>> 1 warning generated.
>> . . .
> 
> 
> So far all tried-combinations of using gcc versions for build
> the test program and/or building the gdb used do not work for
> "p id" and "p &id" in doing the test. clang is not essential
> to the behavior observed.

Using "-g -O2 -pthread" to build the test program via system
clang or gcc8 (for example) did lead to the likes of:

(gdb) run 
Starting program: /root/c_tests/a.out 
main: PID 15350
id = 15350 (0x810055020)

^C
Program received signal SIGINT, Interrupt.
main (ac=<optimized out>, av=<optimized out>) at tls_gdb_test.c:16
16		*(char *)NULL = 1;
(gdb) bt
#0  main (ac=<optimized out>, av=<optimized out>) at tls_gdb_test.c:16
(gdb) info threads
  Id   Target Id                   Frame 
* 1    LWP 100324 of process 15350 main (ac=<optimized out>, av=<optimized out>) at tls_gdb_test.c:16
(gdb) p id
$1 = 15350
(gdb) p &id
$2 = (int *) 0x810055020

So it appears one branch of:

static void
fbsd_fetch_rtld_offsets (struct gdbarch *gdbarch, struct fbsd_pspace_data *data)
{
  TRY
    {
      /* Fetch offsets from debug symbols in rtld.  */
      data->off_linkmap = parse_and_eval_long ("&((Obj_Entry *)0)->linkmap");
      data->off_tlsindex = parse_and_eval_long ("&((Obj_Entry *)0)->tlsindex");
      data->rtld_offsets_valid = true;
      return;
    }
  CATCH (e, RETURN_MASK_ERROR)
    {
      data->off_linkmap = -1;
    }
  END_CATCH

  TRY
    {
      /* Fetch offsets from global variables in libthr.  Note that
         this does not work for single-threaded processes that are not
         linked against libthr.  */
      data->off_linkmap = fbsd_read_integer_by_name(gdbarch,
                                                    "_thread_off_linkmap");
      data->off_tlsindex = fbsd_read_integer_by_name(gdbarch,
                                                     "_thread_off_tlsindex");
      data->rtld_offsets_valid = true;
      return;
    }
  CATCH (e, RETURN_MASK_ERROR)
    {
      data->off_linkmap = -1;
    }
  END_CATCH
}

is working when -pthread is used.

===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)

_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-ppc
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.