Help Dynamic Linking?

32 views
Skip to first unread message

J Decker

unread,
May 30, 2019, 8:44:31 AM5/30/19
to emscripten-discuss
https://gist.github.com/d3x0r/ca3cef9a5fc9124dd1f43a94ce098b5b

This gist approximately demonstrates what I'm doing.
In my main code I'm getting 'undefined reference to '_free'' which IS exported in the libcore equivalent...

The error that script is generating is...

```
M:\sack\amalgamate\wasmgui\testlink>call emcc  main.c -L. -lc.wasm -o main.wasm
emcc:WARNING: ignoring dynamic library libc.wasm.so because not compiling to JS or HTML, remember to link it when compiling to JS or HTML at the end
error: undefined symbol: runTask
warning: To disable errors for undefined symbols use `-s ERROR_ON_UNDEFINED_SYMBOLS=0`
Error: Aborting compilation due to previous errors
shared:ERROR: 'H:/dev2/emsdk/node/8.9.1_64bit/bin/node.exe H:\dev2\emsdk\emscripten\1.38.32\src\compiler.js C:\Users\XXX\AppData\Local\Temp\tmp7btk6r.txt H:\dev2\emsdk
\emscripten\1.38.32\src\library_pthread_stub.js' failed (1)
```

How should I actually be generating dynamic modules?  Can I specify just the base name to emcc?  like -o 'x.wasm' isn't really enough because it can generate .js, .wast, .mem all at once....

Do dynamic modules actually load each other?  Is all of that linking information actually in the .JS file?  I did a quick search for the other 'libraries' that core/image linked to... but didn't find that text...

I have been able to take all of the following, and compact it into 1 module; but in reality, the next projects cannot be conglomerated as easily....

I have a structure kind of like... hmm
several low level libraries like zlib, png, jpeg, freetype, genx, expat
I have a common core module, which is definitely a good candidate for -s MAIN_MODULE
I have an image module, which links to core and zlib, png, jpeg, freetype
I have a controls module, which links to core and expat, genx

Then I have a loader.c (main.c)

It does some things like setup emscripten filesystems, calls the core's initialization, which should dynamically load the image module, which will provide a structure with function pointers which the controls library will use.

It then runs a function in the controls module (the 'app')

The layer, I have a presentation shell, which is a dynamic module, which links to controls and core, but then it has a bunch of dynamic module plugins, which link to core.

These module plugins have no functions to export.  There was a comment I read long the way saying 'a module that doesn't export anything is pretty useless'.  Modules still have a start point, which allows them to run code that lets them then register their functions/interfaces.  Function can also just be flagged with `void f(void) __attribute__((constructor))` which will cause them to run when the module loads, and doesn't require exporting anything.


Sam Clegg

unread,
Jun 28, 2019, 3:41:57 PM6/28/19
to emscripte...@googlegroups.com
Any code that participates in dynamic linking needs to be built with
either SIDE_MODULE or MAIN_MODULE.

You probably want to be compiling your loader.c/main.c with
MAIN_MODULE and all the others with SIDE_MODULE.
> --
> 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 emscripten-disc...@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/emscripten-discuss/6c61563e-6640-4316-ba18-4a2d99469bed%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages