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 |