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:
Peter Wemm 2004-11-06 03:32:07 +00:00
parent c5bfff3bab
commit 24b4ec3d21
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=137293

View File

@ -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 */