В некоторых случаях кажется, что переключение происходит быстрее, чем запуск ldd -r, в чем причина этого?
Рассмотрим простой случай: main.o
называет foo()
от libfoo.so
, и связано, как это:
gcc main.o -L. -lfoo
Объем работы ld
должен сделать: обнаружить, что foo
вызывается, считают, что это определенный в libfoo.so
, сделано. Не очень много работы.
Теперь предположим, что libfoo.so
сам подключен к libbar.so
и называет 10000000 различных символов.
Что делает ldd -r
? Сначала он будет выглядеть в a.out
для любых неразрешенных символов (есть только один: foo
) и найти определение для него в libfoo.so
(легко). Затем он должен рассмотреть каждый неопределенный символ в libfoo.so
и найти определение для всех из них (в libbar.so
). Это примерно в 1000000 раз сложнее. Повторите для libbar.so
и каждой другой библиотеки, связанной с ней.
Не следует тогда удивлять, что при вышеуказанных условиях ld
займет значительно меньше времени, чем ldd -r
.
Но 'ld' также проверяет вызовы с' libfoo' на 'libbar', не так ли? – tohava