Browse Source

Complete the ld.so boot cleanup: move most libc initialization from

_csu_finish() to _libc_preinit(), which is an .init_array function
in shared libc (and mark it INITFIRST) or a .preinit_array function
in static libc, grabbing the _dl_cb callback there from ld.so.  Then
in _csu_finish(), invoke the dl_clean_boot() callback to free ld.so's
startup bits before main() gets control.
Other cleanups this permits:
- move various startup structures into .data.rel.ro
- the dl* stubs in libc can be strong and call the callbacks provided
via _dl_cb
- no longer need to conditionalize dlctl() calls on presence of _DYNAMIC
original concept and full diff ok kettenis@
ok deraadt@
OPENBSD_6_6
guenther 5 years ago
parent
commit
dd9a969523
1 changed files with 2 additions and 7 deletions
  1. +2
    -7
      src/lib/libc/stdlib/thread_atexit.c

+ 2
- 7
src/lib/libc/stdlib/thread_atexit.c View File

@ -1,4 +1,4 @@
/* $OpenBSD: thread_atexit.c,v 1.1 2017/12/16 20:06:56 guenther Exp $ */
/* $OpenBSD: thread_atexit.c,v 1.2 2019/06/02 01:03:01 guenther Exp $ */
/*
* Copyright (c) 2017 Mark Kettenis <kettenis@openbsd.org>
*
@ -16,15 +16,11 @@
*/
#include <dlfcn.h>
#include <elf.h>
#pragma weak _DYNAMIC
#include <stdlib.h>
#include <tib.h>
#include "atexit.h"
typeof(dlctl) dlctl asm("_dlctl") __attribute__((weak));
__weak_alias(__cxa_thread_atexit, __cxa_thread_atexit_impl);
int
@ -37,8 +33,7 @@ __cxa_thread_atexit_impl(void (*func)(void *), void *arg, void *dso)
if (fnp == NULL)
return -1;
if (_DYNAMIC)
dlctl(NULL, DL_REFERENCE, dso);
dlctl(NULL, DL_REFERENCE, dso);
fnp->func = func;
fnp->arg = arg;


Loading…
Cancel
Save