Following is a simple shared object with thread local storage. The syntax in the section TLS_Test_fn is taken from section "7.9.4 Thread Local Storage in ELF: elf Special Symbols and WRT" in the NASM 2.13.02 manual (corresponding to the version installed on my Ubuntu 18.04).
The two lines that that uses the TLS variable are:
mov rax,[rel MQ_FDes_Core wrt ..gottpoff]
mov rcx,[fs:rax]
I assemble with NASM assembler:
sudo nasm -f elf64 -g -F dwarf TLS_Test.asm
and I get:
"TLS_Test.asm:24: error: unable to find a suitable global symbol for this reference"
If I write it as mov rax,[MQ_FDes_Core wrt ..gottpoff] I get the same error.
Here is the full code:
; Header Section
[BITS 64]
[default rel]
global Main_Entry_fn
global TLS_Test_fn
section .data align=16
unused_data: dq 0
section .tdata align=16
MQ_FDes_Core: dq 0
; __________
section .text
TLS_Test_fn:
mov rax,87
;mov [MQ_FDes_Core],rax
mov rax,[rel MQ_FDes_Core wrt ..gottpoff]
mov rcx,[fs:rax]
ret
; __________
; Main Entry
Main_Entry_fn:
push rdi
push rbp
push rbx
; __________
call TLS_Test_fn
pop rbx
pop rbp
pop rdi
ret
The .so entry point is Main_Entry_fn.
Why do I get that error?
Thanks.