Skip to content

Commit 7c63bc6

Browse files
committed
doc: document how to register external bindings for snapshot
PR-URL: #37463 Refs: #35711 Reviewed-By: Juan José Arboleda <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent 1ca4a9c commit 7c63bc6

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

src/README.md

+55
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,55 @@ void Initialize(Local<Object> target,
413413
NODE_MODULE_CONTEXT_AWARE_INTERNAL(cares_wrap, Initialize)
414414
```
415415
416+
If the C++ binding is loaded during bootstrap, it needs to be registered
417+
with the utilities in `node_external_reference.h`, like this:
418+
419+
```cpp
420+
namespace node {
421+
namespace utils {
422+
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
423+
registry->Register(GetHiddenValue);
424+
registry->Register(SetHiddenValue);
425+
// ... register all C++ functions used to create FunctionTemplates.
426+
}
427+
} // namespace util
428+
} // namespace node
429+
430+
// The first argument passed to `NODE_MODULE_EXTERNAL_REFERENCE`,
431+
// which is `util` here, needs to be added to the
432+
// `EXTERNAL_REFERENCE_BINDING_LIST_BASE` list in node_external_reference.h
433+
NODE_MODULE_EXTERNAL_REFERENCE(util, node::util::RegisterExternalReferences)
434+
```
435+
436+
Otherwise, you might see an error message like this when building the
437+
executables:
438+
439+
```console
440+
FAILED: gen/node_snapshot.cc
441+
cd ../../; out/Release/node_mksnapshot out/Release/gen/node_snapshot.cc
442+
Unknown external reference 0x107769200.
443+
<unresolved>
444+
/bin/sh: line 1: 6963 Illegal instruction: 4 out/Release/node_mksnapshot out/Release/gen/node_snapshot.cc
445+
```
446+
447+
You can try using a debugger to symbolicate the external reference. For example,
448+
with lldb's `image lookup --address` command (with gdb it's `info symbol`):
449+
450+
```console
451+
$ lldb -- out/Release/node_mksnapshot out/Release/gen/node_snapshot.cc
452+
(lldb) run
453+
Process 7012 launched: '/Users/joyee/projects/node/out/Release/node_mksnapshot' (x86_64)
454+
Unknown external reference 0x1004c8200.
455+
<unresolved>
456+
Process 7012 stopped
457+
(lldb) image lookup --address 0x1004c8200
458+
Address: node_mksnapshot[0x00000001004c8200] (node_mksnapshot.__TEXT.__text + 5009920)
459+
Summary: node_mksnapshot`node::util::GetHiddenValue(v8::FunctionCallbackInfo<v8::Value> const&) at node_util.cc:159
460+
```
461+
462+
Which explains that the unregistered external reference is
463+
`node::util::GetHiddenValue` defined in `node_util.cc`.
464+
416465
<a id="per-binding-state"></a>
417466
#### Per-binding state
418467

@@ -463,6 +512,12 @@ void InitializeHttpParser(Local<Object> target,
463512
}
464513
```
465514
515+
If the binding is loaded during bootstrap, add it to the
516+
`SERIALIZABLE_OBJECT_TYPES` list in `src/node_snapshotable.h` and
517+
inherit from the `SnapshotableObject` class instead. See the comments
518+
of `SnapshotableObject` on how to implement its serialization and
519+
deserialization.
520+
466521
<a id="exception-handling"></a>
467522
### Exception handling
468523

0 commit comments

Comments
 (0)