Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

why V8 platform symbol not exported #34790

Closed
gengjiawen opened this issue Aug 15, 2020 · 5 comments
Closed

why V8 platform symbol not exported #34790

gengjiawen opened this issue Aug 15, 2020 · 5 comments
Labels
v8 engine Issues and PRs related to the V8 dependency.

Comments

@gengjiawen
Copy link
Member

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.

@gengjiawen gengjiawen added the v8 engine Issues and PRs related to the V8 dependency. label Aug 15, 2020
@bnoordhuis
Copy link
Member

The v8::Platform instance 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
Copy link
Member Author

The v8::Platform instance 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.

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.

there's no way it'd work even if the symbols were exported.

Why is this ? Do you mean the code is not complete. I delibarately skip code call like v8::Script::Compile to make it minimal.

@gengjiawen
Copy link
Member Author

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
Copy link
Member

To elaborate: there can be only a single v8::Platform instance 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
Copy link
Member

targos commented Nov 20, 2021

@gengjiawen can we close this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
v8 engine Issues and PRs related to the V8 dependency.
Projects
None yet
Development

No branches or pull requests

3 participants