Renaming a Rust crate changes every crate-qualified type name, so an unchanged C surface reads API_BREAK on the DWARF path (2026-10-15)¶
Status (2026-10-15): OPEN. Reproduced on two cdylibs with identical source and C ABI, differing only in [package] name.
abicheck compare librustlib.so librustlib2.so # DWARF only
# verdict API_BREAK, exit 2
# type_removed rustlib::Point
# type_added rustlib2::Point
abicheck compare librustlib.so librustlib2.so -H old=h -H new=h # same header
# verdict NO_CHANGE, exit 0
DWARF names of Rust types are qualified by the crate root, so a repr(C) Point is rustlib::Point. The C-visible identity of Point is the bare name, and a header sees exactly that. A crate rename therefore reads as a removed type and an added type on the DWARF path.
Fix direction: for crate-root types that are reachable from a #[no_mangle] export, identity should use the unqualified name. That needs a decision on namespace semantics, since C++ namespaces are significant and must keep their qualifiers. Not attempted.
Workaround: keep the crate name stable across versions, or compare with headers. See Rust Libraries.
Index: Known gaps