GDB найти переменную TLS из ядра - PullRequest
2 голосов
/ 04 марта 2020

При отладке файла ядра я могу найти данные pthread_specific, но я не нашел способа доступа к __thread данным, таким как errno.

Доступ осуществляется через %fs:0x0 регистр, и я могу разобрать __errno_location, чтобы найти его относительный адрес из %fs:0x0, но я не вижу способа разрешить его для каждого потока, как это выглядит базовое значение %fs недоступно для GDB.

Пример:

Dump of assembler code for function __errno_location:
   0x00007fefa83911f0 <+0>: push   %rbp
   0x00007fefa83911f1 <+1>: mov    0x206d90(%rip),%rax        # 0x7fefa8597f88
   0x00007fefa83911f8 <+8>: add    %fs:0x0,%rax
   0x00007fefa8391201 <+17>:    mov    %rsp,%rbp
   0x00007fefa8391204 <+20>:    pop    %rbp
   0x00007fefa8391205 <+21>:    retq   
End of assembler dump.

Есть ли способ узнать, какое значение %fs:0x0 будет для текущего потока?

Команда info registers показывает только это для регистров сегмента:

ds             0x0  0
es             0x0  0
fs             0x0  0
gs             0x0  0

lib c версия: 2.17
lib c .so.6 отладка, в настоящее время не установленная
Версия GDB: GNU gdb (Ubuntu 7.11.1-0ubuntu1 ~ 16.5) 7.11.1

...