why V8 platform symbol not exported #34790
Copy link
Copy link
Closed
Labels
v8 engineIssues and PRs related to the V8 dependency.Issues and PRs related to the V8 dependency.
Description
Take https://github.com/nodejs/node-addon-examples/tree/master/1_hello_world/napi
patch hello.cc like this
#include <assert.h>
#include <node_api.h>
#include <v8.h>
#include <libplatform/libplatform.h>
napi_value Method(napi_env env, napi_callback_info info) {
napi_status status;
napi_value world;
status = napi_create_string_utf8(env, "world", 5, &world);
assert(status == napi_ok);
return world;
}
#define DECLARE_NAPI_METHOD(name, func) \
{ name, 0, func, 0, 0, 0, napi_default, 0 }
napi_value Init(napi_env env, napi_value exports) {
std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
v8::V8::InitializePlatform(platform.get());
v8::V8::Initialize();
napi_status status;
napi_property_descriptor desc = DECLARE_NAPI_METHOD("hello", Method);
status = napi_define_properties(env, exports, 1, &desc);
assert(status == napi_ok);
return exports;
}
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)Running it will result in
/usr/local/bin/node: symbol lookup error: /mnt/d/Developer/node-addon-examples/1_hello_world/napi/build/Release/hello.node: undefined symbol: _ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingESt10unique_ptrINS_17TracingControllerESt14default_deleteIS4_EE
error Command failed with exit code 127.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.As far as I understand, <libplatform/libplatform.h> is public V8 api, why related symbols not export.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
v8 engineIssues and PRs related to the V8 dependency.Issues and PRs related to the V8 dependency.
Activity
bnoordhuis commentedon Aug 15, 2020
The
v8::Platforminstance is a singleton that's managed by the embedder. There's simply no reason why an add-on (which isn't an embedder) would ever need to create one.Your example add-on is not valid code. I mean, it compiles, but there's no way it'd work even if the symbols were exported.
gengjiawen commentedon Aug 16, 2020
I want to use v8 api without compiling the whole v8, that's why I choose add-on. Like showcase how to use v8 api to make a hello world.
Why is this ? Do you mean the code is not complete. I delibarately skip code call like
v8::Script::Compileto make it minimal.gengjiawen commentedon Aug 17, 2020
Looks like the symbol export controlled by macro
BUILDING_V8_PLATFORM_SHARED, I will give it a try on my local build Node.js.bnoordhuis commentedon Aug 17, 2020
To elaborate: there can be only a single
v8::Platforminstance and that singleton is owned and managed by Node.js. Add-ons can't create their own because they can't set up a completely separate instance of V8.Bad car analogy: a car has a single steering wheel and it's steered by the driver, not the passengers (heart attacks excepting!) Node is the driver, add-ons are the passengers.
targos commentedon Nov 20, 2021
@gengjiawen can we close this?