Skip to content

why V8 platform symbol not exported #34790

New issue

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

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

Already on GitHub? # to your account

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?

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

No branches or pull requests

3 participants