从静态库中去除/删除调试符号和存档名称



我有一个静态库(C++)(比如,libmylib_DARWIN.alibmylib_LINUX.a2 个架构)在我的 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) ....

我想从这个库中删除调试符号和存档的文件名。我想知道是否有一种方便的方法可以在不更改我的构建配置的情况下做到这一点。

  • Mac 上的strip会同时为 DARWIN 和 Linux 构建的库执行此操作吗?有什么我应该注意的吗?
  • strip似乎没有删除存档文件名

关于SO也有一些类似的问题;但是,我发现的那些涉及iOS,Objective C,不谈论多平台,也不提及存档名称。

此脚本实现了 Sigismondo 的建议(解压缩存档,单独剥离每个对象文件,将它们重命名为1000.o1001.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

最新更新