微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在共享库.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 举报,一经查实,本站将立刻删除。