Теперь как метод расширения:
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 })
Надеемся, что это сэкономит вам некоторое время.
Стандартный инструмент для списка символов 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
Попытайтесь добавить-l к флагам nm для получения источника каждого символа. Если библиотека компилируется с информацией об отладке (gcc-g), это должно быть исходным файлом и номером строки. Как Konrad сказал, объектный файл / статическая библиотека, вероятно, неизвестна в этой точке.
Можно использовать nm -g
инструмент от binutils набора инструментальных средств. Однако их источник не всегда легко доступен. и я не на самом деле даже уверен, что эта информация может всегда получаться. Возможно objcopy
показывает дополнительную информацию.
РЕДАКТИРОВАНИЕ/: название инструмента, конечно nm
. Флаг -g
используется для показа только экспортируемых символов.
Если ваш файл .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}';