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,
fmt::v6::internal::buffer&, 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 ,
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: 000108a0 283 FUNCWEAK DEFAULT 11 void
fmt::v5::internal::sprintf_format(double,
fmt::v5::internal::basic_buffer&, fmt::v5::core_format_specs)
305: 000109c0 291 FUNCWEAK DEFAULT 11 void
fmt::v5::internal::sprintf_format(long double,
fmt::v5::internal::basic_buffer&, fmt::v5::core_format_specs)
238: 000108a0 283 FUNCWEAK DEFAULT 11 void
fmt::v5::internal::sprintf_format(double,
fmt::v5::internal::basic_buffer&, fmt::v5::core_format_specs)
244: 000109c0 291 FUNCWEAK DEFAULT 11 void
fmt::v5::internal::sprintf_format(long double,
fmt::v5::internal::basic_buffer&, fmt::v5::core_format_specs)
$ nm /usr/lib64/libfmt.so | c++filt | grep sprintf_format
000108a0 W void fmt::v5::internal::sprintf_format(double,
fmt::v5::internal::basic_buffer&, fmt::v5::core_format_specs)
000109c0 W void fmt::v5::internal::sprintf_format(long
double, fmt::v5::internal::basic_buffer&, 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