From: Mark Seaborn Date: Wed, 22 Apr 2009 21:38:36 +0000 (+0100) Subject: Don't use regparm(3) for functions in ld.so called from libdl.so X-Git-Tag: nacl-dynlink-0.1~8 X-Git-Url: https://repo.or.cz/w/glibc/nacl-glibc.git/commitdiff_plain/93e9ad06cc80b14f5ab8007105867926f040215e Don't use regparm(3) for functions in ld.so called from libdl.so because %ecx is clobbered when calling functions through PLT entries. This fixes dlopen(). There are a couple of functions that are called from assembly code and so still need to be defined with regparm. --- diff --git a/config.h.in b/config.h.in index b5abb10187..38ed751399 100644 --- a/config.h.in +++ b/config.h.in @@ -144,7 +144,7 @@ /* Defined to some form of __attribute__ ((...)) if the compiler supports a different, more efficient calling convention. */ #if defined USE_REGPARMS && !defined PROF && !defined __BOUNDED_POINTERS__ -# define internal_function __attribute__ ((regparm (3), stdcall)) +/* # define internal_function __attribute__ ((regparm (3), stdcall)) */ #endif /* Linux specific: minimum supported kernel version. */ diff --git a/elf/dl-init.c b/elf/dl-init.c index e7b67570fd..d70ee88fb3 100644 --- a/elf/dl-init.c +++ b/elf/dl-init.c @@ -89,6 +89,7 @@ call_init (struct link_map *l, int argc, char **argv, char **env) void internal_function +__attribute__ ((regparm (3), stdcall)) _dl_init (struct link_map *main_map, int argc, char **argv, char **env) { ElfW(Dyn) *preinit_array = main_map->l_info[DT_PREINIT_ARRAY]; diff --git a/elf/rtld.c b/elf/rtld.c index 46bece7fa3..cb70ee4374 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -353,6 +353,7 @@ _dl_start_final (void *arg, struct dl_start_final_info *info) } static ElfW(Addr) __attribute_used__ internal_function +__attribute__ ((regparm (3), stdcall)) _dl_start (void *arg) { #ifdef DONT_USE_BOOTSTRAP_MAP diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index 4d857404a3..528d6e89de 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -916,7 +916,8 @@ extern int _dl_check_map_versions (struct link_map *map, int verbose, /* Initialize the object in SCOPE by calling the constructors with ARGC, ARGV, and ENV as the parameters. */ extern void _dl_init (struct link_map *main_map, int argc, char **argv, - char **env) internal_function attribute_hidden; + char **env) internal_function attribute_hidden + __attribute__ ((regparm (3), stdcall)); /* Call the finalizer functions of all shared objects whose initializer functions have completed. */