Subject: sa_register() in chroot: regression since newlock2 merge
To: None <>
From: Jukka Salmi <>
List: current-users
Date: 04/26/2007 18:44:53
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline


since newlock2 was merged to HEAD building the OpenLDAP client package
(and probably others) from pkgsrc in a netbsd-3 chroot environment on
a -current NetBSD system fails because the configure script can't
"locate usable POSIX Threads". The relevant configure code snippet of
the failing test program is attached.

$ gcc -g -O2 -lpthread -o conftest2 conftest2.c
$ ktrace ./conftest2
Bad system call (core dumped)

# gdb ./conftest2 conftest2.core 
GNU gdb 5.3nb1
Core was generated by `conftest2'.
Program terminated with signal 12, Bad system call.
#0  0xbbb3559f in sa_register () from /usr/lib/
(gdb) bt
#0  0xbbb3559f in sa_register () from /usr/lib/
#1  0xbbbe26d4 in pthread__sa_start () from /usr/lib/
#2  0xbbbe5c20 in pthread_init () from /usr/lib/
#3  0xbbbe6159 in pthread_create () from /usr/lib/
#4  0x0804880f in main (argc=1, argv=0xbfbfeae4) at conftest2.c:31
#5  0x080485f6 in ___start ()
(gdb) quit

# kdump | tail
  4890 conftest2 CALL  mprotect(0xbb201000,0x1000,0)
  4890 conftest2 RET   mprotect 0
  4890 conftest2 CALL  getcontext(0xbfbfe390)
  4890 conftest2 RET   getcontext 0
  4890 conftest2 CALL  __sysctl(0xbfbfe568,2,0xbfbfe560,0xbfbfe564,0,0)
  4890 conftest2 RET   __sysctl 0
  4890 conftest2 CALL  sa_register
  4890 conftest2 RET   sa_register -1 errno 78 Function not implemented
  4890 conftest2 PSIG  SIGSYS SIG_DFL
  4890 conftest2 NAMI  "conftest2.core"

Is it possible to get this working again, as it did with prae-newlock2
kernels? Some compatibility option maybe?

Regards, Jukka

bashian roulette:
$ ((RANDOM%6)) || rm -rf ~

Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="conftest2.c"

#include <pthread.h>

static void *task(p)
	void *p;
	return (void *) (p == NULL);

int main(argc, argv)
	int argc;
	char **argv;

	/* pthread test function */
	pthread_t t;
	int status;

	/* Final pthreads */
	pthread_attr_t attr;

	status = pthread_attr_init(&attr);
	if( status ) return status;

	status = pthread_attr_setdetachstate(&attr, detach);
	if( status ) return status;
	status = pthread_create( &t, &attr, task, NULL );
	if( status ) return status;

	return 0;