|
Message-ID: <20181107234526.GW5150@brightrain.aerifal.cx> Date: Wed, 7 Nov 2018 18:45:26 -0500 From: Rich Felker <dalias@...c.org> To: musl@...ts.openwall.com Subject: Re: Problems with pthreads from a shared object? On Wed, Nov 07, 2018 at 06:40:35PM -0500, Barry Flartus wrote: > Nope! Linux ubuntu-x64 4.4.0-116-generic - this is just the kernel from a > default Ubuntu 16.04 install. OK. Can you run strace -f ./launch (or whatever the launch program executable is called) and post the output? Rich > On Wed, Nov 7, 2018 at 6:31 PM Rich Felker <dalias@...c.org> wrote: > > > On Wed, Nov 07, 2018 at 06:00:14PM -0500, Barry Flartus wrote: > > > Hello, > > > > > > I am encountering some issues that I believe are musl related when > > trying to > > > use pthreads from a shared object. Below is a minimal example (2 files) > > of > > > the problem. > > > > > > ==================== test.c ==================== > > > > > > // Compile with > > > // musl-gcc -Wall -lpthread -shared -fPIC test.c -o test.so > > > > > > #include <pthread.h> > > > #include <stdio.h> > > > > > > static void *launch(void *arg); > > > int start_thread(void); > > > void entry_point(void) __attribute__((constructor)); > > > > > > static pthread_t gthread; > > > > > > static void *launch(void *arg) > > > { > > > for (int i = 0; i < 4; i++){ > > > printf("[%d] Hello from the thread\n", i); > > > } > > > return NULL; > > > } > > > > > > int start_thread(void) > > > { > > > printf("Starting the thread\n"); > > > return pthread_create(>hread, NULL, launch, NULL); > > > } > > > > > > void entry_point(void){ > > > puts("Starting Execution"); > > > int res = start_thread(); > > > printf("start_thread returned %d\n", res); > > > if (res == 0){ > > > pthread_join(gthread, NULL); > > > } else { > > > printf("pthread_create() returned an error. Aborting.\n"); > > > } > > > } > > > > > > ==================== launch.c ==================== > > > > > > // Compile with: > > > // gcc launch.c -ldl -o launch > > > > > > #include <dlfcn.h> > > > #include <stdio.h> > > > #include <stdlib.h> > > > > > > int main(){ > > > void *handle; > > > > > > puts("\nLaunching test..."); > > > handle = dlopen("./test.so", RTLD_NOW); > > > if (!handle) { > > > fprintf(stderr, "%s\n", dlerror()); > > > exit(EXIT_FAILURE); > > > } > > > dlerror(); > > > > > > return EXIT_SUCCESS; > > > } > > > > > > When the above examples are compiled with gcc, everything works correctly > > > and > > > produces the following output: > > > > > > Launching test... > > > Starting Execution > > > Starting the threadstart_thread returned 0 > > > [0] Hello from the thread > > > [1] Hello from the thread > > > [2] Hello from the thread > > > [3] Hello from the thread > > > > > > When I switch to musl pthread_create() returns the integer '38', which > > is an > > > undocumented return value. I assume this corresponds with ENOSYS from > > > errno.h > > > but I can't seem to figure out why this is happening. > > > > > > Output: > > > > > > Launching test... > > > Starting Execution > > > Starting the thread > > > start_thread returned 38 > > > pthread_create() returned an error. Aborting. > > > > > > Is this even supported by musl? If so, where have I gone wrong? > > > > > > Thanks in advance! > > > > Are you running on an ancient kernel or a kernel built with a lot of > > default functionality configured out? These should be the only > > conditions under which pthread_create can return ENOSYS. > > > > Rich > >
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.