Subject: newlock2 and binary compatibility
To: None <>
From: Martijn van Buul <>
List: current-users
Date: 03/02/2007 08:47:43

It seems that since the merge of newlock2, -current is no longer binary
compatible with 4.0_BETA2, 3.* and 2.* binaries. With the merge, several
syscalls have been removed, and no emulation is in place. I stumbled 
across this while trying to cross-compile i386 NetBSD-4.0_BETA2 packages
on my -current amd64 host[1], using a pkg_comp chroot. This fails during
the configuration phase of databases/openldap-client, for example,
as the configure script tries to run a small pthread test program, which
fails with a "system call not implemented."

I tried to reproduce this with an amd64-4.0_BETA2 userland, using a 
small test program:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *child_thread(void *ptr)
	printf("%s\n", (char *)ptr);

int main(void)
	pthread_t thread1, thread2;
	char *msg1 = "Thread 1";
	char *msg2 = "Thread 2";

	pthread_create(&thread1, NULL, child_thread, (void *)msg1);
	pthread_create(&thread2, NULL, child_thread, (void *)msg2);

	pthread_join(thread1, NULL);
	pthread_join(thread2, NULL);

	return 0;

This fails, with the following trace:

 12373      1 a.out    CALL  sa_register
 12373      1 a.out    RET   sa_register -1 errno 78 Function not implemented
 12373      1 a.out    PSIG  SIGSYS SIG_DFL
 12373      1 a.out    NAMI  "a.out.core"

In my specific case, I can probably work around things by trying to
shoehorn -current's libpthread into 4.0_BETA2, but it's not elegant.

Is a "true" solution actually possible? I don't know the old scheduler
activation syscall interface nor the newlock2 one well enough to figure out
if emulation would be feasible, but it would be nice of something could
be done.

Kind regards,


[1] Yes, I am aware that I'm probably stressing the compat32 stuff too 
    much, but it's worth the effort. So far, it works surprisingly well,
    after I removed /etc/ in the chroot.
Martijn van Buul -