#1144127 qa.debian.org: qpdf package transition blocked by outdated binary packages

#1144127#5
Date:
2026-08-11 12:11:17 UTC
From:
To:
I've been a Debian Developer since 2005 (qjb@debian.org), but for many
years, I've been maintaining only qpdf, for which I am also upstream.
I apologize if I have just forgotten or overlooked some standard
process here.

Tl;Dr: libcupsfilters and r-cran-qpdf are blocking transition of qpdf,
and I think the resolution is to just rebuild them. This is not an
issue of ABI breakage in qpdf itself.

Justification for important: the result of this issue is that printing
breaks for people on unstable when the install the latest qpdf. See
bugs 1144072 and 1144111.

In the latest upstream release, qpdf started using C++-20 features
internally, while the API remains C++-17-compatible. With the upload
of 12.4.0-1 to unstable, several regressions were introduced:

https://qa.debian.org/excuses.php?package=qpdf

These are for packages whose binary packages haven't been built
recently enough to link with a C++ library that contains all the C++
functions. In particular, the builds are failing because this symbol
is not found:

std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>::_M_replace(unsigned long, unsigned long, char const*, unsigned long)

This is an overload of std::string::replace that was introduced in
C++-20.

My recollection is that this situation should automatically trigger
binary NMU (or rebuild or whatever it is these days) of the binary
packages, currently libcupsfilters and r-cran-qpdf, but it's been a
couple of days since upload, so I'm not sure if I have to do something
to poke this.

Please let me know:
* If I just waited, would this "automatically" resolve?
* If I have to poke, is this the right place to poke?
* Have I misdiagnosed this? If so, I can create a patch that removes
  the C++-20 call, but I don't think it should be necessary to do
  that. I plan on introducing additional C++-20 calls in upcoming qpdf
  versions.

#1144127#10
Date:
2026-08-11 14:01:02 UTC
From:
To:
* Jay Berkenbilt <ejb@ql.org> [260811 14:23]:

Reassigning this to release.d.o, as qa.d.o is only the messenger.
https://ci.debian.net/packages/libc/libcupsfilters/testing/arm64/74208469/
   /usr/bin/aarch64-linux-gnu-ld.bfd: /usr/lib/gcc/aarch64-linux-gnu/15/../../../aarch64-linux-gnu/libcupsfilters.so: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace(unsigned long, unsigned long, char const*, unsigned long)@LIBQPDF_30'

Note the @LIBQPDF_30 suffix - this is not a symbol that never
existed. This symbol did exist, but disappeared!
That sounds like real ABI breakage.

#1144127#17
Date:
2026-08-11 14:32:25 UTC
From:
To:
Hi Jay,

These symbols should have never existed in the first place. These are
symbols from template instantiations of the standard library that
shouldn't have gained a LIBQPDF_30 symbol version. Did upstream clean up
their build system to no longer export those symbols with that symbol
version?

qpdf/libqpdf.map.in still seems to broad so that I think this
still needs some work upstream first to only apply the symbol version to
the actual symbols from libqpdf.

Cheers

#1144127#22
Date:
2026-08-11 14:48:05 UTC
From:
To:
Oh, you're right -- I didn't catch that. I haven't touched that aspect of the qpdf build in years, so I'm not sure how it got in there to begin with. I'll have to scrutinize this.

Right. I don't want to do a major version bump...this isn't really an
ABI change to qpdf though it is an ABI change to the debian packaged
qpdf library binary. I'll either have to change the soname in the
debian package until my next version bump using a suffix or something
or else, well, I'm not sure actually. I guess in the meantime, I
should revert by uploading a 12.4.0.1~really-12.3.2 or something. It's
been years since I've had anything other than a completely routine
upload. Is this a sensible approach for now? I'll have to get to the
bottom of why non-QPDF symbols are sneaking in there with the symbol
version. Regarding the breadth of the map, that was set up ages ago,
and at the time, the advice I was given by the release team was to do
something broad like that because trying to deal with real symbols
with C++ name mangling is very complex. That said, I can automate it
in some way. (I am upstream also BTW.)

#1144127#27
Date:
2026-08-11 15:03:48 UTC
From:
To:
We also had changes in the toolchain since the upload of 12.3.2-1. If
this aspect did not change in qpdf, this could also be change in the
toolchain. So before suggesting any actions, I would like to understand
where it is coming from. A rebuild of 12.3.2 may suffer the same issue.

Cheers

#1144127#32
Date:
2026-08-11 15:25:33 UTC
From:
To:
It may be a couple of days before I can dig into this, but I'll try to
find time as soon as possible. I have automation in CI for qpdf that
dumps the symbols and compares so that accidental ABI breakage is
supposed to be impossible. I may filter on standard library, so I may
have shot myself in the foot. I will be able to tell for sure though
whether a local build of 12.3.2 and 12.4.0 on the same system behave
correctly with respect to exported symbols. Right now, if I determine
that I have accidentally done something to make this get tagged and it
disappeared, I'll do something to make it reappear and fix it for real
with qpdf 13.0.0. If it turns out to be a debian toolchain issue, I'll
stand by. I'll reply to this bug report when I have some information,
and if I determine that it's my mistake and I can fix it, then I'll
upload a fix and close the bugs in the changelog.

I'll report back soon either way. Thanks!

#1144127#37
Date:
2026-08-11 16:35:19 UTC
From:
To:
* Jay Berkenbilt <ejb@ql.org> [260811 17:26]:

[..]
[..]

Indeed rebuilding qpdf 12.3.2-1 in unstable causes _M_replace and
other (weak) symbols to disappear from @LIBQPDF_30.

Best,
Chris

#1144127#42
Date:
2026-08-11 17:56:48 UTC
From:
To:
So then this sounds like a toolchain issue on the debian side? Come to
think of it, when I released 12.3.2, there was some churn on the
toolchain, and I was unable to build in my local chroot -- binutils
had been updated about four hours earlier. I waited a few days and
tried again, and it was successful...but perhaps my previous upload
was timed poorly, and I got stuck with a tooling issue.

If I'm reading your response correctly, the solution would be to
rebuild qpdf's downstream dependencies perhaps a rebuild 12.3.2 and
then see if the 12.4.0 transition is able to go? Let me know if
there's anything I need to do on my side. Thanks for the quick
responses in looking into this issue.

#1144127#47
Date:
2026-08-11 19:04:54 UTC
From:
To:
Could you check whether libqpdf30 in stable exported the std:: symbols
with @LIBQPDF_30? Thanks

Cheers

#1144127#52
Date:
2026-08-12 08:30:42 UTC
From:
To:
Thanks for checking. So that build system of qpdf is working as expted
but the toolchain produced broken results. I have scheduled rebuilds of
packages that link the template instantations with the LIBQPDF_30 symbol
version in unstable. I am closing this bug. If qpdf remains unable to
migrate after the rebuild and reruns of the autopkgtests, please let us
know.

Cheers

#1144127#57
Date:
2026-08-15 12:39:50 UTC
From:
To:
Nothing has changed. Have the rebuilds been scheduled? I don't see evidence of cups having been rebuilt. Thanks.
#1144127#62
Date:
2026-08-15 15:44:39 UTC
From:
To:
https://buildd.debian.org/status/package.php?p=libcupsfilters&suite=sid
and others. We are still waiting for some builds to be completed. When
all of them are done, I'll hint qpdf into testing.

Cheers