clang++ no longer ABI-compatible with g++

Bug #1510042 reported by Jeff Abrahamson on 2015-10-26
42
This bug affects 16 people
Affects Status Importance Assigned to Milestone
llvm-toolchain-3.8 (Debian)
Fix Released
Unknown
llvm-toolchain-3.8 (Ubuntu)
Medium
Unassigned
Xenial
Medium
Unassigned

Bug Description

SRU acceptance criteria: the example successfully links.

On updating ubuntu from 15.04 to 15.10, I see changes in how clang resolves references to some libraries. (I think this is not an ubuntu question but rather a clang question and that I've missed some subtlety on how clang has recently changed. I suspect initially that this is related to the gcc-5 ABI changes, but I'm not sure how to proceed.)

Here's a tiny test example designed only to tickle the phenomenon:

#include <jsoncpp/json/json.h>
#include <iostream>

int main(int argc, char *argv[]) {
    std::cout << argc << " - " << argv[0] << std::endl;
    Json::Reader reader;
    Json::Value root;
    reader.parse("", root, false);
    std::cout << reader.getFormattedErrorMessages() << std::endl;
    return 0;
}

If I compile like this

clang++ -ggdb3 -Wall -Wextra -std=c++14 -o json_test json_test.cc -ljsoncpp

/tmp/json_test-680d3a.o: In function `main':
/tmp/json_test.cc:10: undefined reference to `Json::Reader::getFormattedErrorMessages() const'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

And yet the definition appears to be present:

jeff@birdsong:src $ objdump -TC /usr/lib/x86_64-linux-gnu/libjsoncpp.so | grep getFormatted
000000000000e190 g DF .text 00000000000004d2 Base Json::OurReader::getFormattedErrorMessages[abi:cxx11]() const
000000000000dc70 g DF .text 00000000000004d2 Base Json::Reader::getFormattedErrorMessages[abi:cxx11]() const
jeff@birdsong:src $

The abi:cxx11 suggests I might at least try this

clang++ -ggdb3 -Wall -Wextra -std=c++11 -o json_test json_test.cc -ljsoncpp

but same error. On the other hand, this works fine:

g++ -ggdb3 -Wall -Wextra -std=c++14 -o json_test json_test.cc -ljsoncpp

Fwiw, here's version info:

jeff@birdsong:tmp $ g++ --version
g++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

jeff@birdsong:tmp $ clang++ --version
Ubuntu clang version 3.6.2-1 (tags/RELEASE_362/final) (based on LLVM 3.6.2)
Target: x86_64-pc-linux-gnu
Thread model: posix
jeff@birdsong:tmp $

ProblemType: Bug
DistroRelease: Ubuntu 15.10
Package: libjsoncpp-dev 0.10.5-1
ProcVersionSignature: Ubuntu 4.2.0-16.19-generic 4.2.3
Uname: Linux 4.2.0-16-generic x86_64
ApportVersion: 2.19.1-0ubuntu3
Architecture: amd64
CurrentDesktop: i3
Date: Mon Oct 26 12:00:40 2015
Dependencies:
 gcc-5-base 5.2.1-22ubuntu2
 libc6 2.21-0ubuntu4
 libgcc1 1:5.2.1-22ubuntu2
 libjsoncpp0v5 0.10.5-1
 libstdc++6 5.2.1-22ubuntu2
EcryptfsInUse: Yes
InstallationDate: Installed on 2015-10-23 (2 days ago)
InstallationMedia: Ubuntu 15.04 "Vivid Vervet" - Release amd64 (20150422)
SourcePackage: libjsoncpp
UpgradeStatus: Upgraded to wily on 2015-10-23 (2 days ago)

Jeff Abrahamson (jeff-purple) wrote :

assigning to clang

affects: libjsoncpp (Ubuntu) → llvm-toolchain-3.8 (Ubuntu)
affects: libjsoncpp (Debian) → llvm-toolchain-3.8 (Debian)
Changed in llvm-toolchain-3.8 (Debian):
status: Unknown → Confirmed
Matthias Klose (doko) wrote :

yes, clang is not yet aware of the GCC5 mangling

Changed in llvm-toolchain-3.8 (Ubuntu):
status: New → Confirmed
Changed in llvm-toolchain-3.8 (Ubuntu):
importance: Undecided → Medium
Matthias Klose (doko) on 2016-07-09
description: updated
Matthias Klose (doko) on 2016-07-09
Changed in llvm-toolchain-3.8 (Ubuntu Xenial):
status: New → Confirmed
Launchpad Janitor (janitor) wrote :

This bug was fixed in the package llvm-toolchain-3.8 - 1:3.8.1-3ubuntu1

---------------
llvm-toolchain-3.8 (1:3.8.1-3ubuntu1) yakkety; urgency=medium

  * Merge with Debian; remaining changes:

llvm-toolchain-3.8 (1:3.8.1-3) unstable; urgency=medium

  * Add -gsplit-dwarf to CXXFLAGS to workaround the memory allocation
    issue on i386 (hopefully)

llvm-toolchain-3.8 (1:3.8.1-2ubuntu2) yakkety; urgency=medium

  * Add support for gcc's attribute abi_tag (needed for compatibility with
    GCC 5's libstdc++); taken from the trunk. Closes: #797038. LP: #1510042.

 -- Matthias Klose <email address hidden> Sat, 09 Jul 2016 17:19:37 +0200

Changed in llvm-toolchain-3.8 (Ubuntu):
status: Confirmed → Fix Released

Hello Jeff, or anyone else affected,

Accepted llvm-toolchain-3.8 into xenial-proposed. The package will build now and be available at https://launchpad.net/ubuntu/+source/llvm-toolchain-3.8/1:3.8-2ubuntu4 in a few hours, and then in the -proposed repository.

Please help us by testing this new package. See https://wiki.ubuntu.com/Testing/EnableProposed for documentation how to enable and use -proposed. Your feedback will aid us getting this update out to other Ubuntu users.

If this package fixes the bug for you, please add a comment to this bug, mentioning the version of the package you tested, and change the tag from verification-needed to verification-done. If it does not fix the bug for you, please add a comment stating that, and change the tag to verification-failed. In either case, details of your testing will help us make a better decision.

Further information regarding the verification process can be found at https://wiki.ubuntu.com/QATeam/PerformingSRUVerification . Thank you in advance!

Changed in llvm-toolchain-3.8 (Ubuntu Xenial):
status: Confirmed → Fix Committed
tags: added: verification-needed
Changed in llvm-toolchain-3.8 (Ubuntu Xenial):
importance: Undecided → Medium

the provided example now links.

tags: added: verification-done
removed: verification-needed

The verification of the Stable Release Update for llvm-toolchain-3.8 has completed successfully and the package has now been released to -updates. Subsequently, the Ubuntu Stable Release Updates Team is being unsubscribed and will not receive messages about this bug report. In the event that you encounter a regression using the package from -updates please report a new bug using ubuntu-bug and tag the bug report regression-update so we can easily find any regressions.

This bug was fixed in the package llvm-toolchain-3.8 - 1:3.8-2ubuntu4

---------------
llvm-toolchain-3.8 (1:3.8-2ubuntu4) xenial-proposed; urgency=medium

  * SRU:
  * Add support for gcc's attribute abi_tag (needed for compatibility with
    GCC 5's libstdc++); taken from the trunk. Closes: #797038. LP: #1510042.

 -- Matthias Klose <email address hidden> Sat, 09 Jul 2016 13:22:59 +0200

Changed in llvm-toolchain-3.8 (Ubuntu Xenial):
status: Fix Committed → Fix Released
Daniel van Vugt (vanvugt) wrote :

This should have been done as bug 1488254, but glad to have a fix.

summary: - linking against -ljsoncpp fails with clang
+ clang++ no longer ABI-compatible with g++
Changed in llvm-toolchain-3.8 (Debian):
status: Confirmed → Fix Released
To post a comment you must log in.
This report contains Public information  Edit
Everyone can see this information.

Duplicates of this bug

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.