我正在集成一个特定的专有库,它以静态库的形式提供(比如libBla.a);混淆"-这意味着在链接到它们的库之后,我们必须从生成的生产库中删除所有对它们的方法甚至名称空间的提及。
到目前为止还不错。。条形和少量cmake线可以去除符号。nm -D libsomething.so | grep -i bla
不返回任何命中。
然而,当在库上运行字符串时,我仍然可以在那里看到这些符号。但是这些";符号";是一些奇怪的东西,即使是德马格勒也无法分解。
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")