Убрать / удалить символы отладки и имена архивов из статической библиотеки
У меня есть статическая библиотека (C++) (скажем, libmylib_DARWIN.a
а также libmylib_LINUX.a
для 2 архитектур) скомпилирован на моем Mac с использованием Clang (Apple LLVM version 9.0.0 (clang-900.0.39.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