dlopen()/festival problem

Tim Niemueller tim at niemueller.de
Mon Nov 10 13:21:22 UTC 2008


Hi C/C++ developers.

I'm having an interesting problem with Festival on F-9/F-8 and I'm not
sure whether it is a problem with dlopen(), or Festival, or if I'm just
trying something stupid. Maybe someone here has a clue or point me
somewhere I should look into to solve it:

I'm developing a software which uses shared objects (.so) as plugins.
One of those plugins provides speech synthesis via Festival. The problem
is now that it crashes at a very specific position in the speech_tools
library that comes with Festival. There are module-global variables in a
.cc file which are not properly initialized, but only if the lib is
opened via dlopen(). If I put it directly into main, or link the main
program that dlopen()s the festival plugin against the festival lib
everything works fine.

So is it intended that the standard runtime linker and dlopen() work
differently in initializing global variables of a library? Or am I
trying something not meant to work?

I have put code to illustrate the problem at
http://fedorapeople.org/~timn/festival/. To get it working do:

- install festival-devel, festival-speechtools-devel, festival-debuginfo
(if you want to see the backtrace in gdb)

- First as root you have to move some files as the festival package has
a longstanding bug (#242607), which I'm going to fix this as soon as I
got this sorted.
# cd /usr/include/speech_tools
# mv unix/EST/EST_* unix/
# mv instantiate/EST/instantiate/EST_T* instantiate/
# mv sigpr/EST/EST_* sigpr/
# mv ling_class/EST/EST_* ling_class/

- Download all files of the code from
http://fedorapeople.org/~timn/festival/. It has a simple Makefile to
build the code.

- the festival binary simply uses festival and directly links against
festival and should work just fine

- The uselib binary will dlopen() festival_lib.so (which is the custom
plugin and not the festival library itself) and then tries to execute
festival_initialize() where it fails with a segfault which can be traced
down to uninitialized global variables.


Anyone with an idea what's going wrong, what's broken or what I'm trying
that is stupid?

Thank you,
	Tim

-- 
    Tim Niemueller <tim at niemueller.de>      www.niemueller.de
=================================================================
 Imagination is more important than knowledge. (Albert Einstein)




More information about the fedora-devel-list mailing list