On Mon, 09/16 12:30, Paolo Bonzini wrote: > Il 16/09/2013 12:21, Daniel P. Berrange ha scritto: > > On Mon, Sep 16, 2013 at 12:18:54PM +0200, Paolo Bonzini wrote: > >> Il 16/09/2013 12:14, Daniel P. Berrange ha scritto: > >>> On Mon, Sep 16, 2013 at 12:09:47PM +0200, Paolo Bonzini wrote: > >>>> Il 16/09/2013 11:51, Fam Zheng ha scritto: > >>>>> On Mon, 09/16 11:44, Paolo Bonzini wrote: > >>>>>> Il 16/09/2013 10:59, Daniel P. Berrange ha scritto: > >>>>>>>> The init function of dynamic module is no longer with > >>>>>>>> __attribute__((constructor)) as static linked version, and need to be > >>>>>>>> explicitly called once loaded. The function name is mangled with per > >>>>>>>> configure fingerprint as: > >>>>>>>> > >>>>>>>> init_$(date +%s$$$RANDOM) > >>>>>> > >>>>>> Does this work for a module that calls module_init multiple times? > >>>>> > >>>>> Why should a module calls module_init, instead of the main function? > >>>> > >>>> I think you mean "why should a module calls register_module_init", and I > >>>> agree that with this patch a module will not call register_module_init. > >>>> > >>>> But a module is still using the module_init macro. > >>>> > >>>> With this patch, a module will not be able to use the module_init macro > >>>> twice. I am not sure this is an acceptable limitation, especially if we > >>>> do not have a dependency system within modules and/or load them with > >>>> G_MODULE_LOCAL/RTLD_LOCAL. > >>> > >>> Why would a module ever want to use the module_init macro twice ? > >> > >> Because our coding standard is to have each source file do its own > >> one-time initialization, using static functions and an invocation of > >> module_init per source file. > > > > Is there ever a case where two source files, each using module_init > > will be compiled into the same .so loadable module. Looking at the > > uses of block_init(), I don't see any obvious candidates for trouble, > > all uses look like they'd be going into separate .so files. > > Without inter-module exports, all of SPICE probably would have to be in > a single .so file. This includes spice-qemu-char.c and > hw/display/qxl.c, both of which use type_init. > > If we use G_MODULE_GLOBAL as a primitive system for intermodule exports, > then indeed this is a much smaller problem, but then we need a > dependency system. But I'm almost sure that Windows and maybe Darwin > lack support for the equivalent of G_MODULE_GLOBAL. >
An idea for single .so file: - before loads a .so, an empty initializer list is created. - module_init adds a __attribute__((constructor)) function, which appends its real initializer to the initializer list. So this function is automatically called after dlopen(). - make init_$(date +%s$$$RANDOM) a dummy symbol. - module_load first checks the presense of the symbol, if yes, call the functions in the initializer list. Else clean up and unload .so. Does this enable multiple calls of module_init()? OTOH. As for multiple spice modules, is it possible to solve it by having a spice-common.o and link all spice modules to it, to share code? Fam