[git commit prelink] Allow ABIs where SP points below the stack frame.

Bernd Schmidt bernds at codesourcery.com
Wed Apr 6 13:19:48 UTC 2011


commit: http://git.uclibc.org/uClibc/commit/?id=817f685f4c65ed1af6eef79749b1f158eedd5bfc
branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/prelink

On C6X, the stack pointer points to a word that is not part of the current
function's stack frame.  It may be overwritten by callees.  Take this into
account when creating the stack for a cloned thread.

Signed-off-by: Bernd Schmidt <bernds at codesourcery.com>
---
 libpthread/linuxthreads.old/manager.c |   18 +++++++++++-------
 1 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/libpthread/linuxthreads.old/manager.c b/libpthread/linuxthreads.old/manager.c
index 52c1ea9..85fee5e 100644
--- a/libpthread/linuxthreads.old/manager.c
+++ b/libpthread/linuxthreads.old/manager.c
@@ -35,6 +35,9 @@
 #include "semaphore.h"
 #include "debug.h" /* PDEBUG, added by StS */
 
+#ifndef THREAD_STACK_OFFSET
+#define THREAD_STACK_OFFSET 0
+#endif
 
 /* poll() is not supported in kernel <= 2.0, therefore is __NR_poll is
  * not available, we assume an old Linux kernel is in use and we will
@@ -476,6 +479,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
   int pid;
   pthread_descr new_thread;
   char * new_thread_bottom;
+  char * new_thread_top;
   pthread_t new_thread_id;
   char *guardaddr = NULL;
   size_t guardsize = 0;
@@ -561,7 +565,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
   /* Do the cloning.  We have to use two different functions depending
      on whether we are debugging or not.  */
   pid = 0;     /* Note that the thread never can have PID zero.  */
-
+  new_thread_top = ((char *)new_thread - THREAD_STACK_OFFSET);
 
   /* ******************************************************** */
   /*  This code was moved from below to cope with running threads
@@ -588,12 +592,12 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
 
 	  /* We have to report this event.  */
 #ifdef __ia64__
-	  pid = __clone2(pthread_start_thread_event, (void **) new_thread,
-			(char *)new_thread - new_thread_bottom,
+	  pid = __clone2(pthread_start_thread_event, new_thread_top,
+			new_thread_top - new_thread_bottom,
 			CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
 			__pthread_sig_cancel, new_thread);
 #else
-	  pid = clone(pthread_start_thread_event, (void **) new_thread,
+	  pid = clone(pthread_start_thread_event, new_thread_top,
 			CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
 			__pthread_sig_cancel, new_thread);
 #endif
@@ -626,12 +630,12 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
     {
       PDEBUG("cloning new_thread = %p\n", new_thread);
 #ifdef __ia64__
-      pid = __clone2(pthread_start_thread, (void **) new_thread,
-			(char *)new_thread - new_thread_bottom,
+      pid = __clone2(pthread_start_thread, new_thread_top,
+		    new_thread_top - new_thread_bottom,
 		    CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
 		    __pthread_sig_cancel, new_thread);
 #else
-      pid = clone(pthread_start_thread, (void **) new_thread,
+      pid = clone(pthread_start_thread, new_thread_top,
 		    CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
 		    __pthread_sig_cancel, new_thread);
 #endif
-- 
1.7.3.4



More information about the uClibc-cvs mailing list