On Fri, Jun 9 2023 at 12:10:07 -0700, Steve Langasek <steve.langa...@ubuntu.com> wrote:
Hi Seb,

On Fri, Jun 09, 2023 at 02:27:02PM +0200, Sebastien Bacher wrote:
I would like to ask if there is any chance the MIR team would reconsider their position on the topic (at least until the day we have a somewhat
 working solution we can use)?

 which also included those types of changes

 - _Znam@Base 2.0~b2-0ubuntu3
 + _Znaj@Base 2.0~b2-0ubuntu4
 +#MISSING: 2.0~b2-0ubuntu4# _Znam@Base 2.0~b2-0ubuntu3

I personally don't understand why we have those symbols existing on armhf which don't exist on amd64. Nor why _Znam@Base is becoming _Znaj@Base nor
 how we are supposed to handle such cases

Passing them through c++filt may help explain:

$ echo _Znam@Base | c++filt
operator new[](unsigned long)@Base
$ echo _Znaj@Base | c++filt
operator new[](unsigned int)@Base
$

There are various C++ functions whose signature will change based on the
architecture word length.

.symbols files support various kinds of globbing etc to be able to express this logically (e.g., you could say '_Zna[mj]@Base' instead of listing two
different symbols as optional), but as you've found, it's an onerous,
iterative process to identify all the ways C++ symbols vary across
architectures and then encode this in a .symbols file. And in this case, the symbol isn't part of the library's public ABI anyway, this is just a
function from the base C++ library!

4. doing those tweaks need to be done manually since it's not only applying the diff but also adding optional keyword at places, I got one wrong and it
 failed to build again

 add one more symbol specific to risvc
http://launchpadlibrarian.net/647875197/libcupsfilters_2.0~b2-0ubuntu6_2.0~b2-0ubuntu7.diff.gz

Yep.

I understand the motivation for wanting a symbol file but I agree with what Robie, what's the benefit. In that case we spent a few hours to end up with a .symbols which as over 150 '(optional)' entries, that doesn't protect us much better than just not having a .symbols or using -c0 but still has a
 high cost.

I wouldn't say that it doesn't protect you. It's a pain to set up initially and as you note, you can even have to do further fix-ups as a result of toolchain changes, as the set of template functions and other C++ sugar from outside of the library that gets exported as ELF symbols can change. It
DOES have a high cost, but in the end it provides the same level of
protection against accidental ABI breakage as it does for C libraries.

It would be nice to have better consistent tooling around ABI checking for C++ libraries. I think the KDE team had some tools around automating the generation of symbols files - it does require two passes, first to build on all archs and then to merge the results. But in principle that's better
than whack-a-mole.

We could also consider using abi-compliance-checker instead of symbols files for C++ libraries. There is a dh-acc debhelper addon, but I've never used it. We are currently using abi-compliance-checker for the ABI analysis of armhf for the move to 64-bit time_t; it's unmaintained upstream, but it does seem to work pretty well - the vast majority of issues we've encountered with it, when trying to run it over the entire Ubuntu archive, have been due to header files that #include headers from packages they don't depend on, or collections of headers that can't all be included together. Both of these are issues of much less significance when it's the maintainer doing the work. It would require the same sort of two-pass setup process as the KDE
tools, though, and if it has to be done per-arch (probably), it's more
awkward to set up because a-c-c .dump files aren't ascii that you can scrape from the build logs of failed builds - but it might be a more reliable tool
over the long term than dpkg-gensymbols for C++ libraries.

In the Mir (not MIR ☺) team we've periodically been annoyed by maintaining symbols files for C++¹, and have experimented with both abi-compliance-checker and abigail. None of those experiments have ended up sticking, though, for reasons which I'm not fully aware of. Alan Griffiths and Michał Sawicz did most of that investigation; I'll see if they can help shed light on problems we encountered.

If we *can* get (one of) the ABI checking tools working they'll be more valuable than a symbols file anyway, as they actually check that ABI didn't change rather than just that the symbol strings in the DSO match.

¹: and we're playing on *easy* mode, where we, as upstream, use a linker script to export only symbols we intend to export.


Downside: symbols files also let you track what version of a package a
symbol was added in, which lets packages' versioned dependencies on
libraries be no stricter than actually necessary.


I don't speak for the MIR team, I have no objection to them relaxing the requirement of .symbols files for C++ libraries in main. Just offering some suggestions on how we can do a better job of automating C++ ABI checks than
we're doing today.

Cheers,
--
Steve Langasek Give me a lever long enough and a Free OS Debian Developer to set it on, and I can move the world. Ubuntu Developer https://www.debian.org/ slanga...@ubuntu.com vor...@debian.org
--
ubuntu-devel mailing list
ubuntu-devel@lists.ubuntu.com
Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/ubuntu-devel



--
ubuntu-devel mailing list
ubuntu-devel@lists.ubuntu.com
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/ubuntu-devel

Reply via email to