فهرست منبع

adapted library paths to Debian Linux

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7318 8c9fc860-2736-0410-a75d-ab315db34111
eth.guenter 8 سال پیش
والد
کامیت
72e3b82cde
1فایلهای تغییر یافته به همراه119 افزوده شده و 220 حذف شده
  1. 119 220
      source/Generic.Linux.I386.Unix.Mod

+ 119 - 220
source/Generic.Linux.I386.Unix.Mod

@@ -14,9 +14,7 @@ CONST
 	Version* = "LinuxG32";
 
   	libcname* = "libc.so.6";
-	libmname* = "libm.so.6";
 	libX11name* = "libX11.so.6";
-	libXextname* = "libXext.so.6";
 	libpthreadname = "libpthread.so.0";
 
 	LittleEndian* = TRUE;   (** byte order of basic types *)
@@ -126,18 +124,18 @@ CONST
 	SIG_UNBLOCK=1;
 	SIG_SETMASK=2;
 
-	SA_NOCLDSTOP  = 0x00000001;
-	SA_SIGINFO =       0x00000004;
-	SA_ONSTACK  =    0x08000000;
-	SA_RESTART  =    0x10000000;
-	SA_NODEFER  =     0x40000000;
-	SA_RESETHAND  =  0x80000000;
+	SA_NOCLDSTOP	= 0x00000001;
+	SA_SIGINFO			= 0x00000004;
+	SA_ONSTACK		= 0x08000000;
+	SA_RESTART		= 0x10000000;
+	SA_NODEFER		= 0x40000000;
+	SA_RESETHAND	= 0x80000000;
 
-  PTHREAD_CANCEL_ENABLE 	= 0;
-  PTHREAD_CANCEL_DISABLE	= 1;
+	PTHREAD_CANCEL_ENABLE 	= 0;
+	PTHREAD_CANCEL_DISABLE	= 1;
 
-  PTHREAD_CANCEL_ASYNCHRONOUS	=0;
-  PTHREAD_CANCEL_DEFERRED	= 1;
+	PTHREAD_CANCEL_ASYNCHRONOUS	= 0;
+	PTHREAD_CANCEL_DEFERRED	= 1;
 
 	(*--------------------------- Threads -------------------------------*)
 
@@ -145,10 +143,7 @@ TYPE
 	Thread_t* = ADDRESS;
 	Mutex_t* = ADDRESS;
 	MutexType = ARRAY 8 OF ADDRESS;
-	(*
-	Mutex = ARRAY 8 OF ADDRESS;
-	Mutex_t* = POINTER TO Mutex;
-	*)
+
 	Condition_t* = ADDRESS;
 	ConditionType = ARRAY 12 OF WORD;
 
@@ -156,6 +151,11 @@ TYPE
 	SignalHandler = PROCEDURE ( sig: LONGINT; scp, ucp, dum: ADDRESS );
 
 	MutexAttributeType = ARRAY 1 OF WORD;
+	
+	pid_t *= LONGINT;
+	path_t *= ARRAY OF CHAR;
+	arg_t *= ARRAY OF CHAR;
+	argv_t *= ARRAY OF arg_t;
 
 
 CONST
@@ -240,28 +240,12 @@ CONST
 	   CS7*		= {5};
 	   CS8*		= {4,5};
 	CSTOPB*	= {6};
-	CREAD*	= {7};
+	CREAD*		= {7};
 	PARENB*	= {8};
 	PARODD*	= {9};
 	HUPCL*		= {10};
 	CLOCAL*	= {11};
 
-	(*
-	PTRACE_TRACEME     =        0;
-	PTRACE_PEEKTEXT    =        1;
-	PTRACE_PEEKDATA     =       2;
-	PTRACE_PEEKUSR     =        3;
-	PTRACE_POKETEXT    =        4;
-	PTRACE_POKEDATA    =        5;
-	PTRACE_POKEUSR    =         6;
-	PTRACE_CONT       =         7;
-	PTRACE_KILL           =     8;
-	PTRACE_SINGLESTEP    =      9;
-	PTRACE_ATTACH         =    16;
-	PTRACE_DETACH           =  17;
-	PTRACE_GETREGS  = 12;
-	PTRACE_SETREGS    = 13;
-	*)
 
 TYPE
 	Termios* = RECORD
@@ -356,7 +340,7 @@ TYPE
 				r_ds-		: ADDRESS;
 				r_di-		: ADDRESS;
 				r_si-		: ADDRESS;
-				r_bp *	: ADDRESS;
+				r_bp *		: ADDRESS;
 				r_sp_x-	: ADDRESS;
 				r_bx-		: ADDRESS;
 				r_dx-		: ADDRESS;
@@ -364,10 +348,10 @@ TYPE
 				r_ax-		: ADDRESS;
 				r_trapno-	: LONGINT;
 				r_err-		: LONGINT;
-				r_pc *	: ADDRESS;
+				r_pc*		: ADDRESS;
 				r_cs-		: ADDRESS;
 				r_flags-	: LONGINT;
-				r_sp *	: ADDRESS;		(* sp at error (signal) *)
+				r_sp*		: ADDRESS;		(* sp at error (signal) *)
 				r_ss-		: LONGINT;
 				fpc-		: ADDRESS; 	(* FPcontext *)
 				oldmask-	: LONGINT;
@@ -384,13 +368,6 @@ TYPE
 		reserved2-: ARRAY 4 OF WORD;
 	END;
 
-	PtraceRegsStruct = RECORD
-		ebx, ecx, edx, esi, edi, ebp, eax: WORD;
-		DS, ES, FS, GS, AX, IP, CS: WORD;
-		flags: SET;
-		esp: WORD;
-		ss: WORD;
-	END;
 
 	Sigaction = RECORD
 		sa_handler: ADDRESS;
@@ -550,35 +527,6 @@ VAR
 
 
 
-
-
-
-	(*
-	mtxInit: 		PROCEDURE {REALTIME, C}  ( dummy: LONGINT ): Unix.Mutex_t;
-	mtxDestroy: 	PROCEDURE {REALTIME, C}  ( mtx: Unix.Mutex_t );
-	mtxLock: 		PROCEDURE {REALTIME, C}  ( mtx: Unix.Mutex_t );
-	mtxUnlock:	PROCEDURE {REALTIME, C}  ( mtx: Unix.Mutex_t );
-
-	conInit: 		PROCEDURE {REALTIME, C}  ( dummy: LONGINT ): Unix.Condition_t;
-	conDestroy:	PROCEDURE {REALTIME, C}  ( cond: Unix.Condition_t );
-	conWait: 		PROCEDURE {REALTIME, C}  ( cond: Unix.Condition_t;  mtx: Unix.Mutex_t );
-	conSignal: 	PROCEDURE {REALTIME, C}  ( cond: Unix.Condition_t );
-
-	thrStart: 			PROCEDURE {REALTIME, C} ( p: PROCEDURE;  stackLen: LONGINT ): Unix.Thread_t;
-	thrThis: 			PROCEDURE {REALTIME, C} ( dummy: LONGINT ): Unix.Thread_t;
-	thrSleep: 			PROCEDURE {REALTIME, C} ( ms: LONGINT );
-	thrYield: 			PROCEDURE {REALTIME, C} ( dummy: LONGINT );
-	thrExit: 			PROCEDURE {REALTIME, C} ( dummy: LONGINT );
-	thrSuspend: 		PROCEDURE {REALTIME, C} ( t: Unix.Thread_t );
-	thrResume: 		PROCEDURE {REALTIME, C} ( t: Unix.Thread_t );
-	thrSetPriority: 	PROCEDURE {REALTIME, C} ( t: Unix.Thread_t;  prio: LONGINT );
-	thrGetPriority: 	PROCEDURE {REALTIME, C} ( t: Unix.Thread_t ): LONGINT;
-	thrKill: 			PROCEDURE {REALTIME, C} ( t: Unix.Thread_t );
-	*)
-
-	TYPE
-
-
 	PROCEDURE getnprocs* (): LONGINT;
 	BEGIN
 		RETURN sysconf(0x54); (*0x53 for number of processors configured, 0x54 for number of processors online *)
@@ -769,48 +717,31 @@ VAR
 
 	PROCEDURE ThrKill*(thr: Thread_t);
 	BEGIN
-	    IF (thr # mainthread) THEN
-	    	pthread_detach( thr );
-	    	IF (thr = pthread_self()) THEN
-	    	    pthread_exit( 0 );
+		IF (thr # mainthread) THEN
+	    		pthread_detach( thr );
+    			IF (thr = pthread_self()) THEN
+				pthread_exit( 0 );
 			ELSE
-	    	    pthread_cancel( thr );
-	        END
-	    END;
+				pthread_cancel( thr );
+			END
+		END;
     END ThrKill;
 
-    (* did not work
-    PROCEDURE TraceThread*(p: Thread_t);
-    VAR regs: PtraceRegsStruct; res: WORD;
-    BEGIN
-       	res := ptrace(PTRACE_ATTACH, p , NIL, NIL);
-    	IF res < 0 THEN Perror("attach") END;
-    	TRACE(res);
-    	res := ptrace(PTRACE_GETREGS,p,NIL, ADDRESS OF regs);
-    	IF res < 0 THEN Perror("getregs") END;
-    	TRACE(res);
-    	TRACE(regs.ebx, regs.ecx, regs.edx, regs.eax);
-    	TRACE(regs.ebp, regs.esp, regs.IP, regs.flags);
-    	res := ptrace(PTRACE_DETACH, p, NIL, NIL);
-    END TraceThread;
-    *)
-
-
-	PROCEDURE {C} resume_handler(sig: LONGINT);
+
+	PROCEDURE {C} resume_handler( sig: LONGINT );
 	BEGIN
 	END resume_handler;
 
-	PROCEDURE ThrResume*(thr: Thread_t);
-	VAR n: LONGINT; res: LONGINT;
+	PROCEDURE ThrResume*( thr: Thread_t );
+	VAR  res: LONGINT;
 	BEGIN
-	    res := pthread_mutex_lock( ADDRESS OF suspend_mutex );
-	    resume_done := 0; n := 1;
-	    res := pthread_kill( thr, T_SIGRESUME );
+		res := pthread_mutex_lock( ADDRESS OF suspend_mutex );
+		resume_done := 0; 
+		res := pthread_kill( thr, T_SIGRESUME );
 
-	 (*   WHILE (resume_done # 1) & (n < 50) DO ThrSleep(1); INC(n) END; *)
 		WHILE (resume_done # 1)  DO ThrSleep(1); END;
 
-	    res := pthread_mutex_unlock( ADDRESS OF suspend_mutex );
+		res := pthread_mutex_unlock( ADDRESS OF suspend_mutex );
 	END ThrResume;
 
 	VAR suspendHandler*: PROCEDURE(c: Ucontext);
@@ -818,7 +749,7 @@ VAR
 	PROCEDURE {C} suspend_handler(sig: LONGINT; scp: ADDRESS; ucp: ADDRESS);
 	VAR block: Sigset_t; res: LONGINT;
 	BEGIN
-		IF suspendHandler # NIL THEN suspendHandler(S.VAL(Ucontext,ucp)) END;
+		IF suspendHandler # NIL THEN suspendHandler( S.VAL( Ucontext, ucp) ) END;
 	    res := sigfillset( ADDRESS OF block );
 	    sigdelset(  ADDRESS OF block, T_SIGRESUME );
 	    suspend_done := 1;   (*this is ok because ThrSuspend is protected by a mutex, so no race condidtion. It may alert the ThrSuspend too early though!*)
@@ -842,34 +773,34 @@ VAR
 
 
 
-	PROCEDURE ThrInitialize*(VAR low, high: LONGINT): BOOLEAN;
+	PROCEDURE ThrInitialize*( VAR low, high: LONGINT ): BOOLEAN;
 	VAR
 		param: Sched_param;
-		BEGIN
+	BEGIN
 	    (*struct sched_param param;*)
 
 		ASSERT(pthread_mutex_init( ADDRESS OF suspend_mutex, NIL ) = 0);
-	    mainthread := pthread_self();
-	    high := sched_get_priority_max(SCHED_OTHER);
-	    low := sched_get_priority_min(SCHED_OTHER);
+		mainthread := pthread_self();
+		high := sched_get_priority_max(SCHED_OTHER);
+		low := sched_get_priority_min(SCHED_OTHER);
 
-	    param.sched_priority := high;
+		param.sched_priority := high;
 		IF pthread_setschedparam( mainthread, SCHED_OTHER, ADDRESS OF param)#0 THEN
 			Perror("ThrInitialize: setparam");
 		END;
 
-	    sigemptyset( ADDRESS OF sasuspend.sa_mask );
-	    sigaddset(  ADDRESS OF sasuspend.sa_mask, T_SIGRESUME );
-	    sasuspend.sa_flags := SA_SIGINFO + (*SA_ONSTACK +*) SA_NODEFER;;
-	    sasuspend.sa_handler := suspend_handler;
-	    ASSERT(sigaction( T_SIGSUSPEND, ADDRESS OF sasuspend, NIL ) = 0);
+		sigemptyset( ADDRESS OF sasuspend.sa_mask );
+		sigaddset(  ADDRESS OF sasuspend.sa_mask, T_SIGRESUME );
+		sasuspend.sa_flags := SA_SIGINFO + (*SA_ONSTACK +*) SA_NODEFER;;
+		sasuspend.sa_handler := suspend_handler;
+		ASSERT(sigaction( T_SIGSUSPEND, ADDRESS OF sasuspend, NIL ) = 0);
 
-	    sigemptyset( ADDRESS OF saresume.sa_mask );
-	    saresume.sa_flags := 0;
-	    saresume.sa_handler := resume_handler;
-	    ASSERT(sigaction( T_SIGRESUME, ADDRESS OF saresume, NIL ) = 0);
+		sigemptyset( ADDRESS OF saresume.sa_mask );
+		saresume.sa_flags := 0;
+		saresume.sa_handler := resume_handler;
+		ASSERT(sigaction( T_SIGRESUME, ADDRESS OF saresume, NIL ) = 0);
 
-	    RETURN TRUE;
+		RETURN TRUE;
 	END ThrInitialize;
 
 	PROCEDURE CopyContext*(CONST from: McontextDesc; VAR to: McontextDesc);
@@ -914,7 +845,7 @@ VAR
 				WHILE p[j] # 0X DO  INC( j )  END;
 				p[j] := '/';  k := 0;
 				REPEAT  INC( j );  p[j] := libname[k];  INC( k )  UNTIL p[j] = 0X;
-				h := Glue.dlopen( ADDRESSOF( p ), mode );  INC( i )
+				h := Glue.dlopen( ADDRESSOF( p ), mode );  INC( i );
 			END
 		END;
 		IF h = 0 THEN
@@ -986,16 +917,7 @@ VAR
 		sigstk.flags := {};
 	END CreateSignalStack;
 
-	(*
-static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 
-	if (debug | (AosTrap == NULL)) {
-	    printf("\nhandler for signal %d got called, ucp = %p\n", sig, ucp);
-	    if (AosTrap == NULL) exit(1);
-	}
-	AosTrap(0, ucp, scp, sig); /* rev. order: Oberon <--> C */
-}
-	*)
 
 	VAR trap: SignalHandler;
 
@@ -1035,33 +957,13 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 	END InstallHandler;
 
 	PROCEDURE fstat*  ( fd: LONGINT;  VAR buf: Status ): LONGINT;
-	VAR res: LONGINT;
 	BEGIN
-		(*
-						dev-		: DevT;
-				unused1-	: LONGINT;
-				ino-		: LONGINT;
-				mode-	: LONGINT;
-				nlink-		: LONGINT;
-				uid-		: LONGINT;
-				gid-		: LONGINT;
-				rdev-		: DevT;
-				unused2-	: LONGINT;
-				size-		: LONGINT;
-				blksize-	: LONGINT;
-				blocks-	: LONGINT;
-				atime-	: Timeval;
-				mtime-	: Timeval;
-				ctime-	: Timeval;
-				unused-	: ARRAY 2 OF LONGINT;
-		*)
-		res := fxstat(3, fd, buf);
-		RETURN res;
+		RETURN  fxstat( 3, fd, buf );
 	END fstat;
 
 	PROCEDURE stat*  ( path: ADDRESS;  VAR buf: Status ): LONGINT;
 	BEGIN
-		RETURN xstat( 3, path, buf );
+		RETURN  xstat( 3, path, buf );
 	END stat;
 
 
@@ -1083,13 +985,9 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 
 	TYPE OberonXErrorHandler* = PROCEDURE (disp, err: ADDRESS): LONGINT;
 	TYPE OberonXIOErrorHandler* = PROCEDURE (disp: ADDRESS): LONGINT;
-	VAR oberonXErrorHandler:OberonXErrorHandler;
+	VAR oberonXErrorHandler: OberonXErrorHandler;
 	VAR oberonXIOErrorHandler: OberonXIOErrorHandler;
 
-	TYPE pid_t *= LONGINT;
-	TYPE path_t *= ARRAY OF CHAR;
-	TYPE arg_t *= ARRAY OF CHAR;
-	TYPE argv_t *= ARRAY OF arg_t;
 
 	PROCEDURE {C} X11ErrorHandler(d: ADDRESS; err: ADDRESS): WORD;
 	VAR res: LONGINT;
@@ -1127,70 +1025,71 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		argv := Glue.argv;
 		environ := Glue.environ;
 
-		libraryPaths[0] := "/lib/i386-linux-gnu";
+		libraryPaths[0] := "/lib/i386-linux-gnu/i686/cmov";
 		libraryPaths[1] := "/usr/lib/i386-linux-gnu";
-		libraryPaths[2] := "/lib";
-		libraryPaths[3] := "/usr/lib";
-		noPaths := 4;
+		libraryPaths[2] := "/lib/i386-linux-gnu";
+		libraryPaths[3] := "/lib";
+		libraryPaths[4] := "/usr/lib";
+		noPaths := 5;
 
 		libc := Dlopen( libcname, 2 );
-		libp := Dlopen( libpthreadname, 2);
-
-		Dlsym( libc, "exit",		ADDRESSOF( exit ) );
-
-		Dlsym( libc, "ptrace", ADDRESSOF(ptrace));
-		Dlsym( libc, "getcontext", ADDRESSOF(getcontext));
-		Dlsym( libc, "sysconf", ADDRESSOF(sysconf));
-
-		Dlsym( libc, "pthread_mutex_init", ADDRESSOF(pthread_mutex_init));
-		Dlsym( libc, "pthread_mutex_destroy", ADDRESSOF(pthread_mutex_destroy));
-		Dlsym( libc, "pthread_mutex_lock", ADDRESSOF(pthread_mutex_lock));
-		Dlsym( libc, "pthread_mutex_unlock", ADDRESSOF(pthread_mutex_unlock));
-
-		Dlsym( libp, "pthread_mutexattr_init", ADDRESSOF(pthread_mutexattr_init));
-		Dlsym( libp, "pthread_mutexattr_settype", ADDRESSOF(pthread_mutexattr_settype));
-
-
-		Dlsym( libc, "pthread_cond_init", ADDRESSOF(pthread_cond_init));
-		Dlsym( libc, "pthread_cond_destroy", ADDRESSOF(pthread_cond_destroy));
-		Dlsym( libc, "pthread_cond_wait", ADDRESSOF(pthread_cond_wait));
-		Dlsym( libc, "pthread_cond_signal", ADDRESSOF(pthread_cond_signal));
-
-		Dlsym( libp, "pthread_create", ADDRESSOF(pthread_create));
-		Dlsym( libp, "pthread_exit", ADDRESSOF(pthread_exit));
-		Dlsym( libp, "pthread_detach", ADDRESSOF(pthread_detach));
-		Dlsym( libp, "pthread_cancel", ADDRESSOF(pthread_cancel));
-		Dlsym( libp, "pthread_kill", ADDRESSOF(pthread_kill));
-
-		Dlsym( libp, "pthread_sigmask", ADDRESSOF(pthread_sigmask));
-		Dlsym( libp, "pthread_setcancelstate", ADDRESSOF(pthread_setcancelstate));
-		Dlsym( libp, "pthread_setcanceltype", ADDRESSOF(pthread_setcanceltype));
-		Dlsym( libp, "pthread_attr_init", ADDRESSOF(pthread_attr_init));
-		Dlsym( libp, "pthread_attr_setscope", ADDRESSOF(pthread_attr_setscope));
-		Dlsym( libp, "pthread_attr_setdetachstate", ADDRESSOF(pthread_attr_setdetachstate));
-		Dlsym( libp, "pthread_attr_setstacksize", ADDRESSOF(pthread_attr_setstacksize));
-		Dlsym( libp, "pthread_self", ADDRESSOF(pthread_self));
-
-		Dlsym( libc, "posix_spawnp", ADDRESSOF(posix_spawnp));
-		Dlsym( libc, "posix_spawn", ADDRESSOF(posix_spawn));
-
-		Dlsym( libc, "waitpid", ADDRESSOF(waitpid));
-		Dlsym( libc, "pipe", ADDRESSOF(pipe));
-		Dlsym( libc, "dup2",ADDRESSOF(dup2));
-		Dlsym( libc, "dup", ADDRESSOF(dup));
-
-		Dlsym( libc, "sched_get_priority_max", ADDRESSOF(sched_get_priority_max));
-		Dlsym( libc, "sched_get_priority_min", ADDRESSOF(sched_get_priority_min));
-		Dlsym( libc, "pthread_setschedparam", ADDRESSOF(pthread_setschedparam));
-		Dlsym( libc, "pthread_getschedparam", ADDRESSOF(pthread_getschedparam));
-		Dlsym( libc, "sigaction", ADDRESSOF(sigaction));
-		Dlsym( libc, "sigemptyset", ADDRESSOF(sigemptyset));
-		Dlsym( libc, "sigfillset", ADDRESSOF(sigfillset));
-		Dlsym( libc, "sigaddset", ADDRESSOF(sigaddset));
-		Dlsym( libc, "sigdelset", ADDRESSOF(sigdelset));
-		Dlsym( libc, "nanosleep", ADDRESSOF(nanosleep));
-		Dlsym( libc, "sigaltstack", ADDRESSOF(sigaltstack));
-		Dlsym( libc, "sigsuspend", ADDRESSOF(sigsuspend));
+		libp := Dlopen( libpthreadname, 2 );
+
+		Dlsym( libc, "exit",		ADDRESSOF(exit) );
+
+		Dlsym( libc, "ptrace", ADDRESSOF(ptrace) );
+		Dlsym( libc, "getcontext", ADDRESSOF(getcontext) );
+		Dlsym( libc, "sysconf", ADDRESSOF(sysconf) );
+
+		Dlsym( libc, "pthread_mutex_init", ADDRESSOF(pthread_mutex_init) );
+		Dlsym( libc, "pthread_mutex_destroy", ADDRESSOF(pthread_mutex_destroy) );
+		Dlsym( libc, "pthread_mutex_lock", ADDRESSOF(pthread_mutex_lock) );
+		Dlsym( libc, "pthread_mutex_unlock", ADDRESSOF(pthread_mutex_unlock) );
+
+		Dlsym( libp, "pthread_mutexattr_init", ADDRESSOF(pthread_mutexattr_init) );
+		Dlsym( libp, "pthread_mutexattr_settype", ADDRESSOF(pthread_mutexattr_settype) );
+
+
+		Dlsym( libc, "pthread_cond_init", ADDRESSOF(pthread_cond_init) );
+		Dlsym( libc, "pthread_cond_destroy", ADDRESSOF(pthread_cond_destroy) );
+		Dlsym( libc, "pthread_cond_wait", ADDRESSOF(pthread_cond_wait) );
+		Dlsym( libc, "pthread_cond_signal", ADDRESSOF(pthread_cond_signal) );
+
+		Dlsym( libp, "pthread_create", ADDRESSOF(pthread_create) );
+		Dlsym( libp, "pthread_exit", ADDRESSOF(pthread_exit) );
+		Dlsym( libp, "pthread_detach", ADDRESSOF(pthread_detach) );
+		Dlsym( libp, "pthread_cancel", ADDRESSOF(pthread_cancel) );
+		Dlsym( libp, "pthread_kill", ADDRESSOF(pthread_kill) );
+
+		Dlsym( libp, "pthread_sigmask", ADDRESSOF(pthread_sigmask) );
+		Dlsym( libp, "pthread_setcancelstate", ADDRESSOF(pthread_setcancelstate) );
+		Dlsym( libp, "pthread_setcanceltype", ADDRESSOF(pthread_setcanceltype) );
+		Dlsym( libp, "pthread_attr_init", ADDRESSOF(pthread_attr_init) );
+		Dlsym( libp, "pthread_attr_setscope", ADDRESSOF(pthread_attr_setscope) );
+		Dlsym( libp, "pthread_attr_setdetachstate", ADDRESSOF(pthread_attr_setdetachstate) );
+		Dlsym( libp, "pthread_attr_setstacksize", ADDRESSOF(pthread_attr_setstacksize) );
+		Dlsym( libp, "pthread_self", ADDRESSOF(pthread_self) );
+
+		Dlsym( libc, "posix_spawnp", ADDRESSOF(posix_spawnp) );
+		Dlsym( libc, "posix_spawn", ADDRESSOF(posix_spawn) );
+
+		Dlsym( libc, "waitpid", ADDRESSOF(waitpid) );
+		Dlsym( libc, "pipe", ADDRESSOF(pipe) );
+		Dlsym( libc, "dup2",ADDRESSOF(dup2) );
+		Dlsym( libc, "dup", ADDRESSOF(dup) );
+
+		Dlsym( libc, "sched_get_priority_max", ADDRESSOF(sched_get_priority_max) );
+		Dlsym( libc, "sched_get_priority_min", ADDRESSOF(sched_get_priority_min) );
+		Dlsym( libc, "pthread_setschedparam", ADDRESSOF(pthread_setschedparam) );
+		Dlsym( libc, "pthread_getschedparam", ADDRESSOF(pthread_getschedparam) );
+		Dlsym( libc, "sigaction", ADDRESSOF(sigaction) );
+		Dlsym( libc, "sigemptyset", ADDRESSOF(sigemptyset) );
+		Dlsym( libc, "sigfillset", ADDRESSOF(sigfillset) );
+		Dlsym( libc, "sigaddset", ADDRESSOF(sigaddset) );
+		Dlsym( libc, "sigdelset", ADDRESSOF(sigdelset) );
+		Dlsym( libc, "nanosleep", ADDRESSOF(nanosleep) );
+		Dlsym( libc, "sigaltstack", ADDRESSOF(sigaltstack) );
+		Dlsym( libc, "sigsuspend", ADDRESSOF(sigsuspend) );
 
 		Dlsym( libc, "read",		ADDRESSOF( read ) );
 		Dlsym( libc, "write",	ADDRESSOF( write ) );
@@ -1263,7 +1162,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 	(* load X11 related libaries only on demand *)
 	PROCEDURE LinkToX*;
 	BEGIN
-		libx := Dlopen( libX11name, 2);
+		libx := Dlopen( libX11name, 2 );
 
 		Dlsym( libx, "XSetErrorHandler", ADDRESS OF xSetErrorHandler);
 		Dlsym( libx, "XSetIOErrorHandler", ADDRESS OF xSetIOErrorHandler);