fix namespace clash (libc) in dynlink.c

this makes it so the #undef libc and __libc name are no longer needed,
which were problematic because the "accessor function" mode for
accessing the libc struct could not be used, breaking build on any
compiler without (working) visibility.
This commit is contained in:
Rich Felker 2012-10-13 23:25:20 -04:00
parent 31f340a17a
commit e23d358fd6
1 changed files with 13 additions and 14 deletions

View File

@ -19,7 +19,6 @@
#include <dlfcn.h> #include <dlfcn.h>
#include "pthread_impl.h" #include "pthread_impl.h"
#include "libc.h" #include "libc.h"
#undef libc
static int errflag; static int errflag;
static char errbuf[128]; static char errbuf[128];
@ -90,7 +89,7 @@ struct symdef {
void __init_ssp(size_t *); void __init_ssp(size_t *);
void *__install_initial_tls(void *); void *__install_initial_tls(void *);
static struct dso *head, *tail, *libc, *fini_head; static struct dso *head, *tail, *ldso, *fini_head;
static char *env_path, *sys_path, *r_path; static char *env_path, *sys_path, *r_path;
static int ssp_used; static int ssp_used;
static int runtime; static int runtime;
@ -446,12 +445,12 @@ static struct dso *load_library(const char *name)
size_t l = z-name; size_t l = z-name;
for (rp=reserved; *rp && memcmp(name+3, rp, l-3); rp+=strlen(rp)+1); for (rp=reserved; *rp && memcmp(name+3, rp, l-3); rp+=strlen(rp)+1);
if (*rp) { if (*rp) {
if (!libc->prev) { if (!ldso->prev) {
tail->next = libc; tail->next = ldso;
libc->prev = tail; ldso->prev = tail;
tail = libc->next ? libc->next : libc; tail = ldso->next ? ldso->next : ldso;
} }
return libc; return ldso;
} }
} }
} }
@ -514,7 +513,7 @@ static struct dso *load_library(const char *name)
if (runtime && temp_dso.tls_image) { if (runtime && temp_dso.tls_image) {
size_t per_th = temp_dso.tls_size + temp_dso.tls_align size_t per_th = temp_dso.tls_size + temp_dso.tls_align
+ sizeof(void *) * (tls_cnt+3); + sizeof(void *) * (tls_cnt+3);
n_th = __libc.threads_minus_1 + 1; n_th = libc.threads_minus_1 + 1;
if (n_th > SSIZE_MAX / per_th) alloc_size = SIZE_MAX; if (n_th > SSIZE_MAX / per_th) alloc_size = SIZE_MAX;
else alloc_size += n_th * per_th; else alloc_size += n_th * per_th;
} }
@ -665,7 +664,7 @@ static void do_fini()
static void do_init_fini(struct dso *p) static void do_init_fini(struct dso *p)
{ {
size_t dyn[DYN_CNT] = {0}; size_t dyn[DYN_CNT] = {0};
int need_locking = __libc.threads_minus_1; int need_locking = libc.threads_minus_1;
/* Allow recursive calls that arise when a library calls /* Allow recursive calls that arise when a library calls
* dlopen from one of its constructors, but block any * dlopen from one of its constructors, but block any
* other threads until all ctors have finished. */ * other threads until all ctors have finished. */
@ -698,7 +697,7 @@ void *__copy_tls(unsigned char *mem)
void **dtv = (void *)mem; void **dtv = (void *)mem;
dtv[0] = (void *)tls_cnt; dtv[0] = (void *)tls_cnt;
mem += __libc.tls_size - sizeof(struct pthread); mem += libc.tls_size - sizeof(struct pthread);
mem -= (uintptr_t)mem & (tls_align-1); mem -= (uintptr_t)mem & (tls_align-1);
mem -= tls_start; mem -= tls_start;
td = (pthread_t)mem; td = (pthread_t)mem;
@ -757,7 +756,7 @@ static void update_tls_size()
{ {
size_t below_tp = (1+tls_cnt) * sizeof(void *) + tls_offset; size_t below_tp = (1+tls_cnt) * sizeof(void *) + tls_offset;
size_t above_tp = sizeof(struct pthread) + tls_start + tls_align; size_t above_tp = sizeof(struct pthread) + tls_start + tls_align;
__libc.tls_size = ALIGN(below_tp + above_tp, tls_align); libc.tls_size = ALIGN(below_tp + above_tp, tls_align);
} }
void *__dynlink(int argc, char **argv) void *__dynlink(int argc, char **argv)
@ -899,7 +898,7 @@ void *__dynlink(int argc, char **argv)
* restore the initial chain in preparation for loading third * restore the initial chain in preparation for loading third
* party libraries (preload/needed). */ * party libraries (preload/needed). */
head = tail = app; head = tail = app;
libc = lib; ldso = lib;
app->next = lib; app->next = lib;
reloc_all(lib); reloc_all(lib);
app->next = 0; app->next = 0;
@ -926,12 +925,12 @@ void *__dynlink(int argc, char **argv)
update_tls_size(); update_tls_size();
if (tls_cnt) { if (tls_cnt) {
struct dso *p; struct dso *p;
void *mem = mmap(0, __libc.tls_size, PROT_READ|PROT_WRITE, void *mem = mmap(0, libc.tls_size, PROT_READ|PROT_WRITE,
MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
if (mem==MAP_FAILED || if (mem==MAP_FAILED ||
!__install_initial_tls(__copy_tls(mem))) { !__install_initial_tls(__copy_tls(mem))) {
dprintf(2, "%s: Error getting %zu bytes thread-local storage: %m\n", dprintf(2, "%s: Error getting %zu bytes thread-local storage: %m\n",
argv[0], __libc.tls_size); argv[0], libc.tls_size);
_exit(127); _exit(127);
} }
} }