@@ -19,8 +19,17 @@ CXXFLAGS:append:mips = " -latomic"
CXXFLAGS:append:powerpc = " -latomic"
CXXFLAGS:append:riscv32 = " -latomic"
+# The build produces static archives only. Compile them position independent so
+# they can be linked into shared libraries; without this any consumer that does
+# so fails on the thread-local in kj/exception.c++, which non-PIC code compiles
+# to the local-exec TLS model:
+#
+# libkj.a(exception.c++.o): relocation R_X86_64_TPOFF32 against
+# `kj::(anonymous namespace)::threadLocalCallback' can not be used when making
+# a shared object; local-exec is incompatible with -shared
EXTRA_OECMAKE += "\
-DBUILD_TESTING=OFF \
+ -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
"
FILES:${PN}-compiler = "${bindir}"
The recipe produces static archives only, and does not compile them PIC, so linking capnp or kj into a shared library fails: libkj.a(exception.c++.o): relocation R_X86_64_TPOFF32 against `kj::(anonymous namespace)::threadLocalCallback' can not be used when making a shared object; local-exec is incompatible with -shared kj/exception.c++ has a file-scope thread_local, which non-PIC code compiles to the local-exec TLS model. A shared object cannot use that model, so the link fails on any consumer that puts capnp inside a .so. Debian and Fedora do not hit this because they ship shared libcapnp. Set CMAKE_POSITION_INDEPENDENT_CODE. Packaging is unchanged: still static, still no .so, no new packages and no ABI surface, only the code model differs. Signed-off-by: Joel Winarske <joel.winarske@gmail.com> --- meta-oe/recipes-devtools/capnproto/capnproto_1.5.0.bb | 9 +++++++++ 1 file changed, 9 insertions(+)