blob: db4ea11b4a4f1b399d5dbb05ea04d02327f82610 [file] [log] [blame]
Hans Wennborgccebc7e2019-02-07 12:39:35 +00001Missing Key Function
2====================
Rui Ueyamaafe96732018-12-21 19:28:49 +00003
4If your build failed with a linker error something like this::
5
6 foo.cc:28: error: undefined reference to 'vtable for C'
Rui Ueyama5945ad52019-02-23 00:24:18 +00007 the vtable symbol may be undefined because the class is missing its key function
8 (see https://lld.llvm.org/missingkeyfunction)
Rui Ueyamaafe96732018-12-21 19:28:49 +00009
Fangrui Songf8748712018-12-21 22:40:10 +000010it's likely that your class C has a key function (defined by the ABI as the first
Rui Ueyama81c08802019-02-22 23:59:51 +000011non-pure, non-inline, virtual function), but you haven't actually defined it.
Rui Ueyamaafe96732018-12-21 19:28:49 +000012
Fangrui Songf8748712018-12-21 22:40:10 +000013When a class has a key function, the compiler emits the vtable (and some other
14things as well) only in the translation unit that defines that key function. Thus,
15if you're missing the key function, you'll also be missing the vtable. If no other
Rui Ueyama81c08802019-02-22 23:59:51 +000016function calls your missing function, you won't see any undefined reference errors
Rui Ueyamaafe96732018-12-21 19:28:49 +000017for it, but you will see undefined references to the vtable symbol.
18
Rui Ueyama81c08802019-02-22 23:59:51 +000019When a class has no non-pure, non-inline, virtual functions, there is no key
20function, and the compiler is forced to emit the vtable in every translation unit
Rui Ueyamaafe96732018-12-21 19:28:49 +000021that references the class. In this case, it is emitted in a COMDAT section,
22which allows the linker to eliminate all duplicate copies. This is still
23wasteful in terms of object file size and link time, so it's always advisable to
Rui Ueyama81c08802019-02-22 23:59:51 +000024ensure there is at least one eligible function that can serve as the key function.
Rui Ueyamaafe96732018-12-21 19:28:49 +000025
26Here are the most common mistakes that lead to this error:
27
28Failing to define a virtual destructor
29--------------------------------------
30
31Say you have a base class declared in a header file::
32
33 class B {
34 public:
35 B();
36 virtual ~B();
37 ...
38 };
39
Rui Ueyama81c08802019-02-22 23:59:51 +000040Here, ``~B`` is the first non-pure, non-inline, virtual function, so it is the key
41function. If you forget to define ``B::~B`` in your source file, the compiler will
Rui Ueyamaafe96732018-12-21 19:28:49 +000042not emit the vtable for ``B``, and you'll get an undefined reference to "vtable
43for B".
44
45This is just an example of the more general mistake of forgetting to define the
Fangrui Songf8748712018-12-21 22:40:10 +000046key function, but it's quite common because virtual destructors are likely to be
47the first eligible key function and it's easy to forget to implement them. It's
Rui Ueyamaafe96732018-12-21 19:28:49 +000048also more likely that you won't have any direct references to the destructor, so
49you won't see any undefined reference errors that point directly to the problem.
50
Rui Ueyama81c08802019-02-22 23:59:51 +000051The solution in this case is to implement the missing function.
Rui Ueyamaafe96732018-12-21 19:28:49 +000052
Rui Ueyama81c08802019-02-22 23:59:51 +000053Forgetting to declare a virtual function in an abstract class as pure
Hans Wennborg136a6a62019-04-11 07:31:03 +000054---------------------------------------------------------------------
Rui Ueyamaafe96732018-12-21 19:28:49 +000055
56Say you have an abstract base class declared in a header file::
57
58 class A {
59 public:
60 A();
61 virtual ~A() {}
62 virtual int foo() = 0;
63 ...
64 virtual int bar();
65 ...
66 };
67
68This base class is intended to be abstract, but you forgot to mark one of the
Rui Ueyama81c08802019-02-22 23:59:51 +000069functions pure. Here, ``A::bar``, being non-pure, is nominated as the key function,
Rui Ueyamaafe96732018-12-21 19:28:49 +000070and as a result, the vtable for ``A`` is not emitted, because the compiler is
71waiting for a translation unit that defines ``A::bar``.
72
73The solution in this case is to add the missing ``= 0`` to the declaration of
74``A::bar``.
75
Rui Ueyama81c08802019-02-22 23:59:51 +000076Key function is defined, but the linker doesn't see it
Hans Wennborg136a6a62019-04-11 07:31:03 +000077------------------------------------------------------
Rui Ueyamaafe96732018-12-21 19:28:49 +000078
Fangrui Songf8748712018-12-21 22:40:10 +000079It's also possible that you have defined the key function somewhere, but the
Rui Ueyama81c08802019-02-22 23:59:51 +000080object file containing the definition of that function isn't being linked into
Rui Ueyamaafe96732018-12-21 19:28:49 +000081your application.
82
83The solution in this case is to check your dependencies to make sure that
Fangrui Songf8748712018-12-21 22:40:10 +000084the object file or the library file containing the key function is given to
Rui Ueyamaafe96732018-12-21 19:28:49 +000085the linker.