diff options
| -rw-r--r-- | arch/i386/reloc.h | 2 | ||||
| -rw-r--r-- | src/ldso/i386/tlsdesc.s | 27 | 
2 files changed, 29 insertions, 0 deletions
| diff --git a/arch/i386/reloc.h b/arch/i386/reloc.h index 12224b79..eaf5aae0 100644 --- a/arch/i386/reloc.h +++ b/arch/i386/reloc.h @@ -26,6 +26,8 @@ static int remap_rel(int type)  		return REL_TPOFF;  	case R_386_TLS_TPOFF32:  		return REL_TPOFF_NEG; +	case R_386_TLS_DESC: +		return REL_TLSDESC;  	}  	return 0;  } diff --git a/src/ldso/i386/tlsdesc.s b/src/ldso/i386/tlsdesc.s new file mode 100644 index 00000000..3ac61297 --- /dev/null +++ b/src/ldso/i386/tlsdesc.s @@ -0,0 +1,27 @@ +.text +.global __tlsdesc_static +.type __tlsdesc_static,@function +__tlsdesc_static: +	mov 4(%eax),%eax +	ret + +.global __tlsdesc_dynamic +.type __tlsdesc_dynamic,@function +__tlsdesc_dynamic: +	mov 4(%eax),%eax +	push %edx +	mov %gs:4,%edx +	push %ecx +	mov (%eax),%ecx +	cmp %ecx,(%edx) +	jc 1f +	mov 4(%eax),%eax +	add (%edx,%ecx,4),%eax +2:	pop %ecx +	sub %gs:0,%eax +	pop %edx +	ret +1:	push %eax +	call __tls_get_addr +	pop %ecx +	jmp 2b | 
