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

时间:2018-04-03 13:10:36

标签: c++ static-libraries debug-symbols otool

我有一个静态库(C ++)(比如,libmylib_DARWIN.alibmylib_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) ....

  3. 我想从此库中删除两者调试符号和归档文件名。我想知道是否有一种方便的方法没有更改我的构建配置。

    • Mac上的strip会为DARWIN和LINUX构建的库做吗?还有什么我应该注意的吗?
    • strip似乎无法删除存档文件名

    在SO上有一些类似的问题;但是,我发现的那些与iOS,Objective C有关,不讨论多平台,也没有提到存档名称。

1 个答案:

答案 0 :(得分:1)

此脚本实现了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