Создайте tar-архив файлов, перечисленных командой ldd, включая символические ссылки и исполняемый файл.

Вопрос или проблема

Как создать файл 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. Давайте разберем, как мы можем решить эту проблему с помощью цепочки команд оболочки.

Практическое применение

  1. Получение списка зависимостей без неполадок формата: Вместо передачи вывода команды ldd напрямую в tar, стоит предварительно очистить его, извлекая только нужные пути к библиотекам.

  2. Сохранение бинарного файла: Не забывайте, что сам исполняемый файл a.out также должен быть включен в архив.

  3. Символические ссылки: Использовать ключ -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 выдаст ошибку, если не сможет найти какой-либо из файлов.

  • Целевая платформа: Создаваемый архив может быть использован для переноса приложения и его зависимостей на другую систему той же архитектуры.

Следуя такому подходу, можно создать архив с бинарным файлом и всеми его зависимостями, сохраняя структуру ссылок, что позволит трансферировать и запускать приложение на других аналогичных системах.

Оцените материал
Добавить комментарий

Капча загружается...