66 * Dynamic library loading
77 */
88
9- #if ! RELOCATABLE
10- #error "library_dylink.js requires RELOCATABLE"
9+ #if ! MAIN_MODULE && ! RELOCATABLE
10+ #error "library_dylink.js requires MAIN_MODULE or RELOCATABLE"
1111#endif
1212
1313var LibraryDylink = {
@@ -170,10 +170,10 @@ var LibraryDylink = {
170170 get ( obj , symName ) {
171171 var rtn = GOT [ symName ] ;
172172 if ( ! rtn ) {
173- rtn = GOT [ symName ] = new WebAssembly . Global ( { 'value' : '{{{ POINTER_WASM_TYPE }}}' , 'mutable' : true } ) ;
174173#if DYLINK_DEBUG == 2
175- dbg ( " new GOT entry: " + symName ) ;
174+ dbg ( ` new GOT entry: ${ symName } ` ) ;
176175#endif
176+ rtn = GOT [ symName ] = new WebAssembly . Global ( { 'value' : '{{{ POINTER_WASM_TYPE }}}' , 'mutable' : true } , { { { to64 ( - 1 ) } } } ) ;
177177 }
178178 if ( ! currentModuleWeakSymbols . has ( symName ) ) {
179179 // Any non-weak reference to a symbol marks it as `required`, which
@@ -189,6 +189,11 @@ var LibraryDylink = {
189189 $isInternalSym : ( symName ) => {
190190 // TODO: find a way to mark these in the binary or avoid exporting them.
191191 return [
192+ 'memory' ,
193+ '__memory_base' ,
194+ '__table_base' ,
195+ '__stack_pointer' ,
196+ '__indirect_function_table' ,
192197 '__cpp_exception' ,
193198 '__c_longjmp' ,
194199 '__wasm_apply_data_relocs' ,
@@ -213,6 +218,7 @@ var LibraryDylink = {
213218
214219 $updateGOT__internal : true ,
215220 $updateGOT__deps : [ '$GOT' , '$isInternalSym' , '$addFunction' ] ,
221+ $updateGOT__docs : '/** @param {boolean=} replace */' ,
216222 $updateGOT : ( exports , replace ) = > {
217223#if DYLINK_DEBUG
218224 dbg ( `updateGOT: adding ${ Object . keys ( exports ) . length } symbols` ) ;
@@ -230,18 +236,14 @@ var LibraryDylink = {
230236 }
231237#endif
232238
233-
234- var existingEntry = GOT [ symName ] && GOT [ symName ] . value != 0 ;
239+ var existingEntry = GOT [ symName ] && GOT [ symName ] . value != { { { to64 ( - 1 ) } } } ;
235240 if ( replace || ! existingEntry ) {
236241#if DYLINK_DEBUG == 2
237- dbg ( `updateGOT: before: ${ symName } : ${ GOT [ symName ] . value } ` ) ;
242+ dbg ( `updateGOT: before: ${ symName } : ${ GOT [ symName ] ? .value } ` ) ;
238243#endif
239244 var newValue ;
240245 if ( typeof value == 'function' ) {
241246 newValue = { { { to64 ( 'addFunction(value)' ) } } } ;
242- #if DYLINK_DEBUG == 2
243- dbg ( `updateGOT: FUNC: ${ symName } : ${ GOT [ symName ] . value } ` ) ;
244- #endif
245247 } else if ( typeof value == { { { POINTER_JS_TYPE } } } ) {
246248 newValue = value ;
247249 } else {
@@ -255,7 +257,7 @@ var LibraryDylink = {
255257#if DYLINK_DEBUG == 2
256258 dbg ( `updateGOT: after: ${ symName } : ${ newValue } (${ value } )` ) ;
257259#endif
258- GOT [ symName ] || = new WebAssembly . Global ( { 'value' : '{{{ POINTER_WASM_TYPE }}}' , 'mutable' : true } ) ;
260+ GOT [ symName ] ?? = new WebAssembly . Global ( { 'value' : '{{{ POINTER_WASM_TYPE }}}' , 'mutable' : true } ) ;
259261 GOT [ symName ] . value = newValue ;
260262 }
261263#if DYLINK_DEBUG
@@ -283,9 +285,12 @@ var LibraryDylink = {
283285
284286 // Applies relocations to exported things.
285287 $relocateExports__internal : true ,
286- $relocateExports__deps : [ '$updateGOT' , '$isImmutableGlobal' ] ,
287- $relocateExports__docs : '/** @param {boolean=} replace */' ,
288- $relocateExports : ( exports , memoryBase , replace ) = > {
288+ $relocateExports__deps : [ '$isImmutableGlobal' ] ,
289+ $relocateExports : ( exports , memoryBase = 0 ) = > {
290+ #if DYLINK_DEBUG
291+ dbg ( `relocateExports memoryBase=${ memoryBase } count=${ Object . keys ( exports ) . length } ` ) ;
292+ #endif
293+
289294 function relocateExport ( name , value ) {
290295#if SPLIT_MODULE
291296 // Do not modify exports synthesized by wasm-split
@@ -307,7 +312,6 @@ var LibraryDylink = {
307312 for ( var e in exports ) {
308313 relocated [ e ] = relocateExport ( e , exports [ e ] )
309314 }
310- updateGOT ( relocated , replace ) ;
311315 return relocated ;
312316 } ,
313317
@@ -318,13 +322,17 @@ var LibraryDylink = {
318322 dbg ( 'reportUndefinedSymbols' ) ;
319323#endif
320324 for ( var [ symName , entry ] of Object . entries ( GOT ) ) {
321- if ( entry . value == 0 ) {
325+ if ( entry . value == { { { to64( - 1 ) } } } ) {
326+ #if DYLINK_DEBUG
327+ dbg ( `undef GOT entry: ${ symName } ` ) ;
328+ #endif
322329 var value = resolveGlobalSymbol ( symName , true ) . sym ;
323330 if ( ! value && ! entry . required ) {
324331 // Ignore undefined symbols that are imported as weak.
325332#if DYLINK_DEBUG
326333 dbg ( 'ignoring undefined weak symbol:' , symName ) ;
327334#endif
335+ entry . value = 0 ;
328336 continue ;
329337 }
330338#if ASSERTIONS
@@ -346,7 +354,7 @@ var LibraryDylink = {
346354 entry . value = value ;
347355#endif
348356 } else {
349- throw new Error ( `bad export type for '${ symName } ': ${ typeof value } ` ) ;
357+ throw new Error ( `bad export type for '${ symName } ': ${ typeof value } ( ${ value } ) ` ) ;
350358 }
351359 }
352360 }
@@ -393,7 +401,7 @@ var LibraryDylink = {
393401 // Allocate memory even if malloc isn't ready yet. The allocated memory here
394402 // must be zero initialized since its used for all static data, including bss.
395403 $getMemory__noleakcheck: true ,
396- $getMemory__deps : [ '$GOT' , '__heap_base' , '$alignMemory' , 'calloc' ] ,
404+ $getMemory__deps : [ '$GOT' , 'emscripten_get_sbrk_ptr' , ' __heap_base', '$alignMemory' , 'calloc' ] ,
397405 $getMemory : ( size ) => {
398406 // After the runtime is initialized, we must only use sbrk() normally.
399407#if DYLINK_DEBUG
@@ -411,8 +419,15 @@ var LibraryDylink = {
411419#if ASSERTIONS
412420 assert ( end <= HEAP8 . length , 'failure to getMemory - memory growth etc. is not supported there, call malloc/sbrk directly or increase INITIAL_MEMORY' ) ;
413421#endif
414- ___heap_base = end ;
415- GOT [ '__heap_base' ] . value = { { { to64 ( 'end' ) } } } ;
422+ ___heap_base = { { { to64 ( 'end' ) } } } ;
423+ #if PTHREADS
424+ if ( ! ENVIRONMENT_IS_PTHREAD ) {
425+ #endif
426+ var sbrk_ptr = _emscripten_get_sbrk_ptr ( ) ;
427+ { { { makeSetValue ( 'sbrk_ptr' , 0 , 'end' , '*' ) } } }
428+ #if PTHREADS
429+ }
430+ #endif
416431 return ret ;
417432 } ,
418433
@@ -625,7 +640,7 @@ var LibraryDylink = {
625640 * @param {number=} handle
626641 */` ,
627642 $loadWebAssemblyModule__deps : [
628- '$loadDynamicLibrary' , '$getMemory' ,
643+ '$loadDynamicLibrary' , '$getMemory' , '$updateGOT' ,
629644 '$relocateExports' , '$resolveGlobalSymbol' , '$GOTHandler' ,
630645 '$getDylinkMetadata' , '$alignMemory' ,
631646 '$currentModuleWeakSymbols' ,
@@ -635,7 +650,7 @@ var LibraryDylink = {
635650 ] ,
636651 $loadWebAssemblyModule : ( binary , flags , libName , localScope , handle ) = > {
637652#if DYLINK_DEBUG
638- dbg ( 'loadWebAssemblyModule:' , libName ) ;
653+ dbg ( 'loadWebAssemblyModule:' , libName, handle ) ;
639654#endif
640655 var metadata = getDylinkMetadata ( binary ) ;
641656
@@ -654,6 +669,9 @@ var LibraryDylink = {
654669 // exclusive access to it for the duration of this function. See the
655670 // locking in `dynlink.c`.
656671 var firstLoad = ! handle || ! { { { makeGetValue ( 'handle' , C_STRUCTS . dso . mem_allocated , 'i8' ) } } } ;
672+ #if DYLINK_DEBUG
673+ dbg ( 'firstLoad :', firstLoad ) ;
674+ #endif
657675 if ( firstLoad ) {
658676#endif
659677 // alignments are powers of 2
@@ -790,6 +808,7 @@ var LibraryDylink = {
790808 // add new entries to functionsInTableMap
791809 updateTableMap ( tableBase , metadata . tableSize ) ;
792810 moduleExports = relocateExports ( instance . exports , memoryBase ) ;
811+ updateGOT ( moduleExports ) ;
793812#if ASYNCIFY
794813 moduleExports = Asyncify . instrumentWasmExports ( moduleExports ) ;
795814#endif
@@ -881,18 +900,27 @@ var LibraryDylink = {
881900 if ( applyRelocs ) {
882901 if ( runtimeInitialized ) {
883902#if DYLINK_DEBUG
884- dbg ( 'applyRelocs ' ) ;
903+ dbg ( 'running __wasm_apply_data_relocs ' ) ;
885904#endif
886905 applyRelocs ( ) ;
887906 } else {
907+ #if DYLINK_DEBUG
908+ dbg ( 'delaying __wasm_apply_data_relocs' ) ;
909+ #endif
888910 __RELOC_FUNCS__ . push ( applyRelocs ) ;
889911 }
890912 }
891913 var init = moduleExports [ '__wasm_call_ctors' ] ;
892914 if ( init ) {
893915 if ( runtimeInitialized ) {
916+ #if DYLINK_DEBUG
917+ dbg ( 'running __wasm_call_ctors' ) ;
918+ #endif
894919 init ( ) ;
895920 } else {
921+ #if DYLINK_DEBUG
922+ dbg ( 'delaying __wasm_call_ctors' ) ;
923+ #endif
896924 // we aren't ready to run compiled code yet
897925 addOnPostCtor ( init ) ;
898926 }
0 commit comments