projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix build regression in i386 asm for atan2, atan2f
[musl]
/
ldso
/
dynlink.c
diff --git
a/ldso/dynlink.c
b/ldso/dynlink.c
index
206427f
..
d1edb13
100644
(file)
--- a/
ldso/dynlink.c
+++ b/
ldso/dynlink.c
@@
-1,4
+1,5
@@
#define _GNU_SOURCE
#define _GNU_SOURCE
+#define SYSCALL_NO_TLS 1
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
@@
-85,7
+86,6
@@
struct dso {
size_t relro_start, relro_end;
uintptr_t *new_dtv;
unsigned char *new_tls;
size_t relro_start, relro_end;
uintptr_t *new_dtv;
unsigned char *new_tls;
- volatile int new_dtv_idx, new_tls_idx;
struct td_index *td_index;
struct dso *fini_next;
char *shortname;
struct td_index *td_index;
struct dso *fini_next;
char *shortname;
@@
-920,7
+920,7
@@
static void *dl_mmap(size_t n)
#else
p = (void *)__syscall(SYS_mmap, 0, n, prot, flags, -1, 0);
#endif
#else
p = (void *)__syscall(SYS_mmap, 0, n, prot, flags, -1, 0);
#endif
- return
p == MAP_FAILED
? 0 : p;
+ return
(unsigned long)p > -4096UL
? 0 : p;
}
static void makefuncdescs(struct dso *p)
}
static void makefuncdescs(struct dso *p)
@@
-1125,9
+1125,9
@@
static struct dso *load_library(const char *name, struct dso *needed_by)
p->tls_id = ++tls_cnt;
tls_align = MAXP2(tls_align, p->tls.align);
#ifdef TLS_ABOVE_TP
p->tls_id = ++tls_cnt;
tls_align = MAXP2(tls_align, p->tls.align);
#ifdef TLS_ABOVE_TP
- p->tls.offset = tls_offset + ( (
tls_
align-1) &
-
-(
tls_offset + (uintptr_t)p->tls.image) );
- tls_offset
+=
p->tls.size;
+ p->tls.offset = tls_offset + ( (
p->tls.
align-1) &
+
(-
tls_offset + (uintptr_t)p->tls.image) );
+ tls_offset
= p->tls.offset +
p->tls.size;
#else
tls_offset += p->tls.size + p->tls.align - 1;
tls_offset -= (tls_offset + (uintptr_t)p->tls.image)
#else
tls_offset += p->tls.size + p->tls.align - 1;
tls_offset -= (tls_offset + (uintptr_t)p->tls.image)
@@
-1644,7
+1644,7
@@
hidden void __dls2(unsigned char *base, size_t *sp)
* so that loads of the thread pointer and &errno can be pure/const and
* thereby hoistable. */
* so that loads of the thread pointer and &errno can be pure/const and
* thereby hoistable. */
-
_Noreturn
void __dls2b(size_t *sp)
+void __dls2b(size_t *sp)
{
/* Setup early thread pointer in builtin_tls for ldso/libc itself to
* use during dynamic linking. If possible it will also serve as the
{
/* Setup early thread pointer in builtin_tls for ldso/libc itself to
* use during dynamic linking. If possible it will also serve as the
@@
-1665,7
+1665,7
@@
_Noreturn void __dls2b(size_t *sp)
* process dependencies and relocations for the main application and
* transfer control to its entry point. */
* process dependencies and relocations for the main application and
* transfer control to its entry point. */
-
_Noreturn
void __dls3(size_t *sp)
+void __dls3(size_t *sp)
{
static struct dso app, vdso;
size_t aux[AUX_CNT], *auxv;
{
static struct dso app, vdso;
size_t aux[AUX_CNT], *auxv;
@@
-1685,6
+1685,8
@@
_Noreturn void __dls3(size_t *sp)
libc.auxv = auxv = (void *)(argv+i+1);
decode_vec(auxv, aux, AUX_CNT);
__hwcap = aux[AT_HWCAP];
libc.auxv = auxv = (void *)(argv+i+1);
decode_vec(auxv, aux, AUX_CNT);
__hwcap = aux[AT_HWCAP];
+ search_vec(auxv, &__sysinfo, AT_SYSINFO);
+ __pthread_self()->sysinfo = __sysinfo;
libc.page_size = aux[AT_PAGESZ];
libc.secure = ((aux[0]&0x7800)!=0x7800 || aux[AT_UID]!=aux[AT_EUID]
|| aux[AT_GID]!=aux[AT_EGID] || aux[AT_SECURE]);
libc.page_size = aux[AT_PAGESZ];
libc.secure = ((aux[0]&0x7800)!=0x7800 || aux[AT_UID]!=aux[AT_EUID]
|| aux[AT_GID]!=aux[AT_EGID] || aux[AT_SECURE]);
@@
-1794,10
+1796,9
@@
_Noreturn void __dls3(size_t *sp)
app.tls_id = tls_cnt = 1;
#ifdef TLS_ABOVE_TP
app.tls.offset = GAP_ABOVE_TP;
app.tls_id = tls_cnt = 1;
#ifdef TLS_ABOVE_TP
app.tls.offset = GAP_ABOVE_TP;
- app.tls.offset += -GAP_ABOVE_TP & (app.tls.align-1);
- tls_offset = app.tls.offset + app.tls.size
- + ( -((uintptr_t)app.tls.image + app.tls.size)
- & (app.tls.align-1) );
+ app.tls.offset += (-GAP_ABOVE_TP + (uintptr_t)app.tls.image)
+ & (app.tls.align-1);
+ tls_offset = app.tls.offset + app.tls.size;
#else
tls_offset = app.tls.offset = app.tls.size
+ ( -((uintptr_t)app.tls.image + app.tls.size)
#else
tls_offset = app.tls.offset = app.tls.size
+ ( -((uintptr_t)app.tls.image + app.tls.size)
@@
-2216,7
+2217,7
@@
int dladdr(const void *addr_arg, Dl_info *info)
}
}
}
}
- if (best
sym
&& besterr > bestsym->st_size-1) {
+ if (best && besterr > bestsym->st_size-1) {
best = 0;
bestsym = 0;
}
best = 0;
bestsym = 0;
}