Hi all,
I'm trying to write a little test program that uses ltdl from Libtool
2.2.6. Now this package comes preinstalled with OpenSuSE 11.1, which is
a fairly significant upgrade from OpenSuSE 11.0, which shipped with
Libtool 1.5.
Both the older and newer ltdl package are installed on this sytsem -
libltdl-3-1.5.26 and libltdl7-2.2.6 but I know I'm linking to the
correct library, but I get an undefined symbol error:
$ ls -al /usr/lib64/libltdl*
... /usr/lib64/libltdl.a
... /usr/lib64/libltdl.la
*... /usr/lib64/libltdl.so -> libltdl.so.7.2.0
*... /usr/lib64/libltdl.so.3 -> libltdl.so.3.1.6
... /usr/lib64/libltdl.so.3.1.6
... /usr/lib64/libltdl.so.7 -> libltdl.so.7.2.0
... /usr/lib64/libltdl.so.7.2.0
$ make
...
libtool: link: gcc -g -O2 -o .libs/jupiter jupiter-main.o
../libjup/.libs/libjupiter.so */usr/lib64/libltdl.so* -ldl -lpthread
jupiter-main.o: In function `main':
*/home/jcalcote/dev/prj/autotools/jupiter-libtool-ch7/src/main.c:25:
undefined reference to `lt__PROGRAM__LTX_preloaded_symbols'
*...
I did a little digging: This line in the ltdl.h header file is causing
LTDL_SET_PRELOADED_SYMBOLS to reference the undefined symbol:
*#define lt_preloaded_symbols lt__PROGRAM__LTX_preloaded_symbols
*#define LTDL_SET_PRELOADED_SYMBOLS() LT_STMT_START{ \
extern const lt_dlsymlist *lt_preloaded_symbols*[]; \
lt_dlpreload_default(lt_preloaded_symbols); \
}LT_STMT_END
Yet, when I use objdump -T on the library, I only see this symbol:
$ objdump -T /usr/lib64/libltdl.so.7.2.0 | grep LTX_pre
*0000000000208da0 g DO .data.rel.ro 0000000000000040 Base
lt_libltdl_LTX_preloaded_symbols
*
If I add the following definitions to my program:
#if HAVE_LTDL_H
# include <ltdl.h>
*# undef lt_preloaded_symbols
# define lt_preloaded_symbols lt_libltdl_LTX_preloaded_symbols
*#endif
Then the program links without errors, and runs correctly. It appears
that the 2.2.6 header file is out of alignment with the ltdl 2.2.6
library. Is this a defect in libtool 2.2, or a problem with the OpenSuSE
11.1 distro ltdl 2.2.6 package?
One more note on this issue - if I configure with --disable-shared, then
my library isn't in my preloaded symbol table anyway - at least I don't
see it when walking the list in gdb. So, I'm guessing that my hack was
inaccurate, at best. It appears that the 2.2.6 version of libltdl
doesn't export the preloaded symbol list.
Thanks in advance,
John
_______________________________________________
http://lists.gnu.org/mailman/listinfo/libtool