Как мне перечислить символы в файле .so

Теперь как метод расширения:

public static class LinqExt
{
    public static IEnumerable<TResult> LeftOuterJoin<TLeft, TRight, TKey, TResult>(this IEnumerable<TLeft> left, IEnumerable<TRight> right, Func<TLeft, TKey> leftKey, Func<TRight, TKey> rightKey,
        Func<TLeft, TRight, TResult> result)
    {
        return left.GroupJoin(right, leftKey, rightKey, (l, r) => new { l, r })
             .SelectMany(
                 o => o.r.DefaultIfEmpty(),
                 (l, r) => new { lft= l.l, rght = r })
             .Select(o => result.Invoke(o.lft, o.rght));
    }
}

Используйте, как обычно, вы используете join:

var contents = list.LeftOuterJoin(list2, 
             l => l.country, 
             r => r.name,
            (l, r) => new { count = l.Count(), l.country, l.reason, r.people })

Надеемся, что это сэкономит вам некоторое время.

434
задан Andrey Nikolov 10 January 2019 в 11:53
поделиться

5 ответов

Стандартный инструмент для списка символов nm, можно использовать его просто как это:

nm -g yourLib.so

, Если Вы хотите видеть символы библиотеки C++, добавьте "-C" опцию, какой demangle символы (это - намного больше читаемого demangled).

nm -gC yourLib.so

, Если Ваш .so файл находится в формате эльфа, у Вас есть две опции:

Любой objdump (-C также полезно для demangling C++):

$ objdump -TC libz.so

libz.so:     file format elf64-x86-64

DYNAMIC SYMBOL TABLE:
0000000000002010 l    d  .init  0000000000000000              .init
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 free
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 __errno_location
0000000000000000  w   D  *UND*  0000000000000000              _ITM_deregisterTMCloneTable

Или использование readelf:

$ readelf -Ws libz.so
Symbol table '.dynsym' contains 112 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 0000000000002010     0 SECTION LOCAL  DEFAULT   10
     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND free@GLIBC_2.2.5 (14)
     3: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __errno_location@GLIBC_2.2.5 (14)
     4: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable
519
ответ дан Steve Gury 10 January 2019 в 21:53
поделиться
  • 1
    Хорошо это похоже на it' s не совсем столь простой вопрос, как я надеялся. Я создам новый вопрос позже сегодня вечером объяснение, почему я хочу обнаружить это и что для. Большое спасибо. – 4imble 8 January 2011 в 03:47

Попытайтесь добавить-l к флагам nm для получения источника каждого символа. Если библиотека компилируется с информацией об отладке (gcc-g), это должно быть исходным файлом и номером строки. Как Konrad сказал, объектный файл / статическая библиотека, вероятно, неизвестна в этой точке.

11
ответ дан Adam Mitz 10 January 2019 в 21:53
поделиться

Можно использовать nm -g инструмент от binutils набора инструментальных средств. Однако их источник не всегда легко доступен. и я не на самом деле даже уверен, что эта информация может всегда получаться. Возможно objcopy показывает дополнительную информацию.

РЕДАКТИРОВАНИЕ/: название инструмента, конечно nm. Флаг -g используется для показа только экспортируемых символов.

9
ответ дан Konrad Rudolph 10 January 2019 в 21:53
поделиться
  • 1
    Хотя это не рекомендуется, я думаю, что это может быть полезно, когда Вы хотите отобразить код, который является, работал (например, за учебным руководством JavaScript) – karlipoppins 6 July 2010 в 00:55

Если ваш файл .so имеет формат elf, вы можете использовать программу readelf для извлечения символьной информации из двоичного файла. Эта команда предоставит вам таблицу символов:

readelf -Ws /usr/lib/libexample.so

Вы должны извлекать только те, которые определены в этом файле .so , а не в библиотеках, на которые он ссылается. В этом случае седьмой столбец должен содержать число. Вы можете извлечь его с помощью простого регулярного выражения:

readelf -Ws /usr/lib/libstdc++.so.6 | grep '^\([[:space:]]\+[^[:space:]]\+\)\{6\}[[:space:]]\+[[:digit:]]\+'

или, как было предложено Каспином ,:

readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}';
80
ответ дан 22 November 2019 в 23:09
поделиться
objdump -TC /usr/lib/libexample.so
52
ответ дан 22 November 2019 в 23:09
поделиться