2011-02-12 00:22:29 -05:00
|
|
|
#ifndef LIBC_H
|
|
|
|
#define LIBC_H
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
2013-09-15 02:00:32 +00:00
|
|
|
#include <limits.h>
|
2011-02-12 00:22:29 -05:00
|
|
|
|
2014-07-24 03:23:11 -04:00
|
|
|
struct __locale_map;
|
|
|
|
|
add locale framework
this commit adds non-stub implementations of setlocale, duplocale,
newlocale, and uselocale, along with the data structures and minimal
code needed for representing the active locale on a per-thread basis
and optimizing the common case where thread-local locale settings are
not in use.
at this point, the data structures only contain what is necessary to
represent LC_CTYPE (a single flag) and LC_MESSAGES (a name for use in
finding message translation files). representation for the other
categories will be added later; the expectation is that a single
pointer will suffice for each.
for LC_CTYPE, the strings "C" and "POSIX" are treated as special; any
other string is accepted and treated as "C.UTF-8". for other
categories, any string is accepted after being truncated to a maximum
supported length (currently 15 bytes). for LC_MESSAGES, the name is
kept regardless of whether libc itself can use such a message
translation locale, since applications using catgets or gettext should
be able to use message locales libc is not aware of. for other
categories, names which are not successfully loaded as locales (which,
at present, means all names) are treated as aliases for "C". setlocale
never fails.
locale settings are not yet used anywhere, so this commit should have
no visible effects except for the contents of the string returned by
setlocale.
2014-07-02 19:33:19 -04:00
|
|
|
struct __locale_struct {
|
2015-05-27 03:22:52 -04:00
|
|
|
const struct __locale_map *volatile cat[6];
|
add locale framework
this commit adds non-stub implementations of setlocale, duplocale,
newlocale, and uselocale, along with the data structures and minimal
code needed for representing the active locale on a per-thread basis
and optimizing the common case where thread-local locale settings are
not in use.
at this point, the data structures only contain what is necessary to
represent LC_CTYPE (a single flag) and LC_MESSAGES (a name for use in
finding message translation files). representation for the other
categories will be added later; the expectation is that a single
pointer will suffice for each.
for LC_CTYPE, the strings "C" and "POSIX" are treated as special; any
other string is accepted and treated as "C.UTF-8". for other
categories, any string is accepted after being truncated to a maximum
supported length (currently 15 bytes). for LC_MESSAGES, the name is
kept regardless of whether libc itself can use such a message
translation locale, since applications using catgets or gettext should
be able to use message locales libc is not aware of. for other
categories, names which are not successfully loaded as locales (which,
at present, means all names) are treated as aliases for "C". setlocale
never fails.
locale settings are not yet used anywhere, so this commit should have
no visible effects except for the contents of the string returned by
setlocale.
2014-07-02 19:33:19 -04:00
|
|
|
};
|
|
|
|
|
2011-02-20 22:30:06 -05:00
|
|
|
struct __libc {
|
always initialize thread pointer at program start
this is the first step in an overhaul aimed at greatly simplifying and
optimizing everything dealing with thread-local state.
previously, the thread pointer was initialized lazily on first access,
or at program startup if stack protector was in use, or at certain
random places where inconsistent state could be reached if it were not
initialized early. while believed to be fully correct, the logic was
fragile and non-obvious.
in the first phase of the thread pointer overhaul, support is retained
(and in some cases improved) for systems/situation where loading the
thread pointer fails, e.g. old kernels.
some notes on specific changes:
- the confusing use of libc.main_thread as an indicator that the
thread pointer is initialized is eliminated in favor of an explicit
has_thread_pointer predicate.
- sigaction no longer needs to ensure that the thread pointer is
initialized before installing a signal handler (this was needed to
prevent a situation where the signal handler caused the thread
pointer to be initialized and the subsequent sigreturn cleared it
again) but it still needs to ensure that implementation-internal
thread-related signals are not blocked.
- pthread tsd initialization for the main thread is deferred in a new
manner to minimize bloat in the static-linked __init_tp code.
- pthread_setcancelstate no longer needs special handling for the
situation before the thread pointer is initialized. it simply fails
on systems that cannot support a thread pointer, which are
non-conforming anyway.
- pthread_cleanup_push/pop now check for missing thread pointer and
nop themselves out in this case, so stdio no longer needs to avoid
the cancellable path when the thread pointer is not available.
a number of cases remain where certain interfaces may crash if the
system does not support a thread pointer. at this point, these should
be limited to pthread interfaces, and the number of such cases should
be fewer than before.
2014-03-24 16:57:11 -04:00
|
|
|
int can_do_threads;
|
2011-04-17 16:53:54 -04:00
|
|
|
int threaded;
|
2011-08-23 09:37:39 -04:00
|
|
|
int secure;
|
2011-02-12 00:22:29 -05:00
|
|
|
volatile int threads_minus_1;
|
2015-04-13 19:24:51 -04:00
|
|
|
size_t *auxv;
|
2012-10-05 11:51:50 -04:00
|
|
|
size_t tls_size;
|
2013-09-15 02:00:32 +00:00
|
|
|
size_t page_size;
|
add locale framework
this commit adds non-stub implementations of setlocale, duplocale,
newlocale, and uselocale, along with the data structures and minimal
code needed for representing the active locale on a per-thread basis
and optimizing the common case where thread-local locale settings are
not in use.
at this point, the data structures only contain what is necessary to
represent LC_CTYPE (a single flag) and LC_MESSAGES (a name for use in
finding message translation files). representation for the other
categories will be added later; the expectation is that a single
pointer will suffice for each.
for LC_CTYPE, the strings "C" and "POSIX" are treated as special; any
other string is accepted and treated as "C.UTF-8". for other
categories, any string is accepted after being truncated to a maximum
supported length (currently 15 bytes). for LC_MESSAGES, the name is
kept regardless of whether libc itself can use such a message
translation locale, since applications using catgets or gettext should
be able to use message locales libc is not aware of. for other
categories, names which are not successfully loaded as locales (which,
at present, means all names) are treated as aliases for "C". setlocale
never fails.
locale settings are not yet used anywhere, so this commit should have
no visible effects except for the contents of the string returned by
setlocale.
2014-07-02 19:33:19 -04:00
|
|
|
struct __locale_struct global_locale;
|
2011-02-20 22:30:06 -05:00
|
|
|
};
|
|
|
|
|
2013-09-15 02:00:32 +00:00
|
|
|
#ifndef PAGE_SIZE
|
|
|
|
#define PAGE_SIZE libc.page_size
|
|
|
|
#endif
|
|
|
|
|
2012-02-23 21:24:56 -05:00
|
|
|
#ifdef __PIC__
|
2012-12-07 16:16:44 -05:00
|
|
|
#define ATTR_LIBC_VISIBILITY __attribute__((visibility("hidden")))
|
2012-02-23 21:24:56 -05:00
|
|
|
#else
|
|
|
|
#define ATTR_LIBC_VISIBILITY
|
|
|
|
#endif
|
|
|
|
|
|
|
|
extern struct __libc __libc ATTR_LIBC_VISIBILITY;
|
2011-02-20 22:30:06 -05:00
|
|
|
#define libc __libc
|
2011-02-24 16:37:21 -05:00
|
|
|
|
2015-04-22 02:53:41 -04:00
|
|
|
extern size_t __hwcap ATTR_LIBC_VISIBILITY;
|
|
|
|
extern size_t __sysinfo ATTR_LIBC_VISIBILITY;
|
|
|
|
extern char *__progname, *__progname_full;
|
2011-02-12 00:22:29 -05:00
|
|
|
|
|
|
|
/* Designed to avoid any overhead in non-threaded processes */
|
use explicit visibility to optimize a few hot-path function calls
on x86 and some other archs, functions which make function calls which
might go through a PLT incur a significant overhead cost loading the
GOT register prior to making the call. this load is utterly useless in
musl, since all calls are bound at library-creation time using
-Bsymbolic-functions, but the compiler has no way of knowing this, and
attempts to set the default visibility to protected have failed due to
bugs in GCC and binutils.
this commit simply manually assigns hidden/protected visibility, as
appropriate, to a few internal-use-only functions which have many
callers, or which have callers that are hot paths like getc/putc. it
shaves about 5k off the i386 libc.so with -Os. many of the
improvements are in syscall wrappers, where the benefit is just size
and performance improvement is unmeasurable noise amid the syscall
overhead. however, stdio may be measurably faster.
if in the future there are toolchains that can do the same thing
globally without introducing linking bugs, it might be worth
considering removing these workarounds.
2012-10-25 15:40:58 -04:00
|
|
|
void __lock(volatile int *) ATTR_LIBC_VISIBILITY;
|
|
|
|
void __unlock(volatile int *) ATTR_LIBC_VISIBILITY;
|
|
|
|
int __lockfile(FILE *) ATTR_LIBC_VISIBILITY;
|
|
|
|
void __unlockfile(FILE *) ATTR_LIBC_VISIBILITY;
|
2013-09-20 02:00:27 -04:00
|
|
|
#define LOCK(x) __lock(x)
|
|
|
|
#define UNLOCK(x) __unlock(x)
|
2011-02-12 00:22:29 -05:00
|
|
|
|
new attempt at making set*id() safe and robust
changing credentials in a multi-threaded program is extremely
difficult on linux because it requires synchronizing the change
between all threads, which have their own thread-local credentials on
the kernel side. this is further complicated by the fact that changing
the real uid can fail due to exceeding RLIMIT_NPROC, making it
possible that the syscall will succeed in some threads but fail in
others.
the old __rsyscall approach being replaced was robust in that it would
report failure if any one thread failed, but in this case, the program
would be left in an inconsistent state where individual threads might
have different uid. (this was not as bad as glibc, which would
sometimes even fail to report the failure entirely!)
the new approach being committed refuses to change real user id when
it cannot temporarily set the rlimit to infinity. this is completely
POSIX conformant since POSIX does not require an implementation to
allow real-user-id changes for non-privileged processes whatsoever.
still, setting the real uid can fail due to memory allocation in the
kernel, but this can only happen if there is not already a cached
object for the target user. thus, we forcibly serialize the syscalls
attempts, and fail the entire operation on the first failure. this
*should* lead to an all-or-nothing success/failure result, but it's
still fragile and highly dependent on kernel developers not breaking
things worse than they're already broken.
ideally linux will eventually add a CLONE_USERCRED flag that would
give POSIX conformant credential changes without any hacks from
userspace, and all of this code would become redundant and could be
removed ~10 years down the line when everyone has abandoned the old
broken kernels. i'm not holding my breath...
2011-07-29 22:59:44 -04:00
|
|
|
void __synccall(void (*)(void *), void *);
|
|
|
|
int __setxid(int, int, int, int);
|
2011-04-06 20:27:07 -04:00
|
|
|
|
2011-02-12 00:22:29 -05:00
|
|
|
extern char **__environ;
|
|
|
|
|
|
|
|
#undef weak_alias
|
|
|
|
#define weak_alias(old, new) \
|
|
|
|
extern __typeof(old) new __attribute__((weak, alias(#old)))
|
|
|
|
|
|
|
|
#undef LFS64_2
|
2012-05-31 23:12:31 -04:00
|
|
|
#define LFS64_2(x, y) weak_alias(x, y)
|
2011-02-12 00:22:29 -05:00
|
|
|
|
|
|
|
#undef LFS64
|
|
|
|
#define LFS64(x) LFS64_2(x, x##64)
|
|
|
|
|
|
|
|
#endif
|