Thanks for reply, Brion! I wonder what '--whole-archive' flag is actually doing in GCC linker. As I understand dead-symbol elimination is still applied in GCC, but the flag doesn't allow archive to be skipped completely from linking.
Andrew. среда, 11 января 2017 г., 16:36:35 UTC+3 пользователь Brion Vibber написал: > > Emscripten does some extra dead-symbol elimination which seems to kill the > static initializer when linking in a separate .a library archive. > > You can pass the -s LINKABLE=1 option to disable dead-symbol elimination, > but this may increase the total size of the resulting output... (I think > it's including the whole C standard library?) > > If you can, try building the 'plugin' part to an .so or .o file instead of > an .a static library, it seems to be happier linking that way and doesn't > bloat the output file. By building a libLib.so instead of libLib.a, I can > successfully link your demo and have the plugin bit run without any special > linker options. (.so libs will be statically linked) > > -- brion > > > On Wed, Jan 11, 2017 at 12:34 AM, Andrew S. <[email protected] > <javascript:>> wrote: > >> >> Steps to reproduce: >> >> *Main.cpp:* >> >> static void (*g_pFunc)() = 0; >> >> void Register(void (*pFunc)()) >> { >> g_pFunc = pFunc; >> } >> >> int main() >> { >> if (g_pFunc) >> g_pFunc(); >> >> return 0; >> } >> >> *Lib.cpp:* >> >> #include <stdio.h> >> >> extern void Register(void (*pFunc)()); >> >> static void PrintFunc() >> { >> printf("Hello from lib\n"); >> } >> >> struct CRegistrator >> { >> CRegistrator() >> { >> Register(&PrintFunc); >> } >> }; >> >> static CRegistrator g_Registrator; >> >> *Compile with Emscripten:* >> >> em++ -c -o Lib.o Lib.cpp >> emar rcs libLib.a Lib.o >> em++ Main.cpp -Wl,--whole-archive libLib.a -Wl,--no-whole-archive -o >> a.html >> >> *a.html should print "Hello from lib", but it doesn't.* >> >> *Compile with GCC:* >> >> g++ -c -o Lib.o Lib.cpp >> ar rcs libLib.a Lib.o >> g++ Main.cpp -Wl,--whole-archive libLib.a -Wl,--no-whole-archive -o a.out >> >> *a.out prints "Hello from lib" as expected.* >> >> Hi! >>> >>> I need to link an executable against a static library which is using >>> only static variables for its registration (this is actually a plugin). >>> >>> Usually -force_load (for Clang) or --whole-archive (for GCC) are used to >>> force a library to link. But it seems link Emscripten just ignores these >>> flags. >>> >>> Any advice? >>> >>> Andrew. >>> >> -- >> You received this message because you are subscribed to the Google Groups >> "emscripten-discuss" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > > -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
