[Pkg-protobuf-devel] Bug#835290: protobuf: FTBFS on s390x: undefined reference to `google::protobuf::internal::NoBarrier_AtomicIncrement(long volatile*, long)'
Aurelien Jarno
aurel32 at debian.org
Wed Aug 24 09:28:23 UTC 2016
Source: protobuf
Version: 3.0.0-3
Severity: serious
Tags: patch upstream
[I have added a Cc: to the debian-s390 list as it appears we have
multiple copies of this code in the archive, so the patch might be
useful in other packages.]
Dear Maintainer,
The new version of protobuf fails to build on s390x with the following
error:
| /bin/bash ../libtool --tag=CXX --mode=link g++ -pthread -DHAVE_PTHREAD=1 -DHAVE_ZLIB=1 -Wall -Wno-sign-compare -g -O2 -fdebug-prefix-map=/«PKGBUILDDIR»=. -fstack-protector-strong -Wformat -Werror=format-security -pthread -Wl,-z,relro -o protoc google/protobuf/compiler/main.o -lpthread libprotobuf.la libprotoc.la -lz
| libtool: link: g++ -pthread -DHAVE_PTHREAD=1 -DHAVE_ZLIB=1 -Wall -Wno-sign-compare -g -O2 -fdebug-prefix-map=/«PKGBUILDDIR»=. -fstack-protector-strong -Wformat -Werror=format-security -pthread -Wl,-z -Wl,relro -o .libs/protoc google/protobuf/compiler/main.o -lpthread ./.libs/libprotobuf.so ./.libs/libprotoc.so -lz -pthread
| ./.libs/libprotobuf.so: undefined reference to `google::protobuf::internal::NoBarrier_AtomicIncrement(long volatile*, long)'
| ./.libs/libprotobuf.so: undefined reference to `google::protobuf::internal::NoBarrier_Store(long volatile*, long)'
| ./.libs/libprotobuf.so: undefined reference to `google::protobuf::internal::NoBarrier_AtomicExchange(long volatile*, long)'
| ./.libs/libprotobuf.so: undefined reference to `google::protobuf::internal::NoBarrier_Load(long const volatile*)'
| collect2: error: ld returned 1 exit status
| Makefile:3389: recipe for target 'protoc' failed
| make[4]: *** [protoc] Error 1
| make[4]: Leaving directory '/«PKGBUILDDIR»/src'
| Makefile:1259: recipe for target 'all-recursive' failed
Here is the full build log:
https://buildd.debian.org/status/fetch.php?pkg=protobuf&arch=s390x&ver=3.0.0-3&stamp=1472017457
s390x uses the generic atomics based on GCC atomics builtins, and some
of 64-bit atomics functions haven't been implemented yet. The patch
below fixes the problem. With it protobuf builds on s390x and the
testsuite passes successfully.
Thanks for considering,
Aurelien
--- protobuf-3.0.0.orig/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h
+++ protobuf-3.0.0/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h
@@ -128,6 +128,45 @@ inline Atomic64 NoBarrier_CompareAndSwap
return old_value;
}
+inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
+ Atomic64 new_value) {
+ return __atomic_exchange_n(ptr, new_value, __ATOMIC_RELAXED);
+}
+
+inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
+ Atomic64 increment) {
+ return __atomic_add_fetch(ptr, increment, __ATOMIC_RELAXED);
+}
+
+inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
+ Atomic64 increment) {
+ return __atomic_add_fetch(ptr, increment, __ATOMIC_SEQ_CST);
+}
+
+inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
+ Atomic64 old_value,
+ Atomic64 new_value) {
+ __atomic_compare_exchange_n(ptr, &old_value, new_value, true,
+ __ATOMIC_RELEASE, __ATOMIC_ACQUIRE);
+ return old_value;
+}
+
+inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) {
+ __atomic_store_n(ptr, value, __ATOMIC_RELAXED);
+}
+
+inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
+ __atomic_store_n(ptr, value, __ATOMIC_SEQ_CST);
+}
+
+inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) {
+ return __atomic_load_n(ptr, __ATOMIC_RELAXED);
+}
+
+inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
+ return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
+}
+
#endif // defined(__LP64__)
} // namespace internal
-- System Information:
Debian Release: stretch/sid
APT prefers testing
APT policy: (990, 'testing'), (500, 'unstable')
Architecture: s390x
Kernel: Linux 4.6.0-1-s390x (SMP w/1 CPU core)
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
More information about the Pkg-protobuf-devel
mailing list