capnproto: build position independent code

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>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
This commit is contained in:
Joel Winarske
2026-09-03 13:23:12 -07:00
committed by Khem Raj
parent 9c6364ff7a
commit f403e76619
@@ -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}"