Undefined reference to v8::platform::NewDefaultPlatform

3,370 views
Skip to first unread message

Bogdan Padalko

unread,
Dec 30, 2017, 11:54:46 AM12/30/17
to v8-users
Hi!

I'm trying to adapt changes from https://github.com/v8/v8/commit/ffee558e14e28fc8b1f9a3c10ea3615e0d686c7b to replace CreateDefaultPlatform with NewDefaultPlatform calls, however, for some reason I'm getting

/home/vagrant/php-v8/scripts/test_v8/hello_world.cpp:21: undefined reference to `v8::platform::NewDefaultPlatform(int, v8::platform::IdleTaskSupport, v8::platform::InProcessStackDumping, std::unique_ptr<v8::TracingController, std::default_delete<v8::TracingController> >)'

error with the following code:

#include <v8.h>
#include <libplatform/libplatform.h>

#include <stdlib.h>
#include <string.h>

using namespace v8;

void weak_callback(const v8::WeakCallbackInfo<v8::Persistent<v8::String>>& data) {
  printf
("Weak callback called\n");
  data
.GetParameter()->Reset();
}

int main(int argc, char* argv[]) {
 
// Initialize V8.
  v8
::V8::InitializeICU();
//  v8::Platform *platform = v8::platform::CreateDefaultPlatform();
//  v8::V8::InitializePlatform(platform);

  std
::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
  v8
::V8::InitializePlatform(platform.get());

  V8
::Initialize();

  v8
::Isolate::CreateParams create_params;
  create_params
.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator();

 
// Create a new Isolate and make it the current one.
 
Isolate* isolate = v8::Isolate::New(create_params);

  v8
::Persistent<v8::String> test;

 
{
   
Isolate::Scope isolate_scope(isolate);

   
// Create a stack-allocated handle scope.
   
HandleScope handle_scope(isolate);

   
// Create a new context.
   
Local<Context> context = Context::New(isolate);

   
// Enter the context for compiling and running the hello world script.
   
Context::Scope context_scope(context);


    test
.Reset(isolate, String::NewFromUtf8(isolate, "Hello' + ', World!'"));
    test
.SetWeak(&test, weak_callback, v8::WeakCallbackType::kParameter);


   
// Create a string containing the JavaScript source code.
   
Local<String> source = String::NewFromUtf8(isolate, "(2+2*2) + ' ' + 'Hello' + ', World!'");

   
// Compile the source code.
   
Local<Script> script = Script::Compile(source);

   
// Run the script to get the result.
   
Local<Value> result = script->Run();

   
// Convert the result to an UTF8 string and print it.
   
String::Utf8Value utf8(isolate, result);
    printf
("%s\n", *utf8);
 
}

  isolate
->LowMemoryNotification();


 
// Dispose the isolate and tear down V8.
  isolate
->Dispose();
  V8
::Dispose();
  V8
::ShutdownPlatform();

 
return 0;
}

build script:

#!/bin/bash

ROOT
=/opt/libv8-6.5
LIB_DIR
=$ROOT/lib/

SRC_DIR
=$ROOT
INCLUDE_DIR
=$ROOT/include

set -x

g
++ -std=c++14 hello_world.cpp -o hello_world \
 
-g \
 
-O2 \
 
-std=c++11 \
 
-I$INCLUDE_DIR \
 
-L$LIB_DIR \
 
-Wl,-rpath,$LIB_DIR \
 
-lv8_libbase \
 
-lv8_libplatform \
 
-lv8 \
 
-lpthread

I use v8 build with the following params:

gn gen out.gn/x64.release --args="is_debug=false is_component_build=true v8_use_external_startup_data=false"
ninja
-v d8 -C out.gn/x64.release

Host is x64 Ubuntu 16.04, libv8 installed from my pinepain/libv8-6.5 PPA (https://launchpad.net/~pinepain/+archive/ubuntu/libv8-6.5)

I'd really appreciate if anybody give it a look and provide some suggestions as after spending two days with this I think I just missing something very simple and obvious.

Regards,
Bogdan

Ben Noordhuis

unread,
Dec 30, 2017, 12:28:25 PM12/30/17
to v8-users
It sounds like a link order issue. What happens when you put `-o
hello_world` last?

Bogdan Padalko

unread,
Dec 30, 2017, 1:01:28 PM12/30/17
to v8-users
Thanks for quick reply! Unfortunately, it's the same. I ended up with hello world example after to trying out to use NewDefaultPlatform with php-v8 (https://github.com/pinepain/php-v8/blob/53a562e10c23e5f835b2ccdb20967f9c4aef529e/src/php_v8_a.cc#L34), which yield me there

/home/vagrant/.phpbrew/php/7.2-debug/bin/php: symbol lookup error: /home/vagrant/php-v8/modules/v8.so: undefined symbol: _ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingESt10unique_ptrINS_17TracingControllerESt14default_deleteIS4_EE

With CreateDefaultPlatform it works just fine, and there was no other changes to sources except of using v8 6.5.116 and using NewDefaultPlatform. Bare 6.5.116 with CreateDefaultPlatform works fine.

Zac Hansen

unread,
Dec 31, 2017, 11:47:13 PM12/31/17
to v8-users
If you look at the symbols in your libs is it in there anywhere?

Bogdan Padalko

unread,
Jan 1, 2018, 9:00:21 AM1/1/18
to v8-users
Hi Zac, thanks for the quick reply!

Here's what I see in library:

$ objdump -T /opt/libv8-6.5/lib/libv8_libplatform.so  | grep NewDefault
000000000000a850 g    DF .text    000000000000012e  Base        _ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingENSt3__110unique_ptrINS_17TracingControllerENS3_14default_deleteIS5_EEEE


and this is the error I get later when get php-v8 compiled and try to load:

_ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingESt10unique_ptrINS_17TracingControllerESt14default_deleteIS4_EE

As you see, they differs and it looks like I missed something, but couldn't grasp what and it looks like this is the cause of

/home/vagrant/php-v8/scripts/test_v8/hello_world.cpp:21: undefined reference to `v8::platform::NewDefaultPlatform(int, v8::platform::IdleTaskSupport, v8::platform::InProcessStackDumping, std::unique_ptr<v8::TracingController, std::default_delete<v8::TracingController> >)'

error too.

Happy New Year!
Bogdan

Ben Noordhuis

unread,
Jan 1, 2018, 9:17:54 AM1/1/18
to v8-users
On Mon, Jan 1, 2018 at 3:00 PM, Bogdan Padalko <zaq17...@gmail.com> wrote:
> Hi Zac, thanks for the quick reply!
>
> Here's what I see in library:
>
> $ objdump -T /opt/libv8-6.5/lib/libv8_libplatform.so | grep NewDefault
> 000000000000a850 g DF .text 000000000000012e Base
> _ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingENSt3__110unique_ptrINS_17TracingControllerENS3_14default_deleteIS5_EEEE
>
>
> and this is the error I get later when get php-v8 compiled and try to load:
>
> _ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingESt10unique_ptrINS_17TracingControllerESt14default_deleteIS4_EE
>
> As you see, they differs and it looks like I missed something, but couldn't
> grasp what and it looks like this is the cause of
>
> /home/vagrant/php-v8/scripts/test_v8/hello_world.cpp:21: undefined reference
> to `v8::platform::NewDefaultPlatform(int, v8::platform::IdleTaskSupport,
> v8::platform::InProcessStackDumping, std::unique_ptr<v8::TracingController,
> std::default_delete<v8::TracingController> >)'
>
> error too.
>
> Happy New Year!
> Bogdan

If you run them through c++filt, you'll see the difference:

v8::platform::NewDefaultPlatform(int, v8::platform::IdleTaskSupport,
v8::platform::InProcessStackDumping,
std::__1::unique_ptr<v8::TracingController,
std::__1::default_delete<v8::TracingController> >)

vs:

v8::platform::NewDefaultPlatform(int, v8::platform::IdleTaskSupport,
v8::platform::InProcessStackDumping,
std::unique_ptr<v8::TracingController,
std::default_delete<v8::TracingController> >)

I'm guessing one is compiled against different headers than the other
or with a different -std=... flag. If you built V8 with the bundled
clang, try rebuilding it with clang=0.

Bogdan Padalko

unread,
Jan 1, 2018, 1:57:12 PM1/1/18
to v8-users
Thanks Ben! This is it. It was my fault building with clang and hoping that the build will be relocatable.

Building with GN args:

     is_debug: false,
     is_official_build
: true,
     is_component_build
: true,
     is_cfi
: false,
     is_clang
: false,
     v8_use_external_startup_data
: false,
     treat_warnings_as_errors
: false,
     use_custom_libcxx
: false,
     use_sysroot
: false,
     use_gold
: false

works perfect!

Thank you all who's been helping me with this! Happy New Year!

Regards,
Bogdan

Zac Hansen

unread,
Jan 2, 2018, 12:59:48 AM1/2/18
to v8-users
It's not a "relocation" issue, I'm pretty sure -- it's a stdlib issue.   It looks like the first symbol was from libc++ (the __1 gives it away) and the second was most likely from libstdc++.  <== just a guess but pretty consistent with stuff I've seen before.

Bogdan Padalko

unread,
Jan 2, 2018, 4:41:47 AM1/2/18
to v8-users
Indeed. By "relocation" I mean that it was built using one stdlib and moved to the system with another one, but I agree that it's more correct to name as stdlib issue rather then relocation issue. I tried to link with libc++.so that generated by v8 build, though, no luck with it for some reason. For now using is_clang=false works fine, apart that it increases php-v8 tests run time with valgrind enabled significantly.

Zac Hansen

unread,
Jan 2, 2018, 8:57:00 AM1/2/18
to v8-u...@googlegroups.com
The problem is that when you *compile* with libstdc++ when building against the v8 external API header, it generates object files looking for symbols with the libstdc++ names.   

At that point there's no winning because you have v8 libs which need libc++ and your object files which need libstdc++.

At least that's how I understand it.

--
--
v8-users mailing list
v8-u...@googlegroups.com
http://groups.google.com/group/v8-users
---
You received this message because you are subscribed to a topic in the Google Groups "v8-users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/v8-users/Jb1VSouy2Z0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to v8-users+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Jean Pix

unread,
Jan 2, 2018, 7:38:15 PM1/2/18
to v8-users
BRENDAN EICH suggests the source code compiler be V8 C++ SYNTAX SCRIPT
Reply all
Reply to author
Forward
0 new messages