summaryrefslogtreecommitdiff
path: root/debian
diff options
context:
space:
mode:
Diffstat (limited to 'debian')
-rw-r--r--debian/README.Debian9
-rw-r--r--debian/changelog163
-rw-r--r--debian/control59
-rw-r--r--debian/copyright31
-rw-r--r--debian/gbp.conf16
-rw-r--r--debian/libabsl-dev.install19
-rw-r--r--debian/libabsl-dev.lintian-overrides18
-rw-r--r--debian/libabsl20230125.install15
-rw-r--r--debian/libabsl20230125.lintian-overrides45
-rw-r--r--debian/libabsl20230125.shlibs96
-rw-r--r--debian/patches/configure.diff82
-rw-r--r--debian/patches/cordz-info-statistics-test.diff11
-rw-r--r--debian/patches/cpu-features.diff55
-rw-r--r--debian/patches/empty-flags-library.diff19
-rw-r--r--debian/patches/latomic.diff20
-rw-r--r--debian/patches/pkg-config-directives.diff21
-rw-r--r--debian/patches/series8
-rw-r--r--debian/patches/split-hash-tests.diff677
-rw-r--r--debian/patches/symbolize-ppc64.diff118
-rwxr-xr-xdebian/rules60
-rw-r--r--debian/source/format1
-rwxr-xr-xdebian/tests/bug101129424
-rwxr-xr-xdebian/tests/cmake45
-rw-r--r--debian/tests/control25
-rwxr-xr-xdebian/tests/smoke37
-rwxr-xr-xdebian/tests/upstream140728
-rw-r--r--debian/watch18
27 files changed, 1720 insertions, 0 deletions
diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644
index 00000000..7c0dd3c0
--- /dev/null
+++ b/debian/README.Debian
@@ -0,0 +1,9 @@
+Abseil for Debian
+-----------------
+
+libabsl-dev installs a number of files to 'internal' directories. In general,
+your project should not directly include any files from these directories; they
+may change without warning. If you think you need something from one of those
+files, please report a bug with reportbug(1).
+
+ -- Benjamin Barenblat <bbaren@debian.org> Thu, 07 May 2020 11:35:28 -0400
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 00000000..0b5309ae
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,163 @@
+abseil (20230125.3-2) experimental; urgency=medium
+
+ * Reenable unit tests, which were accidentally disabled in the previous
+ version.
+ * Backport an upstream patch to allow building tests on mipsel.
+ * Backport a patch from upstream to correct symbolization on ppc64, and
+ enable unit tests on that platform.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Wed, 02 Aug 2023 14:06:31 -0400
+
+abseil (20230125.3-1) experimental; urgency=medium
+
+ * New upstream release. (Closes: #1033466, #1034908)
+ * Run tests serially on riscv64 to avoid hitting Debian build hardware
+ limits. (Closes: #1025221)
+
+ -- Benjamin Barenblat <bbaren@debian.org> Sun, 14 May 2023 19:12:11 -0400
+
+abseil (20220623.1-1) unstable; urgency=medium
+
+ * New upstream release.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Tue, 18 Oct 2022 10:02:49 -0400
+
+abseil (0~20220623.0-2) unstable; urgency=medium
+
+ * Backport an upstream patch to correct pkg-config file generation.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Tue, 30 Aug 2022 22:54:45 -0400
+
+abseil (0~20220623.0-1) unstable; urgency=medium
+
+ * New upstream release. (Closes: #1008730, #1012194)
+
+ -- Benjamin Barenblat <bbaren@debian.org> Mon, 22 Aug 2022 22:17:36 -0400
+
+abseil (0~20210324.2-4) unstable; urgency=medium
+
+ * Fix "spurious -Wl flag in some pkg-config entries" by backporting a
+ patch from upstream that corrects CMake pkg-config generation.
+ (Closes: #1011294)
+
+ -- Benjamin Barenblat <bbaren@debian.org> Fri, 27 May 2022 16:58:38 -0400
+
+abseil (0~20210324.2-3) unstable; urgency=medium
+
+ * Backport an upstream patch to disable a problematic unit test.
+ (Closes: #1007136)
+ * Reenable unit tests on hppa.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Thu, 14 Apr 2022 13:20:16 -0400
+
+abseil (0~20210324.2-2) unstable; urgency=medium
+
+ * Disable a test that doesn’t play well with multiarch on armel and
+ armhf.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Mon, 07 Feb 2022 11:54:21 -0500
+
+abseil (0~20210324.2-1) experimental; urgency=medium
+
+ * New upstream release.
+ * Stop installing libabsl_flags.so and libabsl_flags.a, since they are
+ empty on every platform that Debian supports.
+ * Correct debian/watch search URLs to avoid picking up rc versions.
+ * Mangle upstream version in debian/watch to match manual mangling in
+ debian/changelog.
+ * Stop forcing -Wl,--no-as-needed on dependents. (Closes: #1001596)
+ * Compute Thumb function bounds correctly. (Closes: #987314)
+ * Reenable unit tests on most architectures.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Fri, 04 Feb 2022 13:11:32 -0500
+
+abseil (0~20200923.3-3) unstable; urgency=medium
+
+ * Fix "ftbfs with -march=x86-64-v3" by correcting the relevant unit
+ tests. (Closes: #983936)
+ * Disable double-double unit tests due to compiler bugs.
+ * Reenable unit tests on ppc64el.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Fri, 05 Mar 2021 15:57:38 -0500
+
+abseil (0~20200923.3-2) unstable; urgency=medium
+
+ * Correct string formatting on POWER.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Tue, 09 Feb 2021 14:41:06 -0500
+
+abseil (0~20200923.3-1) unstable; urgency=medium
+
+ * New upstream release.
+ * Correct endianness issues in hash functions and RNG.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Mon, 08 Feb 2021 15:04:52 -0500
+
+abseil (0~20200923.2-3) unstable; urgency=medium
+
+ * Fix some issues in unit tests.
+ * Re-disable unit tests on most platforms until they’re working
+ everywhere.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Sun, 31 Jan 2021 15:13:51 -0500
+
+abseil (0~20200923.2-2) unstable; urgency=medium
+
+ * Reenable unit tests.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Tue, 01 Dec 2020 12:37:56 -0500
+
+abseil (0~20200923.2-1) unstable; urgency=medium
+
+ * New upstream release.
+ * Fix build on hppa via patch. (Closes: #971768)
+ * Link libatomic where necessary to prevent issues with load-time
+ symbol resolution. (Closes: #973492)
+
+ -- Benjamin Barenblat <bbaren@debian.org> Fri, 06 Nov 2020 16:51:39 -0500
+
+abseil (0~20200923.1-1) unstable; urgency=medium
+
+ * New upstream release.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Mon, 12 Oct 2020 12:40:50 -0400
+
+abseil (0~20200923-2) unstable; urgency=medium
+
+ * Release for unstable.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Tue, 06 Oct 2020 10:00:02 -0400
+
+abseil (0~20200923-1) experimental; urgency=medium
+
+ * New upstream release.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Fri, 25 Sep 2020 17:57:31 -0400
+
+abseil (0~20200225.2-4) unstable; urgency=medium
+
+ * Fix "autopkgtest needs update for new version of cmake: warning on
+ stderr" by applying a patch from upstream. (Closes: #970333)
+
+ -- Benjamin Barenblat <bbaren@debian.org> Mon, 14 Sep 2020 17:40:05 -0400
+
+abseil (0~20200225.2-3) unstable; urgency=medium
+
+ * Replace symbols file with shlibs infrastructure. (Closes: #966183)
+
+ -- Benjamin Barenblat <bbaren@debian.org> Fri, 24 Jul 2020 09:42:03 -0400
+
+abseil (0~20200225.2-2) unstable; urgency=medium
+
+ * Rebuild for unstable.
+ * Rework symbols file using pkg-kde-tools for increased robustness.
+ * Avoid SSSE3 on amd64 and SSE2 on i386 for greater processor
+ compatibility.
+
+ -- Benjamin Barenblat <bbaren@debian.org> Thu, 23 Jul 2020 17:23:57 -0400
+
+abseil (0~20200225.2-1) experimental; urgency=medium
+
+ * Initial release. (Closes: #888705)
+
+ -- Benjamin Barenblat <bbaren@debian.org> Thu, 18 Jun 2020 16:27:49 -0400
diff --git a/debian/control b/debian/control
new file mode 100644
index 00000000..c7efcda4
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,59 @@
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+Source: abseil
+Priority: optional
+Maintainer: Benjamin Barenblat <bbaren@debian.org>
+Build-Depends:
+ cmake (>= 3.10),
+ debhelper-compat (= 12),
+ googletest (>= 1.12),
+Rules-Requires-Root: no
+Standards-Version: 4.6.2
+Section: libs
+Homepage: https://abseil.io/
+Vcs-Browser: https://salsa.debian.org/debian/abseil
+Vcs-Git: https://salsa.debian.org/debian/abseil.git
+Description: extensions to the C++ standard library
+ Abseil is an open-source collection of C++ library code designed to augment the
+ C++ standard library. The Abseil library code is collected from Google's C++
+ codebase and has been extensively tested and used in production. In some cases,
+ Abseil provides pieces missing from the C++ standard; in others, Abseil
+ provides alternatives to the standard for special needs.
+
+Package: libabsl-dev
+Architecture: any
+Multi-Arch: same
+Section: libdevel
+Depends:
+ libabsl20230125 (= ${binary:Version}),
+ ${misc:Depends},
+Recommends:
+ cmake (>= 3.0) | pkg-config,
+ g++ (>= 5.1),
+ libgmock-dev (>= 1.12),
+Description: ${source:Synopsis} (development files)
+ ${source:Extended-Description}
+ .
+ This package contains header files and other data necessary for developing with
+ Abseil.
+
+Package: libabsl20230125
+Architecture: any
+Multi-Arch: same
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: ${source:Synopsis}
+ ${source:Extended-Description}
+ .
+ This package contains Abseil's shared libraries.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 00000000..19a3388c
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,31 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: Abseil
+Upstream-Contact: abseil-io@googlegroups.com
+Source: https://github.com/abseil/abseil-cpp/
+Copyright: 2017 The Abseil Authors
+License: Apache-2.0
+
+Files: *
+Copyright:
+ 2000-2017 Google Inc.
+ 2017-2023 The Abseil Authors
+License: Apache-2.0
+
+Files: debian/*
+Copyright: 2020-2022 Google LLC
+License: Apache-2.0
+
+License: Apache-2.0
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+ this file except in compliance with the License. You may obtain a copy of the
+ License at
+ .
+ https://www.apache.org/licenses/LICENSE-2.0
+ .
+ Unless required by applicable law or agreed to in writing, software distributed
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations under the License.
+ .
+ On Debian systems, the complete text of the Apache License, Version 2.0, can be
+ found in "/usr/share/common-licenses/Apache-2.0".
diff --git a/debian/gbp.conf b/debian/gbp.conf
new file mode 100644
index 00000000..2c357e2c
--- /dev/null
+++ b/debian/gbp.conf
@@ -0,0 +1,16 @@
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+[DEFAULT]
+upstream-tag = 20230125.3
diff --git a/debian/libabsl-dev.install b/debian/libabsl-dev.install
new file mode 100644
index 00000000..9e2cb20e
--- /dev/null
+++ b/debian/libabsl-dev.install
@@ -0,0 +1,19 @@
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+usr/include/absl
+usr/lib/*/*.a
+usr/lib/*/*.so
+usr/lib/*/cmake
+usr/lib/*/pkgconfig/*.pc
diff --git a/debian/libabsl-dev.lintian-overrides b/debian/libabsl-dev.lintian-overrides
new file mode 100644
index 00000000..6765e8c9
--- /dev/null
+++ b/debian/libabsl-dev.lintian-overrides
@@ -0,0 +1,18 @@
+# Copyright 2022 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+libabsl-dev: no-code-sections [usr/lib/*/libabsl_log_entry.*]
+libabsl-dev: no-code-sections [usr/lib/*/libabsl_log_internal_nullguard.*]
+libabsl-dev: no-code-sections [usr/lib/*/libabsl_random_internal_platform.*]
+libabsl-dev: no-code-sections [usr/lib/*/libabsl_test_instance_tracker.*]
diff --git a/debian/libabsl20230125.install b/debian/libabsl20230125.install
new file mode 100644
index 00000000..ab3017e5
--- /dev/null
+++ b/debian/libabsl20230125.install
@@ -0,0 +1,15 @@
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+usr/lib/*/libabsl_*.so.*
diff --git a/debian/libabsl20230125.lintian-overrides b/debian/libabsl20230125.lintian-overrides
new file mode 100644
index 00000000..3ce73081
--- /dev/null
+++ b/debian/libabsl20230125.lintian-overrides
@@ -0,0 +1,45 @@
+# Copyright 2022 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+libabsl20230125: hardening-no-fortify-functions [usr/lib/*/libabsl_base.so*]
+libabsl20230125: hardening-no-fortify-functions [usr/lib/*/libabsl_debugging_internal.so*]
+libabsl20230125: hardening-no-fortify-functions [usr/lib/*/libabsl_random_internal_seed_material.so*]
+libabsl20230125: hardening-no-fortify-functions [usr/lib/*/libabsl_time_zone.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_bad_any_cast_impl.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_bad_optional_access.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_bad_variant_access.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_cordz_functions.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_cordz_sample_token.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_exponential_biased.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_flags_commandlineflag.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_flags_commandlineflag_internal.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_hash.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_log_initialize.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_log_internal_conditions.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_log_severity.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_log_sink.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_periodic_sampler.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_random_internal_randen.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_random_internal_randen_hwaes_impl.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_random_internal_randen_slow.so*]
+libabsl20230125: library-not-linked-against-libc [usr/lib/*/libabsl_random_seed_gen_exception.so*]
+libabsl20230125: no-symbols-control-file usr/lib/*/libabsl_*
+libabsl20230125: package-name-doesnt-match-sonames libabsl-*
+libabsl20230125: shared-library-lacks-prerequisites [usr/lib/*/libabsl_city.so*]
+libabsl20230125: shared-library-lacks-prerequisites [usr/lib/*/libabsl_leak_check.so*]
+libabsl20230125: shared-library-lacks-prerequisites [usr/lib/*/libabsl_log_entry.so*]
+libabsl20230125: shared-library-lacks-prerequisites [usr/lib/*/libabsl_log_internal_nullguard.so*]
+libabsl20230125: shared-library-lacks-prerequisites [usr/lib/*/libabsl_low_level_hash.so*]
+libabsl20230125: shared-library-lacks-prerequisites [usr/lib/*/libabsl_random_internal_platform.so*]
+libabsl20230125: shared-library-lacks-prerequisites [usr/lib/*/libabsl_random_internal_randen_hwaes.so*]
diff --git a/debian/libabsl20230125.shlibs b/debian/libabsl20230125.shlibs
new file mode 100644
index 00000000..2997d79a
--- /dev/null
+++ b/debian/libabsl20230125.shlibs
@@ -0,0 +1,96 @@
+# Copyright 2022 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+#
+libabsl_bad_any_cast_impl 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_bad_optional_access 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_bad_variant_access 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_base 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_city 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_civil_time 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_cord 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_cord_internal 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_cordz_functions 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_cordz_handle 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_cordz_info 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_cordz_sample_token 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_crc32c 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_crc_cord_state 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_crc_cpu_detect 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_crc_internal 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_debugging_internal 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_demangle_internal 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_die_if_null 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_examine_stack 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_exponential_biased 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_failure_signal_handler 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_flags_commandlineflag 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_flags_commandlineflag_internal 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_flags_config 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_flags_internal 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_flags_marshalling 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_flags_parse 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_flags_private_handle_accessor 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_flags_program_name 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_flags_reflection 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_flags_usage 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_flags_usage_internal 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_graphcycles_internal 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_hash 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_hashtablez_sampler 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_int128 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_leak_check 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_log_entry 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_log_flags 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_log_globals 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_log_initialize 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_log_internal_check_op 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_log_internal_conditions 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_log_internal_format 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_log_internal_globals 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_log_internal_log_sink_set 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_log_internal_message 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_log_internal_nullguard 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_log_internal_proto 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_log_severity 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_log_sink 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_low_level_hash 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_malloc_internal 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_periodic_sampler 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_random_distributions 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_random_internal_distribution_test_util 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_random_internal_platform 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_random_internal_pool_urbg 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_random_internal_randen 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_random_internal_randen_hwaes 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_random_internal_randen_hwaes_impl 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_random_internal_randen_slow 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_random_internal_seed_material 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_random_seed_gen_exception 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_random_seed_sequences 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_raw_hash_set 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_raw_logging_internal 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_scoped_set_env 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_spinlock_wait 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_stacktrace 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_status 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_statusor 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_str_format_internal 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_strerror 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_strings 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_strings_internal 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_symbolize 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_synchronization 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_throw_delegate 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_time 20230125 libabsl20230125 (>= 20230125.0-1)
+libabsl_time_zone 20230125 libabsl20230125 (>= 20230125.0-1)
diff --git a/debian/patches/configure.diff b/debian/patches/configure.diff
new file mode 100644
index 00000000..9d1fe736
--- /dev/null
+++ b/debian/patches/configure.diff
@@ -0,0 +1,82 @@
+From: Benjamin Barenblat <bbaren@google.com>
+Subject: Set package configuration options
+Forwarded: not-needed
+
+Configure Abseil for Debian.
+
+ - Set the SONAME appropriately.
+
+ - To minimize the possibility of future ABI breakage, treat absl::any,
+ absl::optional, absl::string_view, and absl::variant as their own types
+ (rather than aliases for the std:: versions), and compile everything in an
+ inline namespace.
+
+ - Enable upstream's hardened build mode.
+
+--- a/CMake/AbseilHelpers.cmake
++++ b/CMake/AbseilHelpers.cmake
+@@ -309,7 +309,8 @@
+ if(ABSL_ENABLE_INSTALL)
+ set_target_properties(${_NAME} PROPERTIES
+ OUTPUT_NAME "absl_${_NAME}"
+- SOVERSION "2301.0.0"
++ SOVERSION 20230125
++ VERSION "20230125.0.0"
+ )
+ endif()
+ else()
+--- a/absl/base/options.h
++++ b/absl/base/options.h
+@@ -94,7 +94,7 @@
+ // User code should not inspect this macro. To check in the preprocessor if
+ // absl::any is a typedef of std::any, use the feature macro ABSL_USES_STD_ANY.
+
+-#define ABSL_OPTION_USE_STD_ANY 2
++#define ABSL_OPTION_USE_STD_ANY 0
+
+
+ // ABSL_OPTION_USE_STD_OPTIONAL
+@@ -121,7 +121,7 @@
+ // absl::optional is a typedef of std::optional, use the feature macro
+ // ABSL_USES_STD_OPTIONAL.
+
+-#define ABSL_OPTION_USE_STD_OPTIONAL 2
++#define ABSL_OPTION_USE_STD_OPTIONAL 0
+
+
+ // ABSL_OPTION_USE_STD_STRING_VIEW
+@@ -148,7 +148,7 @@
+ // absl::string_view is a typedef of std::string_view, use the feature macro
+ // ABSL_USES_STD_STRING_VIEW.
+
+-#define ABSL_OPTION_USE_STD_STRING_VIEW 2
++#define ABSL_OPTION_USE_STD_STRING_VIEW 0
+
+ // ABSL_OPTION_USE_STD_VARIANT
+ //
+@@ -174,7 +174,7 @@
+ // absl::variant is a typedef of std::variant, use the feature macro
+ // ABSL_USES_STD_VARIANT.
+
+-#define ABSL_OPTION_USE_STD_VARIANT 2
++#define ABSL_OPTION_USE_STD_VARIANT 0
+
+
+ // ABSL_OPTION_USE_INLINE_NAMESPACE
+@@ -200,7 +200,7 @@
+ // allowed.
+
+ #define ABSL_OPTION_USE_INLINE_NAMESPACE 1
+-#define ABSL_OPTION_INLINE_NAMESPACE_NAME lts_20230125
++#define ABSL_OPTION_INLINE_NAMESPACE_NAME debian4
+
+ // ABSL_OPTION_HARDENED
+ //
+@@ -227,6 +227,6 @@
+ // checks enabled by this option may abort the program in a different way and
+ // log additional information when `NDEBUG` is not defined.
+
+-#define ABSL_OPTION_HARDENED 0
++#define ABSL_OPTION_HARDENED 1
+
+ #endif // ABSL_BASE_OPTIONS_H_
diff --git a/debian/patches/cordz-info-statistics-test.diff b/debian/patches/cordz-info-statistics-test.diff
new file mode 100644
index 00000000..646133a1
--- /dev/null
+++ b/debian/patches/cordz-info-statistics-test.diff
@@ -0,0 +1,11 @@
+--- a/absl/strings/internal/cordz_info_statistics_test.cc
++++ b/absl/strings/internal/cordz_info_statistics_test.cc
+@@ -468,6 +468,8 @@
+ }
+
+ TEST(CordzInfoStatisticsTest, ThreadSafety) {
++ GTEST_SKIP() << "Skipping test; see https://bugs.debian.org/1018804";
++
+ Notification stop;
+ static constexpr int kNumThreads = 8;
+ int64_t sampled_node_count = 0;
diff --git a/debian/patches/cpu-features.diff b/debian/patches/cpu-features.diff
new file mode 100644
index 00000000..2f462e39
--- /dev/null
+++ b/debian/patches/cpu-features.diff
@@ -0,0 +1,55 @@
+From: Benjamin Barenblat <bbaren@google.com>
+Subject: Canonicalize supported CPU feature set
+Forwarded: not-needed
+
+Explicitly set supported CPU features.
+
+ - Disable Intel SSE and SSE2 on i386, since Debian supports some i386
+ processors without those extensions. Keep them enabled on amd64, since all
+ amd64 processors have them.
+
+ - Disable Intel SSSE3 entirely, since no i386 processor supports it and Debian
+ supports amd64 processors without it.
+
+ - Disable NEON on armel and armhf, since no armel processor supports NEON and
+ Debian supports some armhf processors without it. Keep it enabled on arm64,
+ since all arm64 processors have it.
+
+--- a/absl/base/config.h
++++ b/absl/base/config.h
+@@ -887,7 +887,7 @@
+ // which architectures support the various x86 instruction sets.
+ #ifdef ABSL_INTERNAL_HAVE_SSE
+ #error ABSL_INTERNAL_HAVE_SSE cannot be directly set
+-#elif defined(__SSE__)
++#elif defined(__x86_64__)
+ #define ABSL_INTERNAL_HAVE_SSE 1
+ #elif defined(_M_X64) || (defined(_M_IX86_FP) && _M_IX86_FP >= 1)
+ // MSVC only defines _M_IX86_FP for x86 32-bit code, and _M_IX86_FP >= 1
+@@ -902,7 +902,7 @@
+ // which architectures support the various x86 instruction sets.
+ #ifdef ABSL_INTERNAL_HAVE_SSE2
+ #error ABSL_INTERNAL_HAVE_SSE2 cannot be directly set
+-#elif defined(__SSE2__)
++#elif defined(__x86_64__)
+ #define ABSL_INTERNAL_HAVE_SSE2 1
+ #elif defined(_M_X64) || (defined(_M_IX86_FP) && _M_IX86_FP >= 2)
+ // MSVC only defines _M_IX86_FP for x86 32-bit code, and _M_IX86_FP >= 2
+@@ -923,8 +923,6 @@
+ // by the CPU.
+ #ifdef ABSL_INTERNAL_HAVE_SSSE3
+ #error ABSL_INTERNAL_HAVE_SSSE3 cannot be directly set
+-#elif defined(__SSSE3__)
+-#define ABSL_INTERNAL_HAVE_SSSE3 1
+ #endif
+
+ // ABSL_INTERNAL_HAVE_ARM_NEON is used for compile-time detection of NEON (ARM
+@@ -936,7 +934,7 @@
+ // https://llvm.org/docs/CompileCudaWithLLVM.html#detecting-clang-vs-nvcc-from-code
+ #ifdef ABSL_INTERNAL_HAVE_ARM_NEON
+ #error ABSL_INTERNAL_HAVE_ARM_NEON cannot be directly set
+-#elif defined(__ARM_NEON) && !defined(__CUDA_ARCH__)
++#elif defined(__aarch64__)
+ #define ABSL_INTERNAL_HAVE_ARM_NEON 1
+ #endif
+
diff --git a/debian/patches/empty-flags-library.diff b/debian/patches/empty-flags-library.diff
new file mode 100644
index 00000000..8c26a6d7
--- /dev/null
+++ b/debian/patches/empty-flags-library.diff
@@ -0,0 +1,19 @@
+From: Benjamin Barenblat <bbaren@google.com>
+Subject: Eliminate libabsl_flags.so and libabsl_flags.a
+Forwarded: not-needed
+
+The libabsl_flags library only contains code when compiling with MSVC, which
+Debian doesn't use. Skip compiling absl/flags/flag.cc, and make the Abseil flags
+library header-only.
+
+--- a/absl/flags/CMakeLists.txt
++++ b/absl/flags/CMakeLists.txt
+@@ -199,8 +199,6 @@
+ absl_cc_library(
+ NAME
+ flags
+- SRCS
+- "flag.cc"
+ HDRS
+ "declare.h"
+ "flag.h"
diff --git a/debian/patches/latomic.diff b/debian/patches/latomic.diff
new file mode 100644
index 00000000..92b4f30c
--- /dev/null
+++ b/debian/patches/latomic.diff
@@ -0,0 +1,20 @@
+From: Benjamin Barenblat <bbaren@google.com>
+Subject: Use libatomic if necessary
+Bug-Debian: https://bugs.debian.org/973492
+
+On some architectures, notably armel, Abseil needs symbols defined in
+libatomic. Abseil does not currently have a well-developed system to
+declare external library dependencies, so just have the linker determine
+if anything needs libatomic and add the DT_NEEDED entry where necessary.
+
+--- a/absl/copts/AbseilConfigureCopts.cmake
++++ b/absl/copts/AbseilConfigureCopts.cmake
+@@ -93,4 +93,8 @@
+ set(ABSL_TEST_COPTS "")
+ endif()
+
++list(APPEND ABSL_DEFAULT_LINKOPTS
++ "-Wl,--push-state,--as-needed" "-latomic" "-Wl,--pop-state"
++)
++
+ set(ABSL_CXX_STANDARD "${CMAKE_CXX_STANDARD}")
diff --git a/debian/patches/pkg-config-directives.diff b/debian/patches/pkg-config-directives.diff
new file mode 100644
index 00000000..726d6aec
--- /dev/null
+++ b/debian/patches/pkg-config-directives.diff
@@ -0,0 +1,21 @@
+From: Benjamin Barenblat <bbaren@google.com>
+Subject: Do not propagate -Wno-... flags into pkg-config files
+Forwarded: not-needed
+
+Lintian doesn't like any -W flags in pkg-config files, even if those flags
+disable warnings.
+
+--- a/CMake/AbseilHelpers.cmake
++++ b/CMake/AbseilHelpers.cmake
+@@ -187,10 +187,7 @@
+ endif()
+ endforeach()
+ foreach(cflag ${ABSL_CC_LIB_COPTS})
+- if(${cflag} MATCHES "^(-Wno|/wd)")
+- # These flags are needed to suppress warnings that might fire in our headers.
+- set(PC_CFLAGS "${PC_CFLAGS} ${cflag}")
+- elseif(${cflag} MATCHES "^(-W|/w[1234eo])")
++ if(${cflag} MATCHES "^(-W|/w[1234eo])")
+ # Don't impose our warnings on others.
+ elseif(${cflag} MATCHES "^-m")
+ # Don't impose CPU instruction requirements on others, as
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 00000000..000d6558
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,8 @@
+configure.diff
+cpu-features.diff
+latomic.diff
+empty-flags-library.diff
+cordz-info-statistics-test.diff
+pkg-config-directives.diff
+split-hash-tests.diff
+symbolize-ppc64.diff
diff --git a/debian/patches/split-hash-tests.diff b/debian/patches/split-hash-tests.diff
new file mode 100644
index 00000000..ae0d066f
--- /dev/null
+++ b/debian/patches/split-hash-tests.diff
@@ -0,0 +1,677 @@
+From: Benjamin Barenblat <bbaren@google.com>
+Subject: Split absl/hash/hash_test.cc into two files
+Origin: backport, https://github.com/abseil/abseil-cpp/commit/c154d20abce2f1ae6bd35bd774313e351493219b
+
+hash_test.cc leans heavily on INSTANTIATE_TYPED_TEST_SUITE_P, which is quite
+memory- and CPU-hungry. Split a few heavyweight tests into a new
+hash_instantiated_test.cc, reducing peak RAM consumption (or, on multicore
+systems, compilation time).
+
+--- a/absl/hash/BUILD.bazel
++++ b/absl/hash/BUILD.bazel
+@@ -68,13 +68,17 @@
+
+ cc_test(
+ name = "hash_test",
+- srcs = ["hash_test.cc"],
++ srcs = [
++ "hash_test.cc",
++ "internal/hash_test.h",
++ ],
+ copts = ABSL_TEST_COPTS,
+ linkopts = ABSL_DEFAULT_LINKOPTS,
+ deps = [
+ ":hash",
+ ":hash_testing",
+ ":spy_hash_state",
++ "//absl/base:config",
+ "//absl/base:core_headers",
+ "//absl/container:btree",
+ "//absl/container:flat_hash_map",
+@@ -87,6 +91,27 @@
+ "@com_google_googletest//:gtest_main",
+ ],
+ )
++
++cc_test(
++ name = "hash_instantiated_test",
++ srcs = [
++ "hash_instantiated_test.cc",
++ "internal/hash_test.h",
++ ],
++ copts = ABSL_TEST_COPTS,
++ linkopts = ABSL_DEFAULT_LINKOPTS,
++ deps = [
++ ":hash",
++ ":hash_testing",
++ "//absl/base:config",
++ "//absl/container:btree",
++ "//absl/container:flat_hash_map",
++ "//absl/container:flat_hash_set",
++ "//absl/container:node_hash_map",
++ "//absl/container:node_hash_set",
++ "@com_google_googletest//:gtest_main",
++ ],
++)
+
+ cc_binary(
+ name = "hash_benchmark",
+--- a/absl/hash/CMakeLists.txt
++++ b/absl/hash/CMakeLists.txt
+@@ -64,6 +64,7 @@
+ hash_test
+ SRCS
+ "hash_test.cc"
++ "internal/hash_test.h"
+ COPTS
+ ${ABSL_TEST_COPTS}
+ DEPS
+@@ -82,6 +83,26 @@
+ GTest::gmock_main
+ )
+
++absl_cc_test(
++ NAME
++ hash_instantiated_test
++ SRCS
++ "hash_test.cc"
++ "internal/hash_test.h"
++ COPTS
++ ${ABSL_TEST_COPTS}
++ DEPS
++ absl::hash
++ absl::hash_testing
++ absl::config
++ absl::btree
++ absl::flat_hash_map
++ absl::flat_hash_set
++ absl::node_hash_map
++ absl::node_hash_set
++ GTest::gtest_main
++)
++
+ # Internal-only target, do not depend on directly.
+ #
+ # Note: Even though external code should not depend on this target
+--- /dev/null
++++ b/absl/hash/hash_instantiated_test.cc
+@@ -0,0 +1,224 @@
++// Copyright 2018 The Abseil Authors.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// https://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++
++// This file contains a few select absl::Hash tests that, due to their reliance
++// on INSTANTIATE_TYPED_TEST_SUITE_P, require a large amount of memory to
++// compile. Put new tests in hash_test.cc, not this file.
++
++#include "absl/hash/hash.h"
++
++#include <stddef.h>
++
++#include <algorithm>
++#include <deque>
++#include <forward_list>
++#include <initializer_list>
++#include <list>
++#include <map>
++#include <set>
++#include <string>
++#include <type_traits>
++#include <unordered_map>
++#include <unordered_set>
++#include <utility>
++#include <vector>
++
++#include "gtest/gtest.h"
++#include "absl/container/btree_map.h"
++#include "absl/container/btree_set.h"
++#include "absl/container/flat_hash_map.h"
++#include "absl/container/flat_hash_set.h"
++#include "absl/container/node_hash_map.h"
++#include "absl/container/node_hash_set.h"
++#include "absl/hash/hash_testing.h"
++#include "absl/hash/internal/hash_test.h"
++
++namespace {
++
++using ::absl::hash_test_internal::is_hashable;
++using ::absl::hash_test_internal::TypeErasedContainer;
++
++// Dummy type with unordered equality and hashing semantics. This preserves
++// input order internally, and is used below to ensure we get test coverage
++// for equal sequences with different iteraton orders.
++template <typename T>
++class UnorderedSequence {
++ public:
++ UnorderedSequence() = default;
++ template <typename TT>
++ UnorderedSequence(std::initializer_list<TT> l)
++ : values_(l.begin(), l.end()) {}
++ template <typename ForwardIterator,
++ typename std::enable_if<!std::is_integral<ForwardIterator>::value,
++ bool>::type = true>
++ UnorderedSequence(ForwardIterator begin, ForwardIterator end)
++ : values_(begin, end) {}
++ // one-argument constructor of value type T, to appease older toolchains that
++ // get confused by one-element initializer lists in some contexts
++ explicit UnorderedSequence(const T& v) : values_(&v, &v + 1) {}
++
++ using value_type = T;
++
++ size_t size() const { return values_.size(); }
++ typename std::vector<T>::const_iterator begin() const {
++ return values_.begin();
++ }
++ typename std::vector<T>::const_iterator end() const { return values_.end(); }
++
++ friend bool operator==(const UnorderedSequence& lhs,
++ const UnorderedSequence& rhs) {
++ return lhs.size() == rhs.size() &&
++ std::is_permutation(lhs.begin(), lhs.end(), rhs.begin());
++ }
++ friend bool operator!=(const UnorderedSequence& lhs,
++ const UnorderedSequence& rhs) {
++ return !(lhs == rhs);
++ }
++ template <typename H>
++ friend H AbslHashValue(H h, const UnorderedSequence& u) {
++ return H::combine(H::combine_unordered(std::move(h), u.begin(), u.end()),
++ u.size());
++ }
++
++ private:
++ std::vector<T> values_;
++};
++
++template <typename T>
++class HashValueSequenceTest : public testing::Test {};
++TYPED_TEST_SUITE_P(HashValueSequenceTest);
++
++TYPED_TEST_P(HashValueSequenceTest, BasicUsage) {
++ EXPECT_TRUE((is_hashable<TypeParam>::value));
++
++ using IntType = typename TypeParam::value_type;
++ auto a = static_cast<IntType>(0);
++ auto b = static_cast<IntType>(23);
++ auto c = static_cast<IntType>(42);
++
++ std::vector<TypeParam> exemplars = {
++ TypeParam(), TypeParam(), TypeParam{a, b, c},
++ TypeParam{a, c, b}, TypeParam{c, a, b}, TypeParam{a},
++ TypeParam{a, a}, TypeParam{a, a, a}, TypeParam{a, a, b},
++ TypeParam{a, b, a}, TypeParam{b, a, a}, TypeParam{a, b},
++ TypeParam{b, c}};
++ EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(exemplars));
++}
++
++REGISTER_TYPED_TEST_SUITE_P(HashValueSequenceTest, BasicUsage);
++using IntSequenceTypes = testing::Types<
++ std::deque<int>, std::forward_list<int>, std::list<int>, std::vector<int>,
++ std::vector<bool>, TypeErasedContainer<std::vector<int>>, std::set<int>,
++ std::multiset<int>, UnorderedSequence<int>,
++ TypeErasedContainer<UnorderedSequence<int>>, std::unordered_set<int>,
++ std::unordered_multiset<int>, absl::flat_hash_set<int>,
++ absl::node_hash_set<int>, absl::btree_set<int>>;
++INSTANTIATE_TYPED_TEST_SUITE_P(My, HashValueSequenceTest, IntSequenceTypes);
++
++template <typename T>
++class HashValueNestedSequenceTest : public testing::Test {};
++TYPED_TEST_SUITE_P(HashValueNestedSequenceTest);
++
++TYPED_TEST_P(HashValueNestedSequenceTest, BasicUsage) {
++ using T = TypeParam;
++ using V = typename T::value_type;
++ std::vector<T> exemplars = {
++ // empty case
++ T{},
++ // sets of empty sets
++ T{V{}}, T{V{}, V{}}, T{V{}, V{}, V{}},
++ // multisets of different values
++ T{V{1}}, T{V{1, 1}, V{1, 1}}, T{V{1, 1, 1}, V{1, 1, 1}, V{1, 1, 1}},
++ // various orderings of same nested sets
++ T{V{}, V{1, 2}}, T{V{}, V{2, 1}}, T{V{1, 2}, V{}}, T{V{2, 1}, V{}},
++ // various orderings of various nested sets, case 2
++ T{V{1, 2}, V{3, 4}}, T{V{1, 2}, V{4, 3}}, T{V{1, 3}, V{2, 4}},
++ T{V{1, 3}, V{4, 2}}, T{V{1, 4}, V{2, 3}}, T{V{1, 4}, V{3, 2}},
++ T{V{2, 3}, V{1, 4}}, T{V{2, 3}, V{4, 1}}, T{V{2, 4}, V{1, 3}},
++ T{V{2, 4}, V{3, 1}}, T{V{3, 4}, V{1, 2}}, T{V{3, 4}, V{2, 1}}};
++ EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(exemplars));
++}
++
++REGISTER_TYPED_TEST_SUITE_P(HashValueNestedSequenceTest, BasicUsage);
++template <typename T>
++using TypeErasedSet = TypeErasedContainer<UnorderedSequence<T>>;
++
++using NestedIntSequenceTypes = testing::Types<
++ std::vector<std::vector<int>>, std::vector<UnorderedSequence<int>>,
++ std::vector<TypeErasedSet<int>>, UnorderedSequence<std::vector<int>>,
++ UnorderedSequence<UnorderedSequence<int>>,
++ UnorderedSequence<TypeErasedSet<int>>, TypeErasedSet<std::vector<int>>,
++ TypeErasedSet<UnorderedSequence<int>>, TypeErasedSet<TypeErasedSet<int>>>;
++INSTANTIATE_TYPED_TEST_SUITE_P(My, HashValueNestedSequenceTest,
++ NestedIntSequenceTypes);
++
++template <typename T>
++class HashValueAssociativeMapTest : public testing::Test {};
++TYPED_TEST_SUITE_P(HashValueAssociativeMapTest);
++
++TYPED_TEST_P(HashValueAssociativeMapTest, BasicUsage) {
++ using M = TypeParam;
++ using V = typename M::value_type;
++ std::vector<M> exemplars{M{},
++ M{V{0, "foo"}},
++ M{V{1, "foo"}},
++ M{V{0, "bar"}},
++ M{V{1, "bar"}},
++ M{V{0, "foo"}, V{42, "bar"}},
++ M{V{42, "bar"}, V{0, "foo"}},
++ M{V{1, "foo"}, V{42, "bar"}},
++ M{V{1, "foo"}, V{43, "bar"}},
++ M{V{1, "foo"}, V{43, "baz"}}};
++ EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(exemplars));
++}
++
++REGISTER_TYPED_TEST_SUITE_P(HashValueAssociativeMapTest, BasicUsage);
++using AssociativeMapTypes = testing::Types<
++ std::map<int, std::string>, std::unordered_map<int, std::string>,
++ absl::flat_hash_map<int, std::string>,
++ absl::node_hash_map<int, std::string>, absl::btree_map<int, std::string>,
++ UnorderedSequence<std::pair<const int, std::string>>>;
++INSTANTIATE_TYPED_TEST_SUITE_P(My, HashValueAssociativeMapTest,
++ AssociativeMapTypes);
++
++template <typename T>
++class HashValueAssociativeMultimapTest : public testing::Test {};
++TYPED_TEST_SUITE_P(HashValueAssociativeMultimapTest);
++
++TYPED_TEST_P(HashValueAssociativeMultimapTest, BasicUsage) {
++ using MM = TypeParam;
++ using V = typename MM::value_type;
++ std::vector<MM> exemplars{MM{},
++ MM{V{0, "foo"}},
++ MM{V{1, "foo"}},
++ MM{V{0, "bar"}},
++ MM{V{1, "bar"}},
++ MM{V{0, "foo"}, V{0, "bar"}},
++ MM{V{0, "bar"}, V{0, "foo"}},
++ MM{V{0, "foo"}, V{42, "bar"}},
++ MM{V{1, "foo"}, V{42, "bar"}},
++ MM{V{1, "foo"}, V{1, "foo"}, V{43, "bar"}},
++ MM{V{1, "foo"}, V{43, "bar"}, V{1, "foo"}},
++ MM{V{1, "foo"}, V{43, "baz"}}};
++ EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(exemplars));
++}
++
++REGISTER_TYPED_TEST_SUITE_P(HashValueAssociativeMultimapTest, BasicUsage);
++using AssociativeMultimapTypes =
++ testing::Types<std::multimap<int, std::string>,
++ std::unordered_multimap<int, std::string>>;
++INSTANTIATE_TYPED_TEST_SUITE_P(My, HashValueAssociativeMultimapTest,
++ AssociativeMultimapTypes);
++
++} // namespace
+--- a/absl/hash/hash_test.cc
++++ b/absl/hash/hash_test.cc
+@@ -47,6 +47,7 @@
+ #include "absl/container/node_hash_map.h"
+ #include "absl/container/node_hash_set.h"
+ #include "absl/hash/hash_testing.h"
++#include "absl/hash/internal/hash_test.h"
+ #include "absl/hash/internal/spy_hash_state.h"
+ #include "absl/meta/type_traits.h"
+ #include "absl/numeric/int128.h"
+@@ -54,52 +55,9 @@
+
+ namespace {
+
+-// Utility wrapper of T for the purposes of testing the `AbslHash` type erasure
+-// mechanism. `TypeErasedValue<T>` can be constructed with a `T`, and can
+-// be compared and hashed. However, all hashing goes through the hashing
+-// type-erasure framework.
+-template <typename T>
+-class TypeErasedValue {
+- public:
+- TypeErasedValue() = default;
+- TypeErasedValue(const TypeErasedValue&) = default;
+- TypeErasedValue(TypeErasedValue&&) = default;
+- explicit TypeErasedValue(const T& n) : n_(n) {}
+-
+- template <typename H>
+- friend H AbslHashValue(H hash_state, const TypeErasedValue& v) {
+- v.HashValue(absl::HashState::Create(&hash_state));
+- return hash_state;
+- }
+-
+- void HashValue(absl::HashState state) const {
+- absl::HashState::combine(std::move(state), n_);
+- }
+-
+- bool operator==(const TypeErasedValue& rhs) const { return n_ == rhs.n_; }
+- bool operator!=(const TypeErasedValue& rhs) const { return !(*this == rhs); }
+-
+- private:
+- T n_;
+-};
+-
+-// A TypeErasedValue refinement, for containers. It exposes the wrapped
+-// `value_type` and is constructible from an initializer list.
+-template <typename T>
+-class TypeErasedContainer : public TypeErasedValue<T> {
+- public:
+- using value_type = typename T::value_type;
+- TypeErasedContainer() = default;
+- TypeErasedContainer(const TypeErasedContainer&) = default;
+- TypeErasedContainer(TypeErasedContainer&&) = default;
+- explicit TypeErasedContainer(const T& n) : TypeErasedValue<T>(n) {}
+- TypeErasedContainer(std::initializer_list<value_type> init_list)
+- : TypeErasedContainer(T(init_list.begin(), init_list.end())) {}
+- // one-argument constructor of value type T, to appease older toolchains that
+- // get confused by one-element initializer lists in some contexts
+- explicit TypeErasedContainer(const value_type& v)
+- : TypeErasedContainer(T(&v, &v + 1)) {}
+-};
++using ::absl::hash_test_internal::is_hashable;
++using ::absl::hash_test_internal::TypeErasedContainer;
++using ::absl::hash_test_internal::TypeErasedValue;
+
+ template <typename T>
+ using TypeErasedVector = TypeErasedContainer<std::vector<T>>;
+@@ -117,11 +75,6 @@
+ return SpyHashState::combine(SpyHashState(), value);
+ }
+
+-// Helper trait to verify if T is hashable. We use absl::Hash's poison status to
+-// detect it.
+-template <typename T>
+-using is_hashable = std::is_default_constructible<absl::Hash<T>>;
+-
+ TYPED_TEST_P(HashValueIntTest, BasicUsage) {
+ EXPECT_TRUE((is_hashable<TypeParam>::value));
+
+@@ -520,121 +473,6 @@
+ std::bitset<kNumBits>(bit_strings[5].c_str())}));
+ } // namespace
+
+-// Dummy type with unordered equality and hashing semantics. This preserves
+-// input order internally, and is used below to ensure we get test coverage
+-// for equal sequences with different iteraton orders.
+-template <typename T>
+-class UnorderedSequence {
+- public:
+- UnorderedSequence() = default;
+- template <typename TT>
+- UnorderedSequence(std::initializer_list<TT> l)
+- : values_(l.begin(), l.end()) {}
+- template <typename ForwardIterator,
+- typename std::enable_if<!std::is_integral<ForwardIterator>::value,
+- bool>::type = true>
+- UnorderedSequence(ForwardIterator begin, ForwardIterator end)
+- : values_(begin, end) {}
+- // one-argument constructor of value type T, to appease older toolchains that
+- // get confused by one-element initializer lists in some contexts
+- explicit UnorderedSequence(const T& v) : values_(&v, &v + 1) {}
+-
+- using value_type = T;
+-
+- size_t size() const { return values_.size(); }
+- typename std::vector<T>::const_iterator begin() const {
+- return values_.begin();
+- }
+- typename std::vector<T>::const_iterator end() const { return values_.end(); }
+-
+- friend bool operator==(const UnorderedSequence& lhs,
+- const UnorderedSequence& rhs) {
+- return lhs.size() == rhs.size() &&
+- std::is_permutation(lhs.begin(), lhs.end(), rhs.begin());
+- }
+- friend bool operator!=(const UnorderedSequence& lhs,
+- const UnorderedSequence& rhs) {
+- return !(lhs == rhs);
+- }
+- template <typename H>
+- friend H AbslHashValue(H h, const UnorderedSequence& u) {
+- return H::combine(H::combine_unordered(std::move(h), u.begin(), u.end()),
+- u.size());
+- }
+-
+- private:
+- std::vector<T> values_;
+-};
+-
+-template <typename T>
+-class HashValueSequenceTest : public testing::Test {
+-};
+-TYPED_TEST_SUITE_P(HashValueSequenceTest);
+-
+-TYPED_TEST_P(HashValueSequenceTest, BasicUsage) {
+- EXPECT_TRUE((is_hashable<TypeParam>::value));
+-
+- using IntType = typename TypeParam::value_type;
+- auto a = static_cast<IntType>(0);
+- auto b = static_cast<IntType>(23);
+- auto c = static_cast<IntType>(42);
+-
+- std::vector<TypeParam> exemplars = {
+- TypeParam(), TypeParam(), TypeParam{a, b, c},
+- TypeParam{a, c, b}, TypeParam{c, a, b}, TypeParam{a},
+- TypeParam{a, a}, TypeParam{a, a, a}, TypeParam{a, a, b},
+- TypeParam{a, b, a}, TypeParam{b, a, a}, TypeParam{a, b},
+- TypeParam{b, c}};
+- EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(exemplars));
+-}
+-
+-REGISTER_TYPED_TEST_SUITE_P(HashValueSequenceTest, BasicUsage);
+-using IntSequenceTypes = testing::Types<
+- std::deque<int>, std::forward_list<int>, std::list<int>, std::vector<int>,
+- std::vector<bool>, TypeErasedContainer<std::vector<int>>, std::set<int>,
+- std::multiset<int>, UnorderedSequence<int>,
+- TypeErasedContainer<UnorderedSequence<int>>, std::unordered_set<int>,
+- std::unordered_multiset<int>, absl::flat_hash_set<int>,
+- absl::node_hash_set<int>, absl::btree_set<int>>;
+-INSTANTIATE_TYPED_TEST_SUITE_P(My, HashValueSequenceTest, IntSequenceTypes);
+-
+-template <typename T>
+-class HashValueNestedSequenceTest : public testing::Test {};
+-TYPED_TEST_SUITE_P(HashValueNestedSequenceTest);
+-
+-TYPED_TEST_P(HashValueNestedSequenceTest, BasicUsage) {
+- using T = TypeParam;
+- using V = typename T::value_type;
+- std::vector<T> exemplars = {
+- // empty case
+- T{},
+- // sets of empty sets
+- T{V{}}, T{V{}, V{}}, T{V{}, V{}, V{}},
+- // multisets of different values
+- T{V{1}}, T{V{1, 1}, V{1, 1}}, T{V{1, 1, 1}, V{1, 1, 1}, V{1, 1, 1}},
+- // various orderings of same nested sets
+- T{V{}, V{1, 2}}, T{V{}, V{2, 1}}, T{V{1, 2}, V{}}, T{V{2, 1}, V{}},
+- // various orderings of various nested sets, case 2
+- T{V{1, 2}, V{3, 4}}, T{V{1, 2}, V{4, 3}}, T{V{1, 3}, V{2, 4}},
+- T{V{1, 3}, V{4, 2}}, T{V{1, 4}, V{2, 3}}, T{V{1, 4}, V{3, 2}},
+- T{V{2, 3}, V{1, 4}}, T{V{2, 3}, V{4, 1}}, T{V{2, 4}, V{1, 3}},
+- T{V{2, 4}, V{3, 1}}, T{V{3, 4}, V{1, 2}}, T{V{3, 4}, V{2, 1}}};
+- EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(exemplars));
+-}
+-
+-REGISTER_TYPED_TEST_SUITE_P(HashValueNestedSequenceTest, BasicUsage);
+-template <typename T>
+-using TypeErasedSet = TypeErasedContainer<UnorderedSequence<T>>;
+-
+-using NestedIntSequenceTypes = testing::Types<
+- std::vector<std::vector<int>>, std::vector<UnorderedSequence<int>>,
+- std::vector<TypeErasedSet<int>>, UnorderedSequence<std::vector<int>>,
+- UnorderedSequence<UnorderedSequence<int>>,
+- UnorderedSequence<TypeErasedSet<int>>, TypeErasedSet<std::vector<int>>,
+- TypeErasedSet<UnorderedSequence<int>>, TypeErasedSet<TypeErasedSet<int>>>;
+-INSTANTIATE_TYPED_TEST_SUITE_P(My, HashValueNestedSequenceTest,
+- NestedIntSequenceTypes);
+-
+ // Private type that only supports AbslHashValue to make sure our chosen hash
+ // implementation is recursive within absl::Hash.
+ // It uses std::abs() on the value to provide different bitwise representations
+@@ -793,64 +631,6 @@
+ #endif
+ }
+
+-template <typename T>
+-class HashValueAssociativeMapTest : public testing::Test {};
+-TYPED_TEST_SUITE_P(HashValueAssociativeMapTest);
+-
+-TYPED_TEST_P(HashValueAssociativeMapTest, BasicUsage) {
+- using M = TypeParam;
+- using V = typename M::value_type;
+- std::vector<M> exemplars{M{},
+- M{V{0, "foo"}},
+- M{V{1, "foo"}},
+- M{V{0, "bar"}},
+- M{V{1, "bar"}},
+- M{V{0, "foo"}, V{42, "bar"}},
+- M{V{42, "bar"}, V{0, "foo"}},
+- M{V{1, "foo"}, V{42, "bar"}},
+- M{V{1, "foo"}, V{43, "bar"}},
+- M{V{1, "foo"}, V{43, "baz"}}};
+- EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(exemplars));
+-}
+-
+-REGISTER_TYPED_TEST_SUITE_P(HashValueAssociativeMapTest, BasicUsage);
+-using AssociativeMapTypes = testing::Types<
+- std::map<int, std::string>, std::unordered_map<int, std::string>,
+- absl::flat_hash_map<int, std::string>,
+- absl::node_hash_map<int, std::string>, absl::btree_map<int, std::string>,
+- UnorderedSequence<std::pair<const int, std::string>>>;
+-INSTANTIATE_TYPED_TEST_SUITE_P(My, HashValueAssociativeMapTest,
+- AssociativeMapTypes);
+-
+-template <typename T>
+-class HashValueAssociativeMultimapTest : public testing::Test {};
+-TYPED_TEST_SUITE_P(HashValueAssociativeMultimapTest);
+-
+-TYPED_TEST_P(HashValueAssociativeMultimapTest, BasicUsage) {
+- using MM = TypeParam;
+- using V = typename MM::value_type;
+- std::vector<MM> exemplars{MM{},
+- MM{V{0, "foo"}},
+- MM{V{1, "foo"}},
+- MM{V{0, "bar"}},
+- MM{V{1, "bar"}},
+- MM{V{0, "foo"}, V{0, "bar"}},
+- MM{V{0, "bar"}, V{0, "foo"}},
+- MM{V{0, "foo"}, V{42, "bar"}},
+- MM{V{1, "foo"}, V{42, "bar"}},
+- MM{V{1, "foo"}, V{1, "foo"}, V{43, "bar"}},
+- MM{V{1, "foo"}, V{43, "bar"}, V{1, "foo"}},
+- MM{V{1, "foo"}, V{43, "baz"}}};
+- EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(exemplars));
+-}
+-
+-REGISTER_TYPED_TEST_SUITE_P(HashValueAssociativeMultimapTest, BasicUsage);
+-using AssociativeMultimapTypes =
+- testing::Types<std::multimap<int, std::string>,
+- std::unordered_multimap<int, std::string>>;
+-INSTANTIATE_TYPED_TEST_SUITE_P(My, HashValueAssociativeMultimapTest,
+- AssociativeMultimapTypes);
+-
+ TEST(HashValueTest, ReferenceWrapper) {
+ EXPECT_TRUE(is_hashable<std::reference_wrapper<Private>>::value);
+
+--- /dev/null
++++ b/absl/hash/internal/hash_test.h
+@@ -0,0 +1,87 @@
++// Copyright 2023 The Abseil Authors.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// https://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++
++// Common code shared between absl/hash/hash_test.cc and
++// absl/hash/hash_instantiated_test.cc.
++
++#ifndef ABSL_HASH_INTERNAL_HASH_TEST_H_
++#define ABSL_HASH_INTERNAL_HASH_TEST_H_
++
++#include <type_traits>
++#include <utility>
++
++#include "absl/base/config.h"
++#include "absl/hash/hash.h"
++
++namespace absl {
++ABSL_NAMESPACE_BEGIN
++namespace hash_test_internal {
++
++// Utility wrapper of T for the purposes of testing the `AbslHash` type erasure
++// mechanism. `TypeErasedValue<T>` can be constructed with a `T`, and can
++// be compared and hashed. However, all hashing goes through the hashing
++// type-erasure framework.
++template <typename T>
++class TypeErasedValue {
++ public:
++ TypeErasedValue() = default;
++ TypeErasedValue(const TypeErasedValue&) = default;
++ TypeErasedValue(TypeErasedValue&&) = default;
++ explicit TypeErasedValue(const T& n) : n_(n) {}
++
++ template <typename H>
++ friend H AbslHashValue(H hash_state, const TypeErasedValue& v) {
++ v.HashValue(absl::HashState::Create(&hash_state));
++ return hash_state;
++ }
++
++ void HashValue(absl::HashState state) const {
++ absl::HashState::combine(std::move(state), n_);
++ }
++
++ bool operator==(const TypeErasedValue& rhs) const { return n_ == rhs.n_; }
++ bool operator!=(const TypeErasedValue& rhs) const { return !(*this == rhs); }
++
++ private:
++ T n_;
++};
++
++// A TypeErasedValue refinement, for containers. It exposes the wrapped
++// `value_type` and is constructible from an initializer list.
++template <typename T>
++class TypeErasedContainer : public TypeErasedValue<T> {
++ public:
++ using value_type = typename T::value_type;
++ TypeErasedContainer() = default;
++ TypeErasedContainer(const TypeErasedContainer&) = default;
++ TypeErasedContainer(TypeErasedContainer&&) = default;
++ explicit TypeErasedContainer(const T& n) : TypeErasedValue<T>(n) {}
++ TypeErasedContainer(std::initializer_list<value_type> init_list)
++ : TypeErasedContainer(T(init_list.begin(), init_list.end())) {}
++ // one-argument constructor of value type T, to appease older toolchains that
++ // get confused by one-element initializer lists in some contexts
++ explicit TypeErasedContainer(const value_type& v)
++ : TypeErasedContainer(T(&v, &v + 1)) {}
++};
++
++// Helper trait to verify if T is hashable. We use absl::Hash's poison status to
++// detect it.
++template <typename T>
++using is_hashable = std::is_default_constructible<absl::Hash<T>>;
++
++} // namespace hash_test_internal
++ABSL_NAMESPACE_END
++} // namespace absl
++
++#endif // ABSL_HASH_INTERNAL_HASH_TEST_H_
diff --git a/debian/patches/symbolize-ppc64.diff b/debian/patches/symbolize-ppc64.diff
new file mode 100644
index 00000000..a11c27d4
--- /dev/null
+++ b/debian/patches/symbolize-ppc64.diff
@@ -0,0 +1,118 @@
+From: Benjamin Barenblat <bbaren@google.com>
+Subject: Fix symbolization on PowerPC ELF v1
+Origin: backport, https://github.com/abseil/abseil-cpp/commit/372bfc86105728732fc115af46223d7a4e49f8d9
+
+The big-endian PowerPC ELF ABI (ppc64 in Debian) relies on function descriptors
+mapped in a non-executable segment. Make sure that segment is scanned during
+symbolization. Also correct bounds computation for that segment.
+
+--- a/absl/debugging/symbolize_elf.inc
++++ b/absl/debugging/symbolize_elf.inc
+@@ -648,8 +648,10 @@
+ }
+
+ // Return true if an address is inside a section.
+-static bool InSection(const void *address, const ElfW(Shdr) * section) {
+- const char *start = reinterpret_cast<const char *>(section->sh_addr);
++static bool InSection(const void *address, ptrdiff_t relocation,
++ const ElfW(Shdr) * section) {
++ const char *start = reinterpret_cast<const char *>(
++ section->sh_addr + static_cast<ElfW(Addr)>(relocation));
+ size_t size = static_cast<size_t>(section->sh_size);
+ return start <= address && address < (start + size);
+ }
+@@ -689,8 +691,8 @@
+ // starting address. However, we do not always want to use the real
+ // starting address because we sometimes want to symbolize a function
+ // pointer into the .opd section, e.g. FindSymbol(&foo,...).
+- const bool pc_in_opd =
+- kPlatformUsesOPDSections && opd != nullptr && InSection(pc, opd);
++ const bool pc_in_opd = kPlatformUsesOPDSections && opd != nullptr &&
++ InSection(pc, relocation, opd);
+ const bool deref_function_descriptor_pointer =
+ kPlatformUsesOPDSections && opd != nullptr && !pc_in_opd;
+
+@@ -730,7 +732,7 @@
+ #endif
+
+ if (deref_function_descriptor_pointer &&
+- InSection(original_start_address, opd)) {
++ InSection(original_start_address, /*relocation=*/0, opd)) {
+ // The opd section is mapped into memory. Just dereference
+ // start_address to get the first double word, which points to the
+ // function entry.
+@@ -1326,7 +1328,7 @@
+ const int phnum = obj->elf_header.e_phnum;
+ const int phentsize = obj->elf_header.e_phentsize;
+ auto phoff = static_cast<off_t>(obj->elf_header.e_phoff);
+- size_t num_executable_load_segments = 0;
++ size_t num_interesting_load_segments = 0;
+ for (int j = 0; j < phnum; j++) {
+ ElfW(Phdr) phdr;
+ if (!ReadFromOffsetExact(obj->fd, &phdr, sizeof(phdr), phoff)) {
+@@ -1335,23 +1337,35 @@
+ return false;
+ }
+ phoff += phentsize;
+- constexpr int rx = PF_X | PF_R;
+- if (phdr.p_type != PT_LOAD || (phdr.p_flags & rx) != rx) {
+- // Not a LOAD segment, or not executable code.
++
++#if defined(__powerpc__) && !(_CALL_ELF > 1)
++ // On the PowerPC ELF v1 ABI, function pointers actually point to function
++ // descriptors. These descriptors are stored in an .opd section, which is
++ // mapped read-only. We thus need to look at all readable segments, not
++ // just the executable ones.
++ constexpr int interesting = PF_R;
++#else
++ constexpr int interesting = PF_X | PF_R;
++#endif
++
++ if (phdr.p_type != PT_LOAD
++ || (phdr.p_flags & interesting) != interesting) {
++ // Not a LOAD segment, not executable code, and not a function
++ // descriptor.
+ continue;
+ }
+- if (num_executable_load_segments < obj->phdr.size()) {
+- memcpy(&obj->phdr[num_executable_load_segments++], &phdr, sizeof(phdr));
++ if (num_interesting_load_segments < obj->phdr.size()) {
++ memcpy(&obj->phdr[num_interesting_load_segments++], &phdr, sizeof(phdr));
+ } else {
+ ABSL_RAW_LOG(
+- WARNING, "%s: too many executable LOAD segments: %zu >= %zu",
+- obj->filename, num_executable_load_segments, obj->phdr.size());
++ WARNING, "%s: too many interesting LOAD segments: %zu >= %zu",
++ obj->filename, num_interesting_load_segments, obj->phdr.size());
+ break;
+ }
+ }
+- if (num_executable_load_segments == 0) {
+- // This object has no "r-x" LOAD segments. That's unexpected.
+- ABSL_RAW_LOG(WARNING, "%s: no executable LOAD segments", obj->filename);
++ if (num_interesting_load_segments == 0) {
++ // This object has no interesting LOAD segments. That's unexpected.
++ ABSL_RAW_LOG(WARNING, "%s: no interesting LOAD segments", obj->filename);
+ return false;
+ }
+ }
+@@ -1379,8 +1393,8 @@
+ // X in the file will have a start address of [true relocation]+X.
+ relocation = static_cast<ptrdiff_t>(start_addr - obj->offset);
+
+- // Note: some binaries have multiple "rx" LOAD segments. We must
+- // find the right one.
++ // Note: some binaries have multiple LOAD segments that can contain
++ // function pointers. We must find the right one.
+ ElfW(Phdr) *phdr = nullptr;
+ for (size_t j = 0; j < obj->phdr.size(); j++) {
+ ElfW(Phdr) &p = obj->phdr[j];
+@@ -1390,7 +1404,7 @@
+ ABSL_RAW_CHECK(p.p_type == PT_NULL, "unexpected p_type");
+ break;
+ }
+- if (pc < reinterpret_cast<void *>(start_addr + p.p_memsz)) {
++ if (pc < reinterpret_cast<void *>(start_addr + p.p_vaddr + p.p_memsz)) {
+ phdr = &p;
+ break;
+ }
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 00000000..7f76c033
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,60 @@
+#!/usr/bin/make -f
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+include /usr/share/dpkg/architecture.mk
+
+export DEB_BUILD_MAINT_OPTIONS = hardening=+bindnow reproducible=+fixfilepath
+
+# Unit tests require more than 2 GB of RAM, so disable them on mipsel.
+#
+# Disable unit tests unconditionally if nocheck is set.
+ifeq ($(DEB_HOST_ARCH),mipsel)
+ABSL_RUN_TESTS=OFF
+else ifneq ($(filter nocheck,$(DEB_BUILD_OPTIONS)),)
+ABSL_RUN_TESTS=OFF
+else
+ABSL_RUN_TESTS=ON
+endif
+
+# Debian's RISC-V builders don't have enough resources to run tests in parallel.
+# See https://bugs.debian.org/1025221.
+ifneq ($(filter $(DEB_HOST_ARCH),riscv64),)
+ABSL_TEST_EXTRA_ARGS=--no-parallel
+endif
+
+%:
+ dh $@
+
+override_dh_auto_clean:
+ $(RM) -r $(CURDIR)/static
+ $(RM) -r $(CURDIR)/shared
+
+override_dh_auto_configure:
+ dh_auto_configure -Bstatic -- -DCMAKE_CXX_STANDARD=17 -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=ON -DABSL_BUILD_TESTING=ON -DABSL_USE_GOOGLETEST_HEAD=OFF
+ dh_auto_configure -Bshared -- -DCMAKE_CXX_STANDARD=17 -DBUILD_SHARED_LIBS=ON
+
+override_dh_auto_build:
+ dh_auto_build -Bstatic
+ dh_auto_build -Bshared
+
+ifeq ($(ABSL_RUN_TESTS),ON)
+override_dh_auto_test:
+ dh_auto_test -Bstatic $(ABSL_TEST_EXTRA_ARGS)
+endif
+
+override_dh_auto_install:
+ dh_auto_install -Bstatic
+ dh_auto_install -Bshared
+ find debian/tmp -type d -empty -delete
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 00000000..163aaf8d
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/debian/tests/bug1011294 b/debian/tests/bug1011294
new file mode 100755
index 00000000..302bcf73
--- /dev/null
+++ b/debian/tests/bug1011294
@@ -0,0 +1,24 @@
+#!/bin/sh
+# Copyright 2022 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+set -eu
+
+readonly TMP="$(mktemp -d)"
+trap "rm -rf \"$TMP\"" EXIT
+cd "$TMP"
+
+echo 'int main() {}' >noop.cc
+
+g++ -o noop noop.cc $(pkg-config --cflags absl_base) $(pkg-config --libs absl_base)
diff --git a/debian/tests/cmake b/debian/tests/cmake
new file mode 100755
index 00000000..43eb3408
--- /dev/null
+++ b/debian/tests/cmake
@@ -0,0 +1,45 @@
+#!/bin/sh -eu
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+readonly TMP="$(mktemp -d)"
+trap "rm -rf \"$TMP\"" EXIT
+cd "$TMP"
+
+cat >test.cc <<EOF
+#include <absl/strings/numbers.h>
+
+int main(int argc, char* argv[]) {
+ int n;
+ if (!absl::SimpleAtoi(argv[1], &n)) {
+ return 1;
+ }
+ return n;
+}
+EOF
+
+cat >CMakeLists.txt <<EOF
+cmake_minimum_required(VERSION 3.5)
+project(test CXX)
+set(CMAKE_CXX_STANDARD 17)
+add_executable(test test.cc)
+find_package(absl REQUIRED)
+target_link_libraries(test absl::strings)
+EOF
+
+mkdir build
+cd build
+cmake ..
+make
+./test 0
diff --git a/debian/tests/control b/debian/tests/control
new file mode 100644
index 00000000..7bda87a7
--- /dev/null
+++ b/debian/tests/control
@@ -0,0 +1,25 @@
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+Tests: smoke
+Depends: @, g++, libgtest-dev
+
+Tests: cmake
+Depends: @, cmake (>= 3.5), g++, make
+
+Tests: bug1011294
+Depends: @, g++, pkg-config
+
+Tests: upstream1407
+Depends: @, g++, libgmock-dev
diff --git a/debian/tests/smoke b/debian/tests/smoke
new file mode 100755
index 00000000..7c4b66fa
--- /dev/null
+++ b/debian/tests/smoke
@@ -0,0 +1,37 @@
+#!/bin/sh -eu
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+readonly TMP="$(mktemp -d)"
+trap "rm -rf \"$TMP\"" EXIT
+cd "$TMP"
+
+cat >smoke.cc <<EOF
+#include <absl/strings/str_join.h>
+#include <gtest/gtest.h>
+
+#include <vector>
+
+namespace {
+
+TEST(AbseilTest, StrJoinWorks) {
+ std::vector<std::string> v = {"foo", "bar", "baz"};
+ EXPECT_EQ(absl::StrJoin(v, "-"), "foo-bar-baz");
+}
+
+} // namespace
+EOF
+
+g++ -o smoke smoke.cc -labsl_strings -lgtest -lgtest_main -pthread
+./smoke
diff --git a/debian/tests/upstream1407 b/debian/tests/upstream1407
new file mode 100755
index 00000000..332fc947
--- /dev/null
+++ b/debian/tests/upstream1407
@@ -0,0 +1,28 @@
+#!/bin/sh
+# Copyright 2023 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+set -eu
+
+readonly TMP="$(mktemp -d)"
+trap "rm -rf \"$TMP\"" EXIT
+cd "$TMP"
+
+cat >scoped_mock_log_trial.cc <<EOF
+#include <absl/log/scoped_mock_log.h>
+
+int main() { absl::ScopedMockLog scoped_mock_log; }
+EOF
+
+g++ -o scoped_mock_log_trial scoped_mock_log_trial.cc -labsl_scoped_mock_log -labsl_log_entry -labsl_log_sink -labsl_log_internal_log_sink_set -labsl_raw_logging_internal -labsl_log_severity -labsl_strings -lgmock -lgtest
diff --git a/debian/watch b/debian/watch
new file mode 100644
index 00000000..e621a589
--- /dev/null
+++ b/debian/watch
@@ -0,0 +1,18 @@
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+version=4
+opts="filenamemangle=s%(?:.*?)?v?(\d[\d.]*)\.tar\.gz%@PACKAGE@-$1.tar.gz%, uversionmangle=s/^/0~/" \
+ https://github.com/abseil/abseil-cpp/releases \
+ (?:.*?/)?v?(\d[\d.]*)\.tar\.gz