Отлаживая общий объект 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