diff mbox series

[meta-oe] capnproto: build position independent code

Message ID 20260902165108.1200976-1-joel.winarske@gmail.com
State Accepted
Headers show
Series [meta-oe] capnproto: build position independent code | expand

Commit Message

Joel Winarske Sept. 2, 2026, 4:51 p.m. UTC
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(+)
diff mbox series

Patch

diff --git a/meta-oe/recipes-devtools/capnproto/capnproto_1.5.0.bb b/meta-oe/recipes-devtools/capnproto/capnproto_1.5.0.bb
index b867c72e36..9909afb0e9 100644
--- a/meta-oe/recipes-devtools/capnproto/capnproto_1.5.0.bb
+++ b/meta-oe/recipes-devtools/capnproto/capnproto_1.5.0.bb
@@ -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}"