Minor versions conflict with each other and misreport their versions
General
Other Data
General
Other Data
Description
The ICU libraries are linked such that the shared library dependencies are referenced by major version only, yet the shared libraries themselves are installed with separate minor versions. If you install multiple minor versions with the same major version, then all minor versions end up depending on the other ICU libraries of the last major version installed.
In other words, if you install 63.1, then 63.2, then open libicui18n.so.63.1, it will pull in libicuuc.so.63.2 and libicudata.63.2. This results in libicui18n.so.63.1 reporting that it’s version is 63.2.
Repro:
If you install 63.1 on linux with --enable-rpath, you get (edited for clarity):
$ ls -l /path/to/libicui18n.so.63* /path/to/libicui18n.so.63 -> libicui18n.so.63.1 /path/to/libicui18n.so.63.1
$ ls -l /path/to/libicuuc.so.63* /path/to/libicuuc.so.63 -> libicuuc.so.63.1 /path/to/libicuuc.so.63.1
$ ls -l /path/to/libicudata.so.63* /path/to/libicudata.so.63 -> libicudata.so.63.1 /path/to/lib/libicudata.so.63.1
Now, open libicudata.so.63.1 and it reports that it’s version is 63.2.
Activity
Markus Scherer
December 8, 2022 at 3:43 AM
This does not look like a valid use case. A new minor version should replace the previous installation of the same major version, since it's a maintenance release/update with bug fixes.
The ICU libraries are linked such that the shared library dependencies are referenced by major version only, yet the shared libraries themselves are installed with separate minor versions. If you install multiple minor versions with the same major version, then all minor versions end up depending on the other ICU libraries of the last major version installed.
In other words, if you install 63.1, then 63.2, then open libicui18n.so.63.1, it will pull in libicuuc.so.63.2 and libicudata.63.2. This results in libicui18n.so.63.1 reporting that it’s version is 63.2.
Repro:
If you install 63.1 on linux with --enable-rpath, you get (edited for clarity):
$ ls -l /path/to/libicui18n.so.63*
/path/to/libicui18n.so.63 -> libicui18n.so.63.1
/path/to/libicui18n.so.63.1
$ ls -l /path/to/libicuuc.so.63*
/path/to/libicuuc.so.63 -> libicuuc.so.63.1
/path/to/libicuuc.so.63.1
$ ls -l /path/to/libicudata.so.63*
/path/to/libicudata.so.63 -> libicudata.so.63.1
/path/to/lib/libicudata.so.63.1
$ ldd /path/to/libicui18n.so.63.1
libicuuc.so.63 => /path/to/libicuuc.so.63
libicudata.so.63 => /path/to/libicudata.so.63
All good so far. Now install 63.2. Then you get:
$ ls -l /path/to/libicui18n.so.63*
/path/to/libicui18n.so.63 -> libicui18n.so.63.2
/path/to/libicui18n.so.63.1
/path/to/libicui18n.so.63.2
$ ls -l /path/to/libicuuc.so.63*
/path/to/libicuuc.so.63 -> libicuuc.so.63.2
/path/to/libicuuc.so.63.1
/path/to/libicuuc.so.63.2
$ ls -l /path/to/libicudata.so.63*
/path/to/libicudata.so.63 -> libicudata.so.63.2
/path/to/libicudata.so.63.1
/path/to/libicudata.so.63.2
$ ldd /path/to/libicui18n.so.63.2
libicuuc.so.63 => /path/to/libicuuc.so.63
libicudata.so.63 => /path/to/libicudata.so.63
Now, open libicudata.so.63.1 and it reports that it’s version is 63.2.