summaryrefslogtreecommitdiff
path: root/sysdeps/generic/segfault.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-02-07 21:21:33 +0000
committerUlrich Drepper <drepper@redhat.com>1999-02-07 21:21:33 +0000
commit48f6496e3fdb55c66088c5122779d400f2b3ac39 (patch)
tree113b269feb61866faad367f3fa0cc71def662237 /sysdeps/generic/segfault.c
parente1f601e87837e586eb6acc1de087aedbc85ea7d4 (diff)
Update.
1999-02-07 Ulrich Drepper <drepper@cygnus.com> * elf/dl-lookup.c: Increment _dl_num_relocations in the four entry point functions, not do_lookup since the later can be called more than once.
Diffstat (limited to 'sysdeps/generic/segfault.c')
-rw-r--r--sysdeps/generic/segfault.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/sysdeps/generic/segfault.c b/sysdeps/generic/segfault.c
index 502b239602..848dae43dc 100644
--- a/sysdeps/generic/segfault.c
+++ b/sysdeps/generic/segfault.c
@@ -1,5 +1,5 @@
/* Catch segmentation faults and print backtrace.
- Copyright (C) 1998 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@@ -61,9 +61,15 @@ extern void *__libc_stack_end;
# define INNER_THAN <
#endif
+/* By default assume the `next' pointer in struct layout points to the
+ next struct layout. */
+#ifndef ADVANCE_STACK_FRAME
+# define ADVANCE_STACK_FRAME(next) ((struct layout *) (next))
+#endif
+
struct layout
{
- struct layout *next;
+ void *next;
void *return_address;
};
@@ -118,7 +124,7 @@ catch_segfault (int signal, SIGCONTEXT ctx)
{
++cnt;
- current = current->next;
+ current = ADVANCE_STACK_FRAME (current->next);
}
arr = alloca (cnt * sizeof (void *));
@@ -133,7 +139,7 @@ catch_segfault (int signal, SIGCONTEXT ctx)
{
arr[cnt++] = current->return_address;
- current = current->next;
+ current = ADVANCE_STACK_FRAME (current->next);
}
/* If the last return address was NULL, assume that it doesn't count. */
@@ -179,7 +185,7 @@ install_handler (void)
sa.sa_flags |= SA_ONSTACK;
}
}
-
+
if (sigs == NULL)
sigaction (SIGSEGV, &sa, NULL);
else if (sigs[0] == '\0')