Я изменил бы несколько вещей о.
find_code() {
# assign all arguments (not just the first ${1}) to MATCH
# so find_code can be used with multiple arguments:
# find_code errorCode
# find_code = 1111
# find_code errorCode = 1111
MATCH="$@"
# For each file that has a match in it (note I use `-l` to get just the file name
# that matches, and not the display of the matching part) I.e we get an output of:
#
# srcdir/matching_file.c
# NOT:
# srcdir/matching_file.c: errorCode = 1111
#
grep -lr "$MATCH" ${SRCDIR} | while read file
do
# echo the filename
echo ${file}
# and grep the match in that file (this time using `-h` to suppress the
# display of the filename that actually matched, and `-n` to display the
# line numbers)
grep -nh -A5 -B5 "$MATCH" "${file}"
done
}
Прямой (возможно, очевидный) ответ заключается в том, что путь поиска для библиотек, которые вы смотрите с LDD
, не включают в себя каталоги, где расположены собственные зависимости библиотеки. Обычно, если зависимости библиотеки не обнаружены в системных стандартных местах, библиотека должна была быть построена с указанным путем прогона (с помощью переменной среды $ ld_run_path
или соответствующая опция линкера). В противном случае библиотеки не будут найдены позже во время выполнения, так как вы нашли с LDD
.
Так почему же Whunderbird работает в любом случае, несмотря на эту «проблему»?
Есть несколько способов того, что необходимые библиотеки могут быть найдены в любом случае, несмотря на отсутствующий путь прогона:
$ ld_library_path
устанавливается во время выполнения и поставляет список дополнительных каталогов для поиска. DLOPEN ()
, заданную полный путь. Thunderbird, кажется, использует последние из этих методов. Я посмотрел на вспышку
. Выход из того, что он делает при запуске, и, похоже, это делает это:
DEGEDUNDLIBS.LIST
, найденный в этом каталоге. DLOPEN ()
. libldap60.so
, которые вы упомянули, «предварительно загруженные», и другие библиотеки, которые требуют, чтобы они не должны их найти еще раз. Обратите внимание, что порядок или файлы, перечисленные в DEGNEDUNDLIBS.LIST
.
Причина Thunderbird делает это так, чтобы каталог, в котором он расположен, не должен быть закреплен в приложении или в путь прогона любого из его внутренних библиотек.
Я не знаю, что делает Java, но это без сомнения, что-то похожее.