Пример #1
0
void __init_tls(size_t *aux)
{
	unsigned char *p, *mem;
	size_t n;
	Phdr *phdr, *tls_phdr=0;
	size_t base = 0;

	libc.tls_size = sizeof(struct pthread);

	for (p=(void *)aux[AT_PHDR],n=aux[AT_PHNUM]; n; n--,p+=aux[AT_PHENT]) {
		phdr = (void *)p;
		if (phdr->p_type == PT_PHDR)
			base = aux[AT_PHDR] - phdr->p_vaddr;
		if (phdr->p_type == PT_TLS)
			tls_phdr = phdr;
	}
	if (!tls_phdr) return;

	image = (void *)(base + tls_phdr->p_vaddr);
	len = tls_phdr->p_filesz;
	size = tls_phdr->p_memsz;
	align = tls_phdr->p_align;

	size += (-size - (uintptr_t)image) & (align-1);
	if (align < 4*sizeof(size_t)) align = 4*sizeof(size_t);

	libc.tls_size = 2*sizeof(void *)+size+align+sizeof(struct pthread);

	mem = __mmap(0, libc.tls_size, PROT_READ|PROT_WRITE,
		MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
	if (!__install_initial_tls(__copy_tls(mem))) a_crash();
}
Пример #2
0
static void static_init_tls(size_t* aux) {
  unsigned char* p;
  size_t n;
  Phdr *phdr, *tls_phdr = 0;
  size_t base = 0;
  void* mem;

  for (p = (void*)aux[AT_PHDR], n = aux[AT_PHNUM]; n; n--, p += aux[AT_PHENT]) {
    phdr = (void*)p;
    if (phdr->p_type == PT_PHDR)
      base = aux[AT_PHDR] - phdr->p_vaddr;
    if (phdr->p_type == PT_TLS)
      tls_phdr = phdr;
  }

  if (tls_phdr) {
    main_tls.image = (void*)(base + tls_phdr->p_vaddr);
    main_tls.len = tls_phdr->p_filesz;
    main_tls.size = tls_phdr->p_memsz;
    main_tls.align = tls_phdr->p_align;
    libc.tls_cnt = 1;
    libc.tls_head = &main_tls;
  }

  main_tls.size +=
      (-main_tls.size - (uintptr_t)main_tls.image) & (main_tls.align - 1);
  if (main_tls.align < MIN_TLS_ALIGN)
    main_tls.align = MIN_TLS_ALIGN;
#ifndef TLS_ABOVE_TP
  main_tls.offset = main_tls.size;
#endif

  libc.tls_align = main_tls.align;
  libc.tls_size = 2 * sizeof(void*) + sizeof(struct pthread) + main_tls.size +
                      main_tls.align + MIN_TLS_ALIGN - 1 &
                  -MIN_TLS_ALIGN;

  if (libc.tls_size > sizeof builtin_tls) {
#ifndef SYS_mmap2
#define SYS_mmap2 SYS_mmap
#endif
    mem = (void*)__syscall(SYS_mmap2, 0, libc.tls_size, PROT_READ | PROT_WRITE,
                           MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
    /* -4095...-1 cast to void * will crash on dereference anyway,
     * so don't bloat the init code checking for error codes and
     * explicitly calling a_crash(). */
  } else {
    mem = builtin_tls;
  }

  /* Failure to initialize thread pointer is always fatal. */
  if (__init_tp(__copy_tls(mem)) < 0)
    a_crash();
}
Пример #3
0
void __stack_chk_fail(void)
{
	a_crash();
}