Gcc - 为什么lambdas在发布版本中不被剥离

时间:2016-01-14 18:07:01

标签: c++ lambda linker llvm-clang

我正在使用xCode 7在MacOSX上创建.component软件包。我试图摆脱所有调试符号和库符号以进行发布配置。 我在xCode中设置了所有合适的选项(例如Strip Debug SymbolsStrip styleall symbolssymbols hidden by default等。

不幸的是,在编译和链接的component文件中仍然可以看到一些符号。

所以我使用strip -x -S mybundle.component从外部删除它们。它几乎可以工作但不适用于lambdas来电者。如果任何方法正在使用lambda表达式,则生成的二进制文件具有名称以及所有被调用者和调用者,直到lambda本身在链接器中#34;半混淆"像ZN18MyClassName8MetodNameEP9BSFirstParamP7SecondParamE3$_1这样的风格 所以它看起来像链接器问题?

举个例子,一些代码:

class AClass {

   public:
       void methodCallingCallbackInTheEnd();
       std::function<void(C*, D*)> myCallback;
}

class BClass {

   AClass a;
   CClass *c;
   DClass *d;

   public:
       methodOfClassB() {  
          a->callback = [c,d] (C* c, D* d) {
              //do something with c and d objects
          };

          a->methodCallingCallbackInTheEnd();
       }
}

class EClass {
    public:
        EMethodNotVisibleInBinary();
}

所以,作为编译和链接的效果,我可以在二进制文件中看到A和B类的一些条目,即使参数类型为C和D也是如此:

ZN18AClass8callbackE34$_2

接下来是关于回调本身的一些信息,例如:

ZN18BClass8methodOfClassBEP9BSCClassP7DClassE3$_1

有没有办法摆脱它们?为什么他们出现? EClassEMethodNotVisibleInBinary等当然不可见。 .component文件中没有这样的字符串。

这对我来说非常重要,我当然不想混淆那些部分。

有什么想法吗?

0 个答案:

没有答案