Hello,
On Thu, 12 Dec 2019, Adam Carter wrote:
>Kodi has been dead for a while;
>/usr/lib64/kodi/kodi-x11: symbol lookup error: /usr/lib64/kodi/kodi-x11:
>undefined symbol:
>_ZN3fmt2v68internal14sprintf_formatIeEEPcT_RNS1_6bufferIcEENS1_13sprintf_specsE
>
>How do i go about troubleshooting this?
First of all, decode that C++ symbol with c++filt:
$ echo
_ZN3fmt2v68internal14sprintf_formatIeEEPcT_RNS1_6bufferIcEENS1_13sprintf_specsE
| c++filt
char* fmt::v6::internal::sprintf_format<long double>(long double,
fmt::v6::internal::buffer<char>&, fmt::v6::internal::sprintf_specs)
Now, with a bit of guesswork and tabbing,
$ grep -r sprintf_format /usr/include/fmt/
/usr/include/fmt/format.h:void sprintf_format(Double, internal::buffer &,
core_format_specs);
/usr/include/fmt/format.h: internal::sprintf_format(value, buffer,
normalized_spec);
/usr/include/fmt/format-inl.h:void sprintf_format(Double value,
internal::buffer &buf,
It looks like the middle one, from /usr/include/fmt/format.h, i.e.
internal::sprintf_format is the culprit. And
$ qfile /usr/include/fmt/format.h
dev-libs/libfmt: /usr/include/fmt/format.h
gives us the package it belongs to. Guessing from the symbol name,
kodi wants v6 of that library. I've got dev-libs/libfmt-5.3.0:0/5
installed, and on a hunch, running "symgrep"[1] (or nm | grep) on the lib
itself gives:
$ symgrep internal::sprintf_format /usr/lib64/libfmt.so
275: 00000000000108a0 283 FUNC WEAK DEFAULT 11 void
fmt::v5::internal::sprintf_format<double>(double,
fmt::v5::internal::basic_buffer<char>&, fmt::v5::core_format_specs)
305: 00000000000109c0 291 FUNC WEAK DEFAULT 11 void
fmt::v5::internal::sprintf_format<long double>(long double,
fmt::v5::internal::basic_buffer<char>&, fmt::v5::core_format_specs)
238: 00000000000108a0 283 FUNC WEAK DEFAULT 11 void
fmt::v5::internal::sprintf_format<double>(double,
fmt::v5::internal::basic_buffer<char>&, fmt::v5::core_format_specs)
244: 00000000000109c0 291 FUNC WEAK DEFAULT 11 void
fmt::v5::internal::sprintf_format<long double>(long double,
fmt::v5::internal::basic_buffer<char>&, fmt::v5::core_format_specs)
$ nm /usr/lib64/libfmt.so | c++filt | grep sprintf_format
00000000000108a0 W void fmt::v5::internal::sprintf_format<double>(double,
fmt::v5::internal::basic_buffer<char>&, fmt::v5::core_format_specs)
00000000000109c0 W void fmt::v5::internal::sprintf_format<long double>(long
double, fmt::v5::internal::basic_buffer<char>&, fmt::v5::core_format_specs)
Ahhaa, we've got fmt::v5::* and not fmt::v6::*! And yes, on this box it's:
$ ls -l /usr/lib64/libfmt.so*
lrwxrwxrwx 1 [..] /usr/lib64/libfmt.so -> libfmt.so.5
lrwxrwxrwx 1 [..] /usr/lib64/libfmt.so.5 -> libfmt.so.5.3.0
-rwxr-xr-x 1 [..] /usr/lib64/libfmt.so.5.3.0
So, you should rebuild kodi. So it gets linked to your installed
libfmt. And/or update your libfmt to v6.
Oh, and BTW, if you don't have the depended on package installed,
searching for the missing symbol online usually gives some hints of
where it comes from.
BTW: what do revdep-rebuild and 'emerge @preserved-rebuild' make of the
situation?
HTH,
-dnh
[1]
==== /usr/local/bin/symgrep ====
#!/bin/sh
exec readelf -sW "$2" | c++filt | grep "$1"
====
--
> You know, if we're gonna make this whole Christian society thingie,
> shouldn't we at least wait until all the Christians agree? -- cdr
I'd suggest waiting until Hell freezes over. It'll be a shorter wait.
-- S. Lamble