I have a C ++ shared library object that includes a GLib library .
When I create a minimal test program with the emptymain() function , and I link to the shared library, the program terminates immediately at runtime with the following GLib error message:
GLib (gthread-posix.c): Unexpected error from C library during 'pthread_cond_init': Invalid argument. Aborting.
Since my main function is empty, the error should be executed somewhere in some pre-initialization function. So, using GDB, I found that GLib has a static initialization function (in glib-init.c) that it calls at runtime before main(). Inside this initialization function, it calls pthread_cond_init, which mysteriously fails.
Here is the complete backtrace:
(gdb) run
Starting program: ~/example
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x2aaaaaaab000
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
GLib (gthread-posix.c): Unexpected error from C library during 'pthread_cond_init': Invalid argument. Aborting.
Program received signal SIGABRT, Aborted.
0x0000003891830265 in raise () from /lib64/libc.so.6
(gdb) bt
function=0x2aaaabcbdd2b "pthread_cond_init")
at ~/libs/glib/gthread-posix.c:75
at ~/libs/glib/gthread-posix.c:656
cond=0x2aaaac15f690 <g_once_cond>)
at ~/libs/glib/gthread-posix.c:677
cond=0x2aaaac15f690 <g_once_cond>)
at ~/libs/glib/gthread-posix.c:792
location=0x2aaaac160510 <g_define_type_id__volatile.11714>,
result=6524000) at ~/libs/glib/gthread.c:682
at ~/libs/gobject/gboxed.c:132
at ~/libs/gobject/gparamspecs.c:1511
at ~/libs/gobject/gtype.c:4391
from ./MYLIB.so
from /lib64/ld-linux-x86-64.so.2
from /lib64/ld-linux-x86-64.so.2
from /lib64/ld-linux-x86-64.so.2
, , , .so pthread. , ldd, , pthread:
$ ldd MYLIB.so
linux-vdso.so.1 => (0x00007fff56ed1000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b8a747bf000)
librt.so.1 => /lib64/librt.so.1 (0x00002b8a749db000)
libpng12.so.0 => /usr/lib64/libpng12.so.0 (0x00002b8a74be5000)
libfontconfig.so.1 => /usr/lib64/libfontconfig.so.1 (0x00002b8a74e09000)
libz.so.1 => /lib64/libz.so.1 (0x00002b8a7503d000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b8a75252000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002b8a75456000)
libm.so.6 => /lib64/libm.so.6 (0x00002b8a75756000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002b8a759da000)
libc.so.6 => /lib64/libc.so.6 (0x00002b8a75be8000)
/lib64/ld-linux-x86-64.so.2 (0x0000003891400000)
libfreetype.so.6 => /usr/lib64/libfreetype.so.6 (0x00002b8a75f41000)
libexpat.so.0 => /lib64/libexpat.so.0 (0x00002b8a761c6000)
, libpthread /usr/lib64/pthread.so.0
, GLib, pthread_cond_init. . #ifdef:
pthread_condattr_t attr;
pthread_cond_t *cond;
gint status;
pthread_condattr_init (&attr);
cond = malloc (sizeof (pthread_cond_t));
if G_UNLIKELY (cond == NULL)
g_thread_abort (errno, "malloc");
if G_UNLIKELY ((status = pthread_cond_init (cond, &attr)) != 0) <--- this fails
g_thread_abort (status, "pthread_cond_init");
, , , GLib , , , Linux-.
, . / ? , , pthread lib , GLib ?