libicu is not ABI compatible because of --enable-renaming usage
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
icu (Ubuntu) |
Opinion
|
Undecided
|
Unassigned |
Bug Description
Binary package hint: libicu42
Currently, libicu is built with symbol renaming, which leads to a rename of
every symbol, e.g. ucol_strcoll becomes ucol_strcoll_4_2. Check with "nm -CD
libicui18n.so.42" - all public symbols have the _4_2 suffix.
This means that on the next system upgrade (e.g. to libicu 4.4), all
applications linking to libicu will need to be rebuilt.
For reference, see
http://
Quoting:
========
To enable release-to-release binary compatibility, ICU must be built with
--disable-renaming, and applications must be built using the headers and
libraries that resulted from the –-disable-renaming ICU build
========
I suggest to follow ICU's suggestion to build libicu with --disable-renaming, so the library can be
upgraded without breaking binary compatibility.
Note that ICU is ABI compatible to the same Major+Minor. SO in other words, if the dependency is on "icu 4 . 4" that can be satisfied by ICU 4.4.0, 4.4.1, 4.4.2 - those are compatible. If another application (or library) depended on ICU 4.6, they can peacefully coexist in the same address space.
One benefit of disabling renaming in the OS is that if an app wants a certain ICU version, it can enable renaming and link with a renamed ICU, ignoring the disabled-renaming symbols in the OS even if they are linked.
MacOSX (Apple) disables renaming in their ICU build for the OS, i believe AIX does also.
So to sum: if the package name is something like "icu44" and "icu46" then renaming is good, apps can depend on one or the other or both. If the package name is just "icu" version 4.4, then disable renaming.
Regards,
Steven (ICU)