Вопрос или проблема
Как создать файл tar.gz
, содержащий все зависимости данного бинарного файла, включая символические ссылки и бинарный файл a.out
. Вот что я попробовал сделать
ldd some-proj/build/a.out | tar -hcvf some-proj.tar.gz -T -
Вывод ldd
linux-vdso.so.1 (0x00007ffd54a88000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007faa62b15000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007faa62ae7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007faa628d3000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007faa62651000)
/lib64/ld-linux-x86-64.so.2 (0x00007faa633b7000)
Ошибка
tar: \tlinux-vdso.so.1 (0x00007ffefeae7000): Cannot stat: No such file or directory
tar: \tlibstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f09e249b000): Cannot stat: No such file or directory
tar: \tlibgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f09e246d000): Cannot stat: No such file or directory
tar: \tlibc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f09e2259000): Cannot stat: No such file or directory
tar: \tlibm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f09e1fd7000): Cannot stat: No such file or directory
tar: \t/lib64/ld-linux-x86-64.so.2 (0x00007f09e2d3d000): Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
Ответ или решение
Создание архива tar.gz, содержащего все зависимости двоичного файла a.out, включая символические ссылки и сам бинарный файл, может быть нетривиальной задачей из-за специфики вывода команды ldd
и способа использования команд tar
и оболочки. Рассмотрим теорию, примеры и практическое применение для решения этой задачи.
Теория
Команда ldd
используется для отображения зависимостей динамической компоновки исполняемого файла. Она выводит список библиотек, необходимых для работы программы, а также пути к ним. Проблема заключается в том, что ldd
выдает результат в формате, который напрямую не подходит для использования командой tar
. Более того, вам необходимо учесть символические ссылки, которые зачастую и есть сами библиотеки.
Если мы хотим создать архив tar.gz, содержащий все зависимости и бинарный файл, нужно правильно парсить вывод ldd
и обязательно включать символические ссылки.
Примеры
Сообщенные вами ошибки показывают, что команда tar не может найти файлы после обработки вывода ldd
. Это связано с тем, что вывод команды не является списком файлов, готовым для передачи в tar
. Давайте разберем, как мы можем решить эту проблему с помощью цепочки команд оболочки.
Практическое применение
-
Получение списка зависимостей без неполадок формата: Вместо передачи вывода команды
ldd
напрямую вtar
, стоит предварительно очистить его, извлекая только нужные пути к библиотекам. -
Сохранение бинарного файла: Не забывайте, что сам исполняемый файл a.out также должен быть включен в архив.
-
Символические ссылки: Использовать ключ
-h
вtar
помогает включать символические ссылки, а не перемещать по ним к их оригиналам.
# На основе вывода ldd создаем текстовый файл с путями к зависимостям
ldd some-proj/build/a.out | grep '=>' | awk '{print $3}' > libs.txt
# Включаем также исполняемый файл a.out в список
echo "some-proj/build/a.out" >> libs.txt
# Создаем архив tar.gz
tar -hczf some-proj.tar.gz -T libs.txt
Уточнение шагов:
-
ldd some-proj/build/a.out: Этот шаг выдает список библиотек и их пути. Формат, в котором выводятся библиотеки, требует обработки для выделения самих путей.
-
grep ‘=>’ | awk ‘{print $3}’: Здесь мы используем
grep
для фильтрации строк, содержащих ‘=>’, что указывает на ссылки на библиотеки.awk '{print $3}'
помогает выделить только пути, например, ‘/lib/x86_64-linux-gnu/libstdc++.so.6’. -
Сохранение путей в файл: Мы сохраняем список файлов в текстовый файл
libs.txt
, включая путь к самому бинарному файлу. -
tar -hczf some-proj.tar.gz -T libs.txt: Команда
tar
создаст сжатый архив, используя список из файлаlibs.txt
. Ключ-h
обеспечивает включение символических ссылок.
Дополнительные советы
-
Обработка linux-vdso: Файл
linux-vdso.so.1
не является действительной библиотекой в файловой системе, поэтому к нему не стоит пытаться обращаться при создании архива. -
Проверка доступности библиотек: Убедитесь, что пути в
libs.txt
доступны и существуют. Иначеtar
выдаст ошибку, если не сможет найти какой-либо из файлов. -
Целевая платформа: Создаваемый архив может быть использован для переноса приложения и его зависимостей на другую систему той же архитектуры.
Следуя такому подходу, можно создать архив с бинарным файлом и всеми его зависимостями, сохраняя структуру ссылок, что позволит трансферировать и запускать приложение на других аналогичных системах.