Убрать / удалить символы отладки и имена архивов из статической библиотеки

У меня есть статическая библиотека (C++) (скажем, libmylib_DARWIN.a а также libmylib_LINUX.a для 2 архитектур) скомпилирован на моем Mac с использованием Clang (Apple LLVM version 9.0.0 (clang-900.0.39.2) если имеет какое-либо отношение).

Сейчас есть две проблемы:

  1. Статическая библиотека (использующая текущую конфигурацию сборки) содержит символы отладки
  2. Он также показывает имена объектных файлов, которые использовались для архива

    otool -Iv libmylib_DARWIN.a

    Archive : libmylib_DARWIN.a libmylib_DARWIN.a(firstobjectfile.cpp.o) libmylib_DARWIN.a(secondobjectfile.cpp.o) ....

Я хотел бы удалить как символы отладки, так и архивные имена файлов из этой библиотеки. Интересно, есть ли удобный способ сделать это без изменения конфигурации моей сборки.

  • будут strip на Mac сделать это для библиотек DARWIN и LINUX? На что я тоже должен обратить внимание?
  • strip похоже не удаляет архивные имена файлов

Есть несколько похожих вопросов по SO; однако те, которые я нашел, имеют дело с iOS, Objective C, не говорят о мультиплатформенности и не упоминают имена архивов.

1 ответ

Решение

Этот скрипт реализует предложение Сигизмондо (распаковывает архив, разбирает каждый объектный файл по отдельности, переименовывает их 1000.o, 1001.oи т. д. и перепаковывает). Параметры для ar crus может варьироваться в зависимости от вашей версии ar,

#!/bin/bash
# usage: repack.sh file.a

if [ -z "$1" ]; then
    echo "usage: repack file.a"
    exit 1
fi

if [ -d tmprepack ]; then
    /bin/rm -rf tmprepack
fi

mkdir tmprepack
cp $1 tmprepack
pushd tmprepack

basename=${1##*/}

ar xv $basename
/bin/rm -f $basename
i=1000
for p in *.o ; do
    strip -d $p
    mv $p ${i}.o
    ((i++))
done

ar crus $basename *.o
mv $basename ..

popd
/bin/rm -rf tmprepack
exit 0
Другие вопросы по тегам