Развертывание библиотеки против неиспользованных прямых зависимостей - PullRequest
0 голосов
/ 07 мая 2018

Я попытался выяснить, какие библиотеки Qt Assistant нужны для развертывания. Я использовал ldd в Linux для этого.

Я обнаружил, что ldd предоставляет опцию -u для "печати неиспользуемых зависимостей". Это звучит так, как будто существует какая-то зависимость, которая (не всегда) необходима для развертывания. Итак, я запустил еще две ldd команды:

~$ ldd -u ~/Qt/5.10.0/gcc_64/bin/assistant 
Unused direct dependencies:
        /lib/x86_64-linux-gnu/libQt5Network.so.5
        /lib/x86_64-linux-gnu/libQt5Sql.so.5
        /lib/x86_64-linux-gnu/mesa/libGL.so.1
        /lib/x86_64-linux-gnu/libpthread.so.0
        /lib/x86_64-linux-gnu/libm.so.6
        /lib/x86_64-linux-gnu/libgcc_s.so.1

~$ ldd -r -u ~/Qt/5.10.0/gcc_64/bin/assistant 
Unused direct dependencies:
        /lib/x86_64-linux-gnu/libQt5Network.so.5
        /lib/x86_64-linux-gnu/mesa/libGL.so.1
        /lib/x86_64-linux-gnu/libpthread.so.0
        /lib/x86_64-linux-gnu/libm.so.6
        /lib/x86_64-linux-gnu/libgcc_s.so.1

Я пытался выяснить, что происходит, но не до конца понял.

Мои вопросы:

  • Что такое неиспользованная прямая зависимость (это звучит противоречащим меня)?
  • Можно ли узнать, действительно ли Qt Assistant требует неиспользованного прямая зависимость (кроме запуска и ожидания ошибки)?
  • В чем именно разница между приведенными выше командными строками? Почему
    первый список libQt5Sql а второй нет?

1 Ответ

0 голосов
/ 24 мая 2018

Это печать из-за ключа -u. в справочной странице ldd

-u, --unused
          Print unused direct dependencies.  (Since glibc 2.3.4.)

Что такое неиспользованная прямая зависимость (мне это кажется противоречивым)?

Это ИМХО -> библиотека, которую вы создали бинарную, которая была не нужна. т.е. * +1008 *

gcc -L<LD_PATH> -Wall -o assistant assistant.c -lA -lB -lC

будет перечислять все A B C как зависимости, но они не могут быть фактически использованы в двоичном виде. Главным образом причина - универсальные LDFLAGS в Makefile.

Можно ли узнать, действительно ли Qt Assistant требует неиспользованного прямая зависимость (кроме запуска и ожидания ошибки)?

НЕТ Я думаю, что его можно использовать только тогда, когда вы будете вызывать определенную функцию. также есть шанс, что вы можете использовать это, не увидит ошибку. Тем не менее, если вы решите это сделать. есть безумный путь. список всех вызванных функций и затем проверка, какие библиотеки нужны. (нет уверенности в этом, но я думаю, что на основе аналогичной логики ldd печатает это.) в соответствии с man-страницей ldd может работать в двоичном формате. Так что в принципе может быть сценарий, который вы упомянули. но не экстенсивно.

 Be aware,  however,  that  in some circumstances, some versions of
 ldd may attempt to obtain the dependency information by directly 
 executing  the program.  Thus, you should never employ ldd on an
 untrusted executable,
 since this may result in the execution  of  arbitrary  code.

В чем именно разница между приведенными выше командными строками? Зачем первый список libQt5Sql, а второй нет?

Разница составляет -r

       -r, --function-relocs
          Perform relocations for both data  objects  and  functions,  and
          report any missing objects or functions (ELF only).

Короче говоря, он обрабатывает загруженные библиотечные функции. Рекомендуется использовать ldd -u -r в этой ошибке на redhat. Чтобы узнать больше об обработке перемещения, прочитайте этот документ Oracle.

...