Skip to content

Commit

Permalink
csu: Use ELF constructor instead of _init in libc.so
Browse files Browse the repository at this point in the history
On !ELF_INITFINI architectures, _init is no longer called by the
dynamic linker.  We can use an ELF constructor instead because the
constructor order does not matter.  (The other constructors are used
to set up libio vtable bypasses and do not depend on this
initialization routine.)
  • Loading branch information
fweimer-rh committed Feb 25, 2020
1 parent a92ac9f commit 783e641
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 8 deletions.
12 changes: 6 additions & 6 deletions csu/init-first.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,11 @@ void
__libc_init_first (int argc, char **argv, char **envp)
{
#ifdef SHARED
/* For DSOs we do not need __libc_init_first but instead _init. */
/* For DSOs we do not need __libc_init_first but an ELF constructor. */
}

void
attribute_hidden
_init (int argc, char **argv, char **envp)
static void __attribute__ ((constructor))
_init_first (int argc, char **argv, char **envp)
{
#endif

Expand Down Expand Up @@ -86,8 +85,9 @@ _init (int argc, char **argv, char **envp)

/* This function is defined here so that if this file ever gets into
ld.so we will get a link error. Having this file silently included
in ld.so causes disaster, because the _init definition above will
cause ld.so to gain an init function, which is not a cool thing. */
in ld.so causes disaster, because the _init_first definition above
will cause ld.so to gain an ELF constructor, which is not a cool
thing. */

extern void _dl_start (void) __attribute__ ((noreturn));

Expand Down
2 changes: 1 addition & 1 deletion elf/soinit.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ run_hooks (void (*const list[]) (void))
(**list) ();
}

/* This function will be called from _init in init-first.c. */
/* This function will be called from _init_first in init-first.c. */
void
__libc_global_ctors (void)
{
Expand Down
2 changes: 1 addition & 1 deletion include/libc-internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
/* Initialize the `__libc_enable_secure' flag. */
extern void __libc_init_secure (void);

/* This function will be called from _init in init-first.c. */
/* This function will be called from _init_first in init-first.c. */
extern void __libc_global_ctors (void);

/* Discover the tick frequency of the machine if something goes wrong,
Expand Down

0 comments on commit 783e641

Please sign in to comment.