Thanks for the response! Hmm yeah, without changes to libc++ it sounds tricky... :(
Is there a way to blacklist or replace symbols during linking in emscripten? I can of course hack things, but using a supported hack would be nice if it existed :) I ask because I've been fiddling and by just commenting out the contents of ios_base::Init ( https://github.com/kripken/emscripten/blob/master/system/lib/libcxx/iostream.cpp#L38) that sets up cin/cout/etc (that I never use) my closure-optimized/gzipped binary went from 308K to 237K (!). If I could - at link time - substitute that function (and a few others) it may be enough to get down to a reasonable size. The other way I see would be to change system_libs.py to add a create_libcxx variant that excludes some of this via preprocessor defines (similar to how DISABLE_EXCEPTION_CATCHING works). Would a DISABLE_STDIO be an interesting PR? On Mon, Nov 7, 2016 at 1:51 PM, Alon Zakai <[email protected]> wrote: > Yeah, any c++ standard library feature can lead to a large increase in > code size, as it ends up linking in big parts of libc++. > > Optimally, it would be nice if upstream libc++ were refactored to avoid > that, but I have no idea how feasible that would be both technically and > not. > > Alternatively, you can use your own custom String class instead of > std::string. You can then make sure it doesn't handle locales and the other > complexity that causes big parts of libc++ to get lumped in. > > Otherwise, some compiler opts might help. On a hello world using an > std::string and -Os, I see 91K output (similar to you). With --closure 1 I > see 72K (at the cost of a slower build time) and with --closure 2 I see 66K > (at the cost of both slower build time and slower runtime as it disables > asm.js). > > Longer-term, wasm will help here. I see the compiled code in that format > is 30K (however, we currently disable minifying the JS part, which we need > to fix). > > > On Mon, Nov 7, 2016 at 1:18 PM, 'Ben Vanik' via emscripten-discuss < > [email protected]> wrote: > >> My resulting asmjs outputs are massive and it's making me sad! I've >> tracked most of the size down to ios_base's global initializer (and the >> world that it pulls in) -- even though I'm not using iostream (or really >> much of anything) and was wondering if anyone had a way to get around this. >> >> My hello world sample compiles to 6KiB, but if I include <string> and add >> a single `std::string foo;` it jumps up ~100KiB (even in -O2 with >> --llvm-lto 1). >> The big difference in output comes down to this: >> ``` >> function __GLOBAL__I_000101() { >> var label = 0, sp = 0; >> sp = STACKTOP; >> __ZNSt3__18ios_base4InitC2Ev(0); >> return; >> } >> + a billion functions called by ios_base::Init. >> ``` >> >> That ios_base::Init pulls in locale and a bunch of other stuff that is >> only ever called from that stack. Because it's a global initializer >> dead-code removal won't get rid of it and it ends up in my final output. It >> seems a bit silly that even when not using iostream >> (cin/cout/strstream/etc) I still take a massive hit. >> >> I found this issue from a year or so ago which seems like exactly what >> I'm seeing: >> https://github.com/kripken/emscripten/issues/2545 >> >> Unfortunately the fix proposed never made it in: >> https://github.com/kripken/emscripten/pull/3308 >> >> Besides not using std::string anywhere (which is extremely difficult >> given the code I'm compiling) has anyone found solutions for removing this >> bloat? Is there any emscripten features (in-progress or planned) that will >> help situations like this? >> >> -- >> 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.
