Support static IFUNC calls irrespective of USE_MULTIARCH.
This commit is contained in:
parent
0e1d99119e
commit
21ad055803
@ -1,3 +1,9 @@
|
|||||||
|
2012-08-21 Roland McGrath <roland@hack.frob.com>
|
||||||
|
|
||||||
|
* csu/elf-init.c (__libc_csu_irel): Function removed.
|
||||||
|
* csu/libc-start.c (apply_irel): New function.
|
||||||
|
(LIBC_START_MAIN): Call it instead of __libc_csu_irel.
|
||||||
|
|
||||||
2012-08-21 Joseph Myers <joseph@codesourcery.com>
|
2012-08-21 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/kernel-features.h
|
* sysdeps/unix/sysv/linux/kernel-features.h
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
/* Startup support for ELF initializers/finalizers in the main executable.
|
/* Startup support for ELF initializers/finalizers in the main executable.
|
||||||
Copyright (C) 2002,2003,2004,2005,2009,2011
|
Copyright (C) 2002-2012 Free Software Foundation, Inc.
|
||||||
Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -36,20 +35,6 @@
|
|||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#if defined USE_MULTIARCH && !defined LIBC_NONSHARED
|
|
||||||
# include <link.h>
|
|
||||||
# include <dl-irel.h>
|
|
||||||
|
|
||||||
# ifdef ELF_MACHINE_IRELA
|
|
||||||
extern const ElfW(Rela) __rela_iplt_start [];
|
|
||||||
extern const ElfW(Rela) __rela_iplt_end [];
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifdef ELF_MACHINE_IREL
|
|
||||||
extern const ElfW(Rel) __rel_iplt_start [];
|
|
||||||
extern const ElfW(Rel) __rel_iplt_end [];
|
|
||||||
# endif
|
|
||||||
#endif /* LIBC_NONSHARED */
|
|
||||||
|
|
||||||
/* These magic symbols are provided by the linker. */
|
/* These magic symbols are provided by the linker. */
|
||||||
extern void (*__preinit_array_start []) (int, char **, char **)
|
extern void (*__preinit_array_start []) (int, char **, char **)
|
||||||
@ -72,33 +57,7 @@ extern void _fini (void);
|
|||||||
/* These functions are passed to __libc_start_main by the startup code.
|
/* These functions are passed to __libc_start_main by the startup code.
|
||||||
These get statically linked into each program. For dynamically linked
|
These get statically linked into each program. For dynamically linked
|
||||||
programs, this module will come from libc_nonshared.a and differs from
|
programs, this module will come from libc_nonshared.a and differs from
|
||||||
the libc.a module in that it doesn't call the preinit array and performs
|
the libc.a module in that it doesn't call the preinit array. */
|
||||||
explicit IREL{,A} relocations. */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef LIBC_NONSHARED
|
|
||||||
void
|
|
||||||
__libc_csu_irel (void)
|
|
||||||
{
|
|
||||||
# ifdef USE_MULTIARCH
|
|
||||||
# ifdef ELF_MACHINE_IRELA
|
|
||||||
{
|
|
||||||
const size_t size = __rela_iplt_end - __rela_iplt_start;
|
|
||||||
for (size_t i = 0; i < size; i++)
|
|
||||||
elf_irela (&__rela_iplt_start [i]);
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifdef ELF_MACHINE_IREL
|
|
||||||
{
|
|
||||||
const size_t size = __rel_iplt_end - __rel_iplt_start;
|
|
||||||
for (size_t i = 0; i < size; i++)
|
|
||||||
elf_irel (&__rel_iplt_start [i]);
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1998-2006, 2007, 2009 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -46,6 +46,38 @@ uintptr_t __stack_chk_guard attribute_relro;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SHARED
|
||||||
|
# include <link.h>
|
||||||
|
# include <dl-irel.h>
|
||||||
|
|
||||||
|
# ifdef ELF_MACHINE_IRELA
|
||||||
|
# define IREL_T ElfW(Rela)
|
||||||
|
# define IPLT_START __rela_iplt_start
|
||||||
|
# define IPLT_END __rela_iplt_end
|
||||||
|
# define IREL elf_irela
|
||||||
|
# elif defined ELF_MACHINE_IREL
|
||||||
|
# define IREL_T ElfW(Rel)
|
||||||
|
# define IPLT_START __rel_iplt_start
|
||||||
|
# define IPLT_END __rel_iplt_end
|
||||||
|
# define IREL elf_irel
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* We use weak references for these so that we'll still work with a linker
|
||||||
|
that doesn't define them. Such a linker doesn't support IFUNC at all
|
||||||
|
and so uses won't work, but a statically-linked program that doesn't
|
||||||
|
use any IFUNC symbols won't have a problem. */
|
||||||
|
extern const IREL_T IPLT_START[] __attribute__ ((weak));
|
||||||
|
extern const IREL_T IPLT_END[] __attribute__ ((weak));
|
||||||
|
|
||||||
|
static void
|
||||||
|
apply_irel (void)
|
||||||
|
{
|
||||||
|
for (const IREL_T *ipltent = IPLT_START; ipltent < IPLT_END; ++ipltent)
|
||||||
|
IREL (ipltent);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef LIBC_START_MAIN
|
#ifdef LIBC_START_MAIN
|
||||||
# ifdef LIBC_START_DISABLE_INLINE
|
# ifdef LIBC_START_DISABLE_INLINE
|
||||||
# define STATIC static
|
# define STATIC static
|
||||||
@ -136,8 +168,8 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
|
|||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Performe IREL{,A} relocations. */
|
/* Perform IREL{,A} relocations. */
|
||||||
__libc_csu_irel ();
|
apply_irel ();
|
||||||
|
|
||||||
/* Initialize the thread library at least a bit since the libgcc
|
/* Initialize the thread library at least a bit since the libgcc
|
||||||
functions are using thread functions if these are available and
|
functions are using thread functions if these are available and
|
||||||
|
Loading…
x
Reference in New Issue
Block a user