Сообщение GDB "еще не выделено хранилище для локальных переменных потока" - PullRequest
0 голосов
/ 03 апреля 2020

Отлаживая общий объект NASM с помощью gdb, я получаю ошибку сегментации, когда поток обращается к своей локальной переменной потока. Когда я печатаю значение локальной переменной потока с помощью gdb, он отвечает:

(gdb) p MQ_FDes_Core
The inferior has not yet allocated storage for thread-local variables in the shared library `/opt/ThTest/TLS_Test.so' for Thread 0x7fffeaf26700 (LWP 4317).  

, где MQ_FDes_Core - локальная переменная потока. Если я выполняю строку «mov [MQ_FDes_Core], rax», gdb генерирует ошибку сегментации, поскольку tls еще не был инициализирован.

Секция кода, в которой это происходит:

lea rdi,[MQ_Name]
mov rsi,rax
call mq_open wrt ..plt
mov [MQ_FDes_Core],rax

Разборка этой секции (с помощью objconv Агнера Фога):

Open_message_queue:
        lea     rdi, [rel MQ_Name]                      ; 1367 _ 48: 8D. 3D, 0020230A(rel)
        mov     rsi, rax                                ; 136E _ 48: 89. C6
        call    ?_014                                   ; 1371 _ E8, FFFFFB9A(rel)
        mov     qword [rel MQ_FDes_Core], rax           ; 1376 _ 48: 89. 05, 002017E3(rel)

Тданные расположены в Раздел .tdata:

section .tdata align=16
MQ_FDes_Core: dq 0

В разделе руководства NASM 2.13.02 «7.9.4 Локальное хранилище потоков в ELF: специальные символы elf и WRT» написано так для ELF64:

mov rax,[rel MQ_FDes_Core wrt ..gottpoff]
mov rcx,[fs:rax]

Но с этим ассемблер NASM говорит «ошибка: парсер: ожидание]» в первой строке.

Я связываюсь с ld против -ldl, -lpthread и -lrt.

Я исследовал ряд веб-ресурсов, в том числе Ульриха Дреппера "Обработка ELF для локального хранилища потоков", но я не еще не знаю, как это исправить. Большая часть этого посвящена C или C ++, но это NASM.

Спасибо за любые идеи по инициализации локального хранилища потока в динамически загружаемом общем объекте.

ОБНОВЛЕНИЕ - МИНИМАЛЬНЫЙ ПРИМЕР разделяемого объекта (встроенный в исполняемый файл P IE):

default rel

section .tdata align=16
MQ_FDes_Core: dq 0

section .text

global main
main:
    mov qword [MQ_FDes_Core], 87
    ret

Сборка с nasm -f elf64 tls.asm && gcc -pie tls.o

(gdb) start
Temporary breakpoint 1 at 0x1120
Starting program: /tmp/a.out

Temporary breakpoint 1, 0x0000555555555120 in main ()
(gdb) p MQ_FDes_Core 
Cannot find thread-local storage for process 642417, executable file /tmp/a.out:
Cannot find thread-local variables on this target
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...