C++ 从静态库中剥离/删除调试符号和存档名称
我有一个静态库(C++)(比如说,C++ 从静态库中剥离/删除调试符号和存档名称,c++,static-libraries,debug-symbols,otool,C++,Static Libraries,Debug Symbols,Otool,我有一个静态库(C++)(比如说,libmylib_DARWIN.a和libmylib_LINUX.a,用于两种体系结构)在我的Mac上使用clang编译(Apple LLVM 9.0.0版(clang-900.0.39.2) 现在,有两个问题: 静态库(使用当前生成配置)包含调试符号 它还显示用于存档的对象文件的名称 otool-Iv libmylib_DARWIN.a Archive:libmylib_DARWIN.a libmylib_DARWIN.a(firstobjectfile.cp
libmylib_DARWIN.a
和libmylib_LINUX.a
,用于两种体系结构)在我的Mac上使用clang编译(Apple LLVM 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)
..
- Mac上的
会为达尔文和LINUX构建的库都这样做吗?还有什么我应该注意的吗strip
似乎不会删除存档文件名strip
在这方面也有一些类似的问题;但是,我发现的那些涉及iOS、Objective C、不谈论多平台、也不提及归档名称。这个脚本实现了Sigismondo的建议(解压归档文件,单独剥离每个对象文件,重命名它们
1000.o
、1001.o
,等等,然后重新打包)。ar CRU
的参数可能因您的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
只是咖喱;“我想删除这两个…”-为什么?调试符号和文件名都披露了我在法律上不应该共享的信息。对于文件名,技术上可以通过重命名来解决(这非常不方便),我想从我的家庭操作系统中去除多个体系结构的调试符号-这也是一种方便。使用
ar
提取原始.o文件,分别对其运行strip
,重命名,使用ar
或ld
重新打包。感谢您的实施。这个脚本肯定会删除调试符号并更改文件名,但现在我无法像以前那样链接到它。未定义符号-由于引用现在未定义…很抱歉,请尝试将strip行更改为strip-d$p
以仅剥离调试符号。该脚本在Mac上用于Mac版本的库。然而,它拒绝在LINUX上工作。然而,它也适用于LINUX for LINUX库。这解决了90%的问题。如果没有更好的办法,我就接受。谢谢谢谢你的剧本!我在macOS上唯一需要做的补充就是只剥离.o文件(如果[[$p==*.o]];那么
),并使用“-S”标志(-d表示其他内容):剥离-S$p