On Wed, 20 Oct 2021 08:11:34 GMT, Stefan Karlsson <stef...@openjdk.org> wrote:
> We encountered the following linking error when trying to build Generational > ZGC on Windows: > > jvm.exp : error LNK2001: unresolved external symbol "const > ZBasicOopIterateClosure<class <lambda_9767402e468f9fc654281195f9700e48> > >::`vftable'" > (??_7?$ZBasicOopIterateClosure@V<lambda_9767402e468f9fc654281195f9700e48>@@@@6B@) > > > I narrowed this down to a simple reproducer, which doesn't link when built > through the HotSpot build system: > > #include <functional> > std::function<void()> = [](){}; > > > I found that we have a line in our make files that filters out symbols that > contain the string vftable (though it checks the mangled name, so a bit hard > to find): > > else ifeq ($(call isTargetOs, windows), true) > DUMP_SYMBOLS_CMD := $(DUMPBIN) -symbols *.obj > FILTER_SYMBOLS_AWK_SCRIPT := \ > '{ \ > if ($$7 ~ /??_7.*@@6B@/ && $$7 !~ /type_info/) print $$7; \ > }' > > > The following line prints the vftable symbol if it doesn't contain the string > 'type_info': > if ($$7 ~ /??_7.*@@6B@/ && $$7 !~ /type_info/) print $$7; > > The printed values are added to a list of symbols that get filtered out of > the mapfile, which is then passed to the linker. > > I can get the code to link if I add a second exception for vftable symbols > containing the string 'lambda': > if ($$7 ~ /??_7.*@@6B@/ && $$7 !~ /type_info/ && $$7 !~ /lambda/) print $$7; > > I did an additional experiment where I completely removed this filtering of > vftable symbols. When I did that the linker complained that we used more than > 64K symbols. Looks good to me. make/hotspot/lib/JvmMapfile.gmk line 109: > 107: # > 108: # Some usages of C++ lambdas require the vftable symbol of classes > that use > 109: # the lambda type as a template parameter. The usage of those classes > wont Suggestion: # the lambda type as a template parameter. The usage of those classes won't ------------- Marked as reviewed by ihse (Reviewer). PR: https://git.openjdk.java.net/jdk/pull/6030