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

Reply via email to