2015-06-14 1 views
0

У меня есть exe, в котором ни один из кодов не изменился, но я боюсь, что он ссылается на символы, которые больше не существуют на его общих объектах. Я нашел два способа, чтобы проверить, что:Linux ELF. Почему нормальное соединение работает быстрее, чем «ldd -r»?

  • Run ldd -r
  • восстановить связь ехе

В некоторых случаях это, кажется, как перекомпоновки быстрее, чем бег ldd -r, что является причиной этого?

ответ

0

В некоторых случаях кажется, что переключение происходит быстрее, чем запуск 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.

+0

Но 'ld' также проверяет вызовы с' libfoo' на 'libbar', не так ли? – tohava

Смежные вопросы