如何在共享库.so中剥离DWARF调试信息

问题描述

我正在使用C ++构建一个可在Android上使用的共享库,即我的工作结果是一个标准的linux .so文件。该库是使用clang编译的,最初我打算创建一个没有任何调试信息的发布版本,将其包含在我的Android应用程序中,然后就可以使用了。从技术上讲,一切正常。

但是,这样做有一个缺点:如果没有调试信息,则由于我的共享库崩溃而创建的调用栈几乎没有用,因为它不再包含对源代码的引用。

现在,Google Play offers a way提交不包含调试信息的共享库以及包含调试信息的同一库的第二个副本。没有调试信息的库将打包到Android应用中,并安装在最终用户设备上。带有调试信息的第二个副本位于Google Play内,即未安装在最终用户设备上。 Google Play使用该副本将崩溃时收到的调用堆栈转换为包含对源代码的引用的调用堆栈。

但是,对我而言,我无法弄清楚如何剥离共享库的调试信息。调试信息为DWARF格式版本2。

我按如下方式编译库:

clang ... -g2 -gdwarf-2 -O3 ...

因此,代码已优化,但包含调试信息。使用objdump -g libwhatever.so检查生成.so文件会发现很多DWARF信息。

使用编译同一库

clang ... -g0 -O3

并使用objdump -g libwhatever.so进行检查,可以确认所包含的DWARF信息要少得多。这是最终目标。

因此,问题是如何去除上面显示的第一个clang调用所编译的DWARF调试信息,以便最终获得与第二个clang调用相同的结果?

我尝试过的事情:

strip --strip-all libwhatever.so

这根本没有效果,即输出与输入相同。

objcopy --strip-debug libwhatever.so

strip相同,输出与输入相同。这是上面链接中的建议,但我无法使其正常工作。

我知道运送包含调试信息的库可能不是真正的问题。但是,我试图在这里获得更多的见解,以便更好地了解工作流程。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)