Dead-symbol elimination is supported in gcc/gnu ld (if you use e.g.
-ffunction-sections/-fdata-sections and -Wl,--gc-sections) but not enabled
by default, so --whole-archive could be useful by itself. But you are right
that if you enabled them both, the extra archive members would just be
stripped out.

On Wed, Jan 11, 2017 at 9:01 AM Andrew S. <[email protected]>
wrote:

> 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]> 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].
> 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.
>

-- 
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.

Reply via email to