In order to reproduce the error I took the code from here (also attached): https://gist.github.com/chergert/eb6149916b10d3bf094c and commented out the #include <asm/vsyscall.h>.
and compiled it with gcc vdso-getcpu.c -ldl running the resulting a.out will crash on a s390x qemu guest, but on ppc64el guest not. I hope this narrows the scope a bit.
#include <dlfcn.h> #include <stdio.h> //#include <asm/vsyscall.h> #include <sys/auxv.h> int (*test_getcpu) (unsigned *cpu, unsigned *node, void *cache); void * get_vdso_sym (const char *name) { static const char *vdso_names[] = { "linux-vdso.so.1", "linux-vdso32.so.1", "linux-vdso64.so.1", NULL }; int i; for (i = 0; vdso_names [i]; i++) { void *lib; void *symbol; lib = dlopen (vdso_names [i], RTLD_NOW | RTLD_GLOBAL); if (lib == NULL) continue; symbol = dlsym (lib, name); if (symbol == NULL) goto cleanup; if (*(void **)symbol == NULL) goto cleanup; return symbol; cleanup: dlclose (lib); } } int main (int argc, char *argv[]) { int ret; int cpu = -1; test_getcpu = get_vdso_sym ("__kernel_getcpu"); if (test_getcpu == NULL) test_getcpu = get_vdso_sym ("__vdso_getcpu"); ret = test_getcpu (&cpu, NULL, NULL); printf ("ret = %d cpu = %d\n", ret, cpu); return 0; }