diff options
| -rw-r--r-- | arch/x86_64/reloc.h | 2 | ||||
| -rw-r--r-- | src/ldso/x86_64/tlsdesc.s | 40 | 
2 files changed, 42 insertions, 0 deletions
diff --git a/arch/x86_64/reloc.h b/arch/x86_64/reloc.h index ffab5566..9bc58496 100644 --- a/arch/x86_64/reloc.h +++ b/arch/x86_64/reloc.h @@ -25,6 +25,8 @@ static int remap_rel(int type)  		return REL_DTPOFF;  	case R_X86_64_TPOFF64:  		return REL_TPOFF; +	case R_X86_64_TLSDESC: +		return REL_TLSDESC;  	}  	return 0;  } diff --git a/src/ldso/x86_64/tlsdesc.s b/src/ldso/x86_64/tlsdesc.s new file mode 100644 index 00000000..57b78e0b --- /dev/null +++ b/src/ldso/x86_64/tlsdesc.s @@ -0,0 +1,40 @@ +.text +.global __tlsdesc_static +.type __tlsdesc_static,@function +__tlsdesc_static: +	mov 8(%rax),%rax +	ret + +.global __tlsdesc_dynamic +.type __tlsdesc_dynamic,@function +__tlsdesc_dynamic: +	mov 8(%rax),%rax +	push %rdx +	mov %fs:8,%rdx +	push %rcx +	mov (%rax),%rcx +	cmp %rcx,(%rdx) +	jc 1f +	mov 8(%rax),%rax +	add (%rdx,%rcx,8),%rax +2:	pop %rcx +	sub %fs:0,%rax +	pop %rdx +	ret +1:	push %rdi +	push %rdi +	push %rsi +	push %r8 +	push %r9 +	push %r10 +	push %r11 +	mov %rax,%rdi +	call __tls_get_addr +	pop %r11 +	pop %r10 +	pop %r9 +	pop %r8 +	pop %rsi +	pop %rdi +	pop %rdi +	jmp 2b  | 
