Hi everyone,

I'm trying to build V8 monolithic version *13.9.205.16* and am running into 
some linker errors.

Here are my args.gn:
```
dcheck_always_on=false
is_component_build=false
is_debug=false
target_cpu="x64"
v8_monolithic=true
v8_use_external_startup_data=false
v8_enable_temporal_support=false
```

And this is the output when I try to build a "hello world" sample:
```
clang++ -I. -Iinclude samples/hello-world.cc -o hello_world -fno-rtti 
-fuse-ld=lld -lv8_monolith -lv8_libbase -lv8_libplatform 
-Lout.gn/Linux.x64.release/o
bj/ -pthread -std=c++20 -DV8_COMPRESS_POINTERS -DV8_ENABLE_SANDBOX
ld.lld: error: undefined symbol: v8::platform::NewDefaultPlatform(int, 
v8::platform::IdleTaskSupport, v8::platform::InProcessStackDumping, 
std::unique_ptr<v8::TracingController, 
std::default_delete<v8::TracingController>>, v8::platform::PriorityMode)
>>> referenced by hello-world.cc
>>>               /tmp/hello-world-87a9ec.o:(main)

ld.lld: error: undefined symbol: std::__Cr::ios_base::init(void*)
>>> referenced by logging.cc
>>>               logging.o:(std::__Cr::basic_string<char, 
std::__Cr::char_traits<char>, std::__Cr::allocator<char>>* 
v8::base::MakeCheckOpString<int, int>(int, int, char const*)) in archive 
out.gn/Linux.x64.release/obj/libv8_monolith.a
>>> referenced by logging.cc
>>>               logging.o:(std::__Cr::basic_string<char, 
std::__Cr::char_traits<char>, std::__Cr::allocator<char>> 
v8::base::detail::PrintToString<int>(int&&)) in archive 
out.gn/Linux.x64.release/obj/libv8_monolith.a
>>> referenced by logging.cc
>>>               logging.o:(std::__Cr::basic_string<char, 
std::__Cr::char_traits<char>, std::__Cr::allocator<char>>* 
v8::base::MakeCheckOpString<long, long>(long, long, char const*)) in 
archive out.gn/Linux.x64.release/obj/libv8_monolith.a
>>> referenced 100 more times
[.....]
```

It seems there are some *undefined symbols*, specifically related 
to v8::platform::NewDefaultPlatform and some std library components.

Has anyone encountered this issue or know what might be causing it?

Thanks

在2025年6月9日星期一 UTC+8 23:13:27<Jay Hayes> 写道:

> Looks like the hello_world example now requires the rust rlibs to be 
> included when linking if v8_enable_temporal_support is set to true so 
> that answers that question.
>
> I was able to track down why 13.8 (13.8.258.2) doesn't build successfully 
> when using gcc/libstdc++ but I don't understand what exactly is causing the 
> issue.
>
> Originally when I attempted to build 13.8 (13.8.258.2) with gcc/libstdc++, 
> the *mksnapshot* target would fail during linking with:
> undefined reference to 
> `rust_allocator_internal::alloc_error_handler_impl()'
>
> If I manually edit the generated 
> out.gn/x64.release.sample/obj/mksnapshot.ninja and add 
> obj/build/rust/allocator/liballoc_error_handler_impl.a to the rlibs 
> section, the build succeeds and I can compile and link the hello_world 
> example to v8 as well.
>
> My confusion is due to the fact the generated mksnapshot.ninja (for both 
> gcc/libstdc++ and clang/libcxx) contains 
> obj/build/rust/allocator/liballoc_error_handler_impl.a within:
> build ./mksnapshot: link obj/mksnapshot/builtins-effects-dummy.o
> <...>
> obj/build/rust/allocator/liballoc_error_handler_impl.a
> <...>
>
> yet gcc/libstdc++ fails during linking without the manual rlib edit to 
> mksnapshot.ninja.
> On Friday, June 6, 2025 at 5:45:49 AM UTC-4 Jakob Kummerow wrote:
>
>> The build system does not care about directory names, only GN args matter.
>>
>> Using the same standard library is probably much more important than 
>> using the same compiler; but if it ever happens that using Clang fixes an 
>> issue that occurs when using GCC, then that's our recommended solution.
>>
>> The temporal_rs stuff is pretty new, `gclient sync` should download what 
>> you need at the version you need it.
>>
>> And yes, someone should update the embedding guide again... I'd hope it's 
>> enough to simply replace the compiler binary name on the command line.
>>
>>
>> On Thu, Jun 5, 2025 at 10:17 PM Jay Hayes <jacky...@gmail.com> wrote:
>>
>>> Thank you for the info.  My copy/paste of the gn config from the post I 
>>> referenced into the  x64.*release *directory somehow made me blind to 
>>> the fact is_debug was set to true.
>>>
>>> I also didn't realize we would have to compile the rest of our app with 
>>> clang if we were linking to the static v8 libs.  Maybe that explains why I 
>>> was getting the original link error when trying to build the hello_world 
>>> example using g++:
>>> ld.lld: error: undefined symbol: v8::platform::NewDefaultPlatform(int, 
>>> v8::platform::IdleTaskSupport, v8::platform::InProcessStackDumping, 
>>> std::unique_ptr<v8::TracingController, 
>>> std::default_delete<v8::TracingController>>, v8::platform::PriorityMode)
>>> >>> referenced by hello-world.cc
>>> >>>               /tmp/hello-world-901944.o:(main)
>>>
>>> Using the following config:
>>> dcheck_always_on = false
>>> is_component_build = false
>>> is_debug = false
>>> target_cpu = "x64"
>>> v8_monolithic = true
>>> v8_use_external_startup_data = false
>>>
>>> I am able to build 13.8 (13.8.258.2) successfully and, if I use clang 
>>> and the custom libcxx library, I can almost build the hello_world example; 
>>> seems I missing this temporal_rs lib somehow:
>>> ld.lld: error: undefined symbol: temporal_rs_Instant_epoch_milliseconds
>>> >>> referenced by js-date-time-format.cc
>>> >>>               js-date-time-format.o:(v8::internal::(anonymous 
>>> namespace)::HandleDateTimeTemporalInstant(v8::internal::Isolate*, 
>>> icu_74::SimpleDateFormat const&, 
>>> v8::internal::DirectHandle<v8::internal::JSTemporalInstant>, char const*)) 
>>> in archive out.gn/x64.release.sample/obj/libv8_monolith.a
>>>
>>> If I add v8_enable_temporal_support = false  to the config and rebuild, 
>>> then the hello_world example builds/runs successfully and is 49 MB (vs. 3.3 
>>> GB) :)
>>>
>>> The embedding guide <https://v8.dev/docs/embed> still uses g++, could 
>>> you provide the correct way to build the example with clang as I'm curious 
>>> why this temporal_rs is an issue when linking?
>>>
>>> Thanks!
>>> On Thursday, June 5, 2025 at 6:27:39 AM UTC-4 Jakob Kummerow wrote:
>>>
>>>> The binary size is caused by `is_debug = true`. That configuration is 
>>>> very useful for debugging, but is both slow and large. For release-mode 
>>>> binaries, set `is_debug = false`.
>>>>
>>>> Regarding `is_clang` and `use_custom_libcxx`: Drop them both to get the 
>>>> configuration we test and support. You will then also need to compile the 
>>>> rest of your application with clang and libstdc++, which is an obstacle 
>>>> for 
>>>> some projects. Alternatively, you can continue to use g++ and libc++ and 
>>>> hope that it works, or debug/fix it when it doesn't. We'd probably even 
>>>> accept reasonably non-intrusive patches for upstreaming.
>>>>
>>>> Remember to run `gclient sync` after checking out a different git 
>>>> commit. (I'm not sure whether that explains your 13.8 difficulties.)
>>>>
>>>>
>>>> On Wed, Jun 4, 2025 at 8:06 PM Jay Hayes <jacky...@gmail.com> wrote:
>>>>
>>>>> Hi all,
>>>>>
>>>>> We are experimenting with building v8 for embedding within our c++ 
>>>>> application.
>>>>>
>>>>> Following the guidance - https://v8.dev/docs/embed, it seems the doc 
>>>>> is for 13.1.  When I try to builder newer code using the 
>>>>> *x64.release.sample* config, the build fails very quickly:
>>>>> ../../src/base/vector.h:296:32: error: no member named 
>>>>> 'make_unique_for_overwrite' in namespace 'std'
>>>>>
>>>>> I then discovered this issue - 
>>>>> https://issues.chromium.org/issues/377222400 which speaks to the fact 
>>>>> the doc might be out of date.
>>>>>
>>>>> Using the suggested config from the linked issue above:
>>>>>
>>>>> target_cpu = "x64"
>>>>> target_os = "linux"
>>>>> is_debug = true
>>>>> is_component_build = false
>>>>> v8_monolithic = true
>>>>> v8_static_library = false
>>>>> v8_use_external_startup_data = false
>>>>> use_custom_libcxx = false
>>>>> is_clang = false
>>>>> treat_warnings_as_errors = false
>>>>>
>>>>> $ ninja -v -C out.gn/x64.release v8_monolith
>>>>>
>>>>> $ g++ -I. -Iinclude samples/hello-world.cc -o hello_world -fno-rtti 
>>>>> -fuse-ld=lld -lv8_monolith -lv8_libbase -lv8_libplatform 
>>>>> -Lout.gn/x64.release/obj/ -pthread -std=c++20 -DV8_COMPRESS_POINTERS 
>>>>> -DV8_ENABLE_SANDBOX
>>>>>
>>>>> I was able to compile 13.7 (13.7.152.8) on ubuntu 24.04 and link the 
>>>>> hello world example to the v8 static libs however I noticed the 
>>>>> hello_world 
>>>>> executable (which did run successfully) was a whopping 3.3 GB?
>>>>>
>>>>> Trying to build 13.8 (13.8.258.2) using the same config fails to build 
>>>>> successfully:
>>>>> FAILED: mksnapshot
>>>>> "python3" "../../build/toolchain/gcc_link_wrapper.py" 
>>>>> --output="./mksnapshot" -- g++ -pie -Wl,--fatal-warnings -Wl,--build-id 
>>>>> -fPIC -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -m64 -Wl,-z,defs 
>>>>> -Wl,--as-needed --sysroot=../../build/linux/debian_bullseye_amd64-sysroot 
>>>>> -rdynamic -pie -Wl,--disable-new-dtags -Wl,--gc-sections -o 
>>>>> "./mksnapshot" 
>>>>> -Wl,--start-group @"./mksnapshot.rsp" -Wl,--end-group   -latomic -ldl 
>>>>> -lpthread -lrt -Wl,--start-group 
>>>>> <<<truncated for brevity>>>
>>>>> /usr/bin/ld: 
>>>>> obj/build/rust/allocator/libbuild_srust_sallocator_callocator.rlib(libbuild_srust_sallocator_callocator.build_srust_sallocator_callocator.ff715ce24295f21e-cgu.0.rcgu.o):
>>>>>  
>>>>> in function `__rustc::__rust_alloc_error_handler':
>>>>> ./../../build/rust/allocator/lib.rs:106:(.text._RNvCsiiodXzYB6cW_7___rustc26___rust_alloc_error_handler+0x10):
>>>>>  
>>>>> undefined reference to 
>>>>> `rust_allocator_internal::alloc_error_handler_impl()'
>>>>> collect2: error: ld returned 1 exit status
>>>>> ninja: build stopped: subcommand failed.
>>>>>
>>>>> Currently some of the gn config args used that enables v8 (v13.7) to 
>>>>> build and link the example successfully are doc'd as deprecated:
>>>>> use_custom_libcxx = false
>>>>> is_clang = false
>>>>>
>>>>> I've read other posts that mention clang is the only compiler 
>>>>> supported moving forward which furthers my belief I'm using an incorrect 
>>>>> build configuration.
>>>>>
>>>>> My question is what is the correct gn config one should use to build 
>>>>> the latest (13.8) v8 code and be able to link the hello world example 
>>>>> successfully?
>>>>>
>>>>> Thanks in advance for any suggestions/guidance!
>>>>>
>>>>> --
>>>>>
>>>> -- 
>>> -- 
>>> v8-dev mailing list
>>> v8-...@googlegroups.com
>>> http://groups.google.com/group/v8-dev
>>> --- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "v8-dev" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to v8-dev+un...@googlegroups.com.
>>> To view this discussion visit 
>>> https://groups.google.com/d/msgid/v8-dev/c81e2a4a-41f6-4425-9a2e-d90fbab36c81n%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/v8-dev/c81e2a4a-41f6-4425-9a2e-d90fbab36c81n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>

-- 
-- 
v8-dev mailing list
v8-dev@googlegroups.com
http://groups.google.com/group/v8-dev
--- 
You received this message because you are subscribed to the Google Groups 
"v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-dev+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/v8-dev/7d587c64-5ead-4616-8e4a-2a19cbdac999n%40googlegroups.com.

Reply via email to