Message ID | 20180108212829.14484-1-lucas.demarchi@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
+1 On Mon, Jan 08, 2018 at 01:28:29PM -0800, Lucas De Marchi wrote: > Not a perfect solution for overriding syscall(), but at least > it makes the testsuite to pass in a modified nsswitch.conf (one that has > a module which calls syscall() to get the thread id). > --- > > v2: > - Check nextlib_syscall rather than nextlib to avoid races in > multithreaded programs > - Add error message in case we fail to get symbol > > testsuite/init_module.c | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/testsuite/init_module.c b/testsuite/init_module.c > index 199186b..c70147e 100644 > --- a/testsuite/init_module.c > +++ b/testsuite/init_module.c > @@ -355,6 +355,26 @@ TS_EXPORT long int syscall(long int __sysno, ...) > return ret; > } > > + if (__sysno == __NR_gettid) { > + static void *nextlib = NULL; > + static long (*nextlib_syscall)(long number, ...); > + > + if (nextlib_syscall == NULL) { > +#ifdef RTLD_NEXT > + nextlib = RTLD_NEXT; > +#else > + nextlib = dlopen("libc.so.6", RTLD_LAZY); > +#endif > + nextlib_syscall = dlsym(nextlib, "syscall"); > + if (nextlib_syscall == NULL) { > + fprintf(stderr, "FIXME FIXME FIXME: libc is missing syscall symbol\n"); > + abort(); > + } > + } > + > + return nextlib_syscall(__NR_gettid); > + } > + > /* > * FIXME: no way to call the libc function due since this is a > * variadic argument function and we don't have a vsyscall() variant > -- > 2.14.3 > -- To unsubscribe from this list: send the line "unsubscribe linux-modules" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, Jan 8, 2018 at 1:31 PM, Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> wrote: > +1 > > On Mon, Jan 08, 2018 at 01:28:29PM -0800, Lucas De Marchi wrote: >> Not a perfect solution for overriding syscall(), but at least >> it makes the testsuite to pass in a modified nsswitch.conf (one that has >> a module which calls syscall() to get the thread id). >> --- >> >> v2: >> - Check nextlib_syscall rather than nextlib to avoid races in >> multithreaded programs >> - Add error message in case we fail to get symbol >> >> testsuite/init_module.c | 20 ++++++++++++++++++++ >> 1 file changed, 20 insertions(+) >> >> diff --git a/testsuite/init_module.c b/testsuite/init_module.c >> index 199186b..c70147e 100644 >> --- a/testsuite/init_module.c >> +++ b/testsuite/init_module.c >> @@ -355,6 +355,26 @@ TS_EXPORT long int syscall(long int __sysno, ...) >> return ret; >> } >> >> + if (__sysno == __NR_gettid) { >> + static void *nextlib = NULL; >> + static long (*nextlib_syscall)(long number, ...); >> + >> + if (nextlib_syscall == NULL) { >> +#ifdef RTLD_NEXT >> + nextlib = RTLD_NEXT; >> +#else >> + nextlib = dlopen("libc.so.6", RTLD_LAZY); >> +#endif >> + nextlib_syscall = dlsym(nextlib, "syscall"); >> + if (nextlib_syscall == NULL) { >> + fprintf(stderr, "FIXME FIXME FIXME: libc is missing syscall symbol\n"); I added a call to dlerror() here and applied. thanks for reviewing. Lucas De Marchi -- To unsubscribe from this list: send the line "unsubscribe linux-modules" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/testsuite/init_module.c b/testsuite/init_module.c index 199186b..c70147e 100644 --- a/testsuite/init_module.c +++ b/testsuite/init_module.c @@ -355,6 +355,26 @@ TS_EXPORT long int syscall(long int __sysno, ...) return ret; } + if (__sysno == __NR_gettid) { + static void *nextlib = NULL; + static long (*nextlib_syscall)(long number, ...); + + if (nextlib_syscall == NULL) { +#ifdef RTLD_NEXT + nextlib = RTLD_NEXT; +#else + nextlib = dlopen("libc.so.6", RTLD_LAZY); +#endif + nextlib_syscall = dlsym(nextlib, "syscall"); + if (nextlib_syscall == NULL) { + fprintf(stderr, "FIXME FIXME FIXME: libc is missing syscall symbol\n"); + abort(); + } + } + + return nextlib_syscall(__NR_gettid); + } + /* * FIXME: no way to call the libc function due since this is a * variadic argument function and we don't have a vsyscall() variant