Don't use regparm(3) for functions in ld.so called from libdl.so
authorMark Seaborn <mrs@mythic-beasts.com>
Wed, 22 Apr 2009 21:38:36 +0000 (22 22:38 +0100)
committerMark Seaborn <mrs@mythic-beasts.com>
Wed, 22 Apr 2009 21:42:17 +0000 (22 22:42 +0100)
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.

config.h.in
elf/dl-init.c
elf/rtld.c
sysdeps/generic/ldsodefs.h

index b5abb10..38ed751 100644 (file)
 /* 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.  */
index e7b6757..d70ee88 100644 (file)
@@ -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];
index 46bece7..cb70ee4 100644 (file)
@@ -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
index 4d85740..528d6e8 100644 (file)
@@ -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.  */