Working on support for -flto has uncovered an ugly buglet in libltdl. ltmain declares this symbol as:
extern $lt_dlsym_const lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; but libltdl declares it as: #define preloaded_symbols LT_CONC3(lt_, LTDLOPEN, _LTX_preloaded_symbols) #ifdef HAVE_LIBDLLOADER extern lt_dlsymlist preloaded_symbols; #endif (note the missing []) and takes its address to make up for it. gcc -flto notices this inconsistency between the objects. This patch fixes it, it passes the testsuite. I'll be pushing it soon. I don't actually know whether this bug can cause issues on some system. Cheers, Ralf Fix preloader symbol list declaration in libltdl. * libltdl/ltdl.c (preloaded_symbols): Fix declaration to include array brackets. (lt_dlinit): Do not take address of preloaded_symbols. diff --git a/libltdl/ltdl.c b/libltdl/ltdl.c index 1fe272f..4e1a402 100644 --- a/libltdl/ltdl.c +++ b/libltdl/ltdl.c @@ -208,7 +208,7 @@ LT_BEGIN_C_DECLS LT_SCOPE const lt_dlvtable * get_vtable (lt_user_data data); LT_END_C_DECLS #ifdef HAVE_LIBDLLOADER -extern lt_dlsymlist preloaded_symbols; +extern lt_dlsymlist preloaded_symbols[]; #endif /* Initialize libltdl. */ @@ -234,7 +234,7 @@ lt_dlinit (void) #ifdef HAVE_LIBDLLOADER if (!errors) { - errors += lt_dlpreload (&preloaded_symbols); + errors += lt_dlpreload (preloaded_symbols); } if (!errors)