aboutsummaryrefslogtreecommitdiff
path: root/elf/dl-runtime.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-07-14 15:10:51 +0000
committerUlrich Drepper <drepper@redhat.com>1999-07-14 15:10:51 +0000
commitc33bd0123ed605d201ee43dcd80998b6ab858022 (patch)
treeb6a80d68585492ea2b257a7fcd4b7f28873bebad /elf/dl-runtime.c
parentc68cb81185c18b59d974620c3679f90ee4f6c487 (diff)
downloadglibc-c33bd0123ed605d201ee43dcd80998b6ab858022.tar
glibc-c33bd0123ed605d201ee43dcd80998b6ab858022.tar.gz
glibc-c33bd0123ed605d201ee43dcd80998b6ab858022.tar.bz2
glibc-c33bd0123ed605d201ee43dcd80998b6ab858022.zip
Update.
1999-07-13 Andreas Schwab <schwab@suse.de> * elf/dl-runtime.c (fixup, profile_fixup): Call alloca to prevent inlining. Fixes PR libc/1198.
Diffstat (limited to 'elf/dl-runtime.c')
-rw-r--r--elf/dl-runtime.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c
index a0f54bd3fc..9f3004ecf5 100644
--- a/elf/dl-runtime.c
+++ b/elf/dl-runtime.c
@@ -57,6 +57,12 @@ fixup (
void *const rel_addr = (void *)(l->l_addr + reloc->r_offset);
ElfW(Addr) value;
+ /* The use of `alloca' here looks ridiculous but it helps. The goal is
+ to prevent the function from being inlined and thus optimized out.
+ There is no official way to do this so we use this trick. gcc never
+ inlines functions which use `alloca'. */
+ alloca (sizeof (int));
+
/* Sanity check that we're really looking at a PLT relocation. */
assert (ELFW(R_TYPE)(reloc->r_info) == ELF_MACHINE_JMP_SLOT);
@@ -110,6 +116,12 @@ profile_fixup (
ElfW(Addr) *resultp;
ElfW(Addr) value;
+ /* The use of `alloca' here looks ridiculous but it helps. The goal is
+ to prevent the function from being inlined, and thus optimized out.
+ There is no official way to do this so we use this trick. gcc never
+ inlines functions which use `alloca'. */
+ alloca (sizeof (int));
+
/* This is the address in the array where we store the result of previous
relocations. */
resultp = &l->l_reloc_result[reloc_offset / sizeof (PLTREL)];