The 32 bit compatability ld-elf32.so.1 cannot use i386_set_ldt() when
running on an amd64 kernel. Use the recently exposed direct %fs/%gs set routines instead for the TLS setup of 32 bit binaries.
This commit is contained in:
parent
c5bfff3bab
commit
24b4ec3d21
@ -327,8 +327,10 @@ void
|
||||
allocate_initial_tls(Obj_Entry *objs)
|
||||
{
|
||||
void* tls;
|
||||
#ifndef COMPAT_32BIT
|
||||
union descriptor ldt;
|
||||
int sel;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Fix the size of the static TLS block by using the maximum
|
||||
@ -338,6 +340,7 @@ allocate_initial_tls(Obj_Entry *objs)
|
||||
tls_static_space = tls_last_offset + RTLD_STATIC_TLS_EXTRA;
|
||||
tls = allocate_tls(objs, NULL, 2*sizeof(Elf_Addr), sizeof(Elf_Addr));
|
||||
|
||||
#ifndef COMPAT_32BIT
|
||||
memset(&ldt, 0, sizeof(ldt));
|
||||
ldt.sd.sd_lolimit = 0xffff; /* 4G limit */
|
||||
ldt.sd.sd_lobase = ((Elf_Addr)tls) & 0xffffff;
|
||||
@ -350,6 +353,9 @@ allocate_initial_tls(Obj_Entry *objs)
|
||||
ldt.sd.sd_hibase = (((Elf_Addr)tls) >> 24) & 0xff;
|
||||
sel = i386_set_ldt(LDT_AUTO_ALLOC, &ldt, 1);
|
||||
__asm __volatile("movl %0,%%gs" : : "rm" ((sel << 3) | 7));
|
||||
#else
|
||||
_amd64_set_gsbase(tls);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* GNU ABI */
|
||||
|
Loading…
x
Reference in New Issue
Block a user