[d-kernel] kernel 2.4.32 .. 36 & pthreads проблема
    gosha 
    gosha на elins.ru
       
    Пн Фев  4 22:03:11 MSK 2008
    
    
  
                          Добрый день.
   Существует плета на базе MIPS процессора.
   Плата поддерживается ядрами 2.6.18 и 2.4.36
   Для тестирования ядра используется один и тот же раздел HDD с одним и тем же glibc и пр.
Имеем тестовую программку:
/*==================================================*/
#include <pthread.h>
#include <stdio.h>
int check_me = 0;
void* func(void* data) 
{int i;
 printf("%s> check_me=0x%p==%d ...\r\n", __FUNCTION__, &check_me, check_me);
 getchar();
 check_me = 42; 
 fflush(stdout);
 return &check_me;
}
 int main()
 {pthread_t t;
   void *ret;
   printf("thread_create ...\r\n");
   fflush(stdout);
   pthread_create (&t, 0, func, 0);
   printf("pthread_join ...\r\n");
   fflush(stdout);
   fflush(stdout);
   thread_join (t, &ret);
   printf("%s> check_me=0x%p==%d ...\r\n", __FUNCTION__, &check_me, check_me);
   printf("return . . \r\n");
   fflush(stdout);
   return (check_me != 42 || ret != &check_me);
}
/*==================================================*/
   При пользовании ядра 2.6.18 - все ok,
   При пользовании ядра 2.4.32 .. 36 странным образом ломаются pthreads:
             - glibc собрано без поддержки nptl;
	     - после старта программы появляются 3 thread:
					1. родитель;
					2. __pthread_manager() из glibc;
					3. потомок;
	     - после нажатия кнопочки (см исходный текст тестового примера) срабатывает getchar() потомок завершается;
	     - при попытке забрать код завершения, __pthread_manager() получает SISSEGV в функции   
                                           int *__errno_location (void), 
             Но если запустить ту же тестовую программку под GDB- все проходит ok.
   Как бы (каким методом) можно было локализовать и исправить данную проблему?
  Спасибо.
    
    
Подробная информация о списке рассылки devel-kernel