From: Ulrich Drepper Date: Fri, 21 Mar 1997 20:27:07 +0000 (+0000) Subject: [PROF] (_dl_runtime_resolve): Don't use regparam mechanism for call of X-Git-Tag: cvs/glibc-2_0_2~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0af17c40dff3a93b6be42da2b52f8be4a7f08773;p=thirdparty%2Fglibc.git [PROF] (_dl_runtime_resolve): Don't use regparam mechanism for call of `fixup' call. --- diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h index 9af800cd48e..c9299e9b674 100644 --- a/sysdeps/i386/dl-machine.h +++ b/sysdeps/i386/dl-machine.h @@ -70,11 +70,16 @@ elf_machine_load_address (void) (dynamic_info)[DT_RELSZ]->d_un.d_val -= sizeof (Elf32_Rel); +#ifndef PROF /* We add a declaration of this function here so that in dl-runtime.c the ELF_MACHINE_RUNTIME_TRAMPOLINE macro really can pass the parameters - in registers. */ + in registers. + + We cannot use this scheme for profiling because the _mcount call + destroys the passed register information. */ static ElfW(Addr) fixup (struct link_map *l, ElfW(Word) reloc_offset) __attribute__ ((regparm (2), unused)); +#endif /* Set up the loaded object described by L so its unrelocated PLT entries will jump to the on-demand fixup code in dl-runtime.c. */ @@ -101,7 +106,8 @@ elf_machine_runtime_setup (struct link_map *l, int lazy) /* This code is used in dl-runtime.c to call the `fixup' function and then redirect to the address it returns. */ -#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ +#ifndef PROF +# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ .globl _dl_runtime_resolve .type _dl_runtime_resolve, @function _dl_runtime_resolve: @@ -117,6 +123,28 @@ _dl_runtime_resolve: ret $8 # Jump to function address. .size _dl_runtime_resolve, .-_dl_runtime_resolve "); +#else +# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ + .globl _dl_runtime_resolve + .type _dl_runtime_resolve, @function +_dl_runtime_resolve: + pushl %eax # Preserve registers otherwise clobbered. + pushl %ecx + pushl %edx + movl 16(%esp), %edx # Push the arguments for `fixup' + movl 12(%esp), %eax + pushl %edx + pushl %eax + call fixup # Call resolver. + popl %edx # Pop the parameters + popl %ecx + popl %edx # Get register content back. + popl %ecx + xchgl %eax, (%esp) # Get %eax contents end store function address. + ret $8 # Jump to function address. + .size _dl_runtime_resolve, .-_dl_runtime_resolve +"); +#endif /* The PLT uses Elf32_Rel relocs. */ #define elf_machine_relplt elf_machine_rel }