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

共享库“混淆” - 去除内部 api 上的所有符号/字符串;符号路径以 PN4、N2、N3、N4 开头

如何解决共享库“混淆” - 去除内部 api 上的所有符号/字符串;符号路径以 PN4、N2、N3、N4 开头

我正在集成一个特定的专有库——它以静态库的形式提供(比如 libBla.a)。他们对“混淆”有很多要求——这意味着在链接到他们的库之后,我们必须从生成的生产库中删除所有提及他们的方法甚至命名空间的内容

到目前为止一切顺利.. strip 和很少的 cmake 行可以删除符号。 nm -D libsomething.so | grep -i bla 不返回任何命中。

但是在库上运行字符串时,我仍然在那里看到那些符号。 但是这些“符号”是很奇怪的东西,即使是 demanler 也无法分解。

strings libsomething.so | grep -i bla
PN4something_namespace13BlaObserverIN3Bla_namespace6IBlaClassINS1_8BlaClassInterfaceINS1_13BlaClass14ImplementationEEENS1_10BlaClassInterfaceINS1_15BlaClass14ImplementationEEEE14BlaClassInterfaceINS1_12IBlaAnotherClassENS1_14IBlaClassListenerEEEEE
PN4something_namespace13BlaObserverIN3Bla_namespace16IBlaClassINS1_21BlaAnotherClass14ImplementationEE9BlaListenerInterfaceEEE
PN4something_namespace13BlaObserverIN3Bla_namespace8BlaClassInterfaceINS1_13BlaClass14ImplementationEE9BlaListenerInterfaceEEE
....

那么这些以 PN4 / N2 / N3 / N4 开头的字符串/符号是什么?它们来自哪里?

为什么 c++ demangler 不能翻译它们?

解决方法

经过一番折腾,我发现这些符号来自 RTTI 用法。 我们使用模板来集成它们的类,在我们的一些方法中,我们想区分使用 typeid 的模板类类型,这很丑陋,但它解决了一些变通方法。

解决方案是停止使用 typeid 并将其添加到 cmake:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。