如何从静态库中剥离私有成员函数符号

How to strip private member function symbols from static lib

提问人:Connagh Jacobi 提问时间:10/24/2023 更新时间:10/24/2023 访问量:42

问:

我正在寻找是否可以从静态库中剥离所有私有成员函数符号。我的类如下所示:

页眉:

#define PUBLIC __attribute__ ((visibility ("default")))
#define LOCAL  __attribute__ ((visibility ("hidden")))

namspace my_namespace {

class my_class {
public:
  PUBLIC my_class();
  PUBLIC ~my_class();
  PUBLIC void do_something();
private:
  LOCAL float internal_func();
  LOCAL inline float inline_func();
  float member_var_;
}

}

CPP:

namspace my_namespace {
my_class::my_class(){member_var_ = 0;}
...
void my_class::do_something(){
  ... somecode 
  member_var_ = internal_func();
  member_var_ += inline_func();
}

float my_class::internal_func() {
   ... some code
}

inline float my_class::inline_func(){
  ... some code 
}

}

我的实际代码要复杂得多,其中包含许多函数和私有成员变量,几乎每个函数都使用一些成员变量,因此我无法将它们声明为静态或将它们从类中删除。

我使用编译标志,内联标志在已内联但我仍然能够从文件中 grep 出来的函数上工作正常。-fvisibility=hidden -fvisibility-inlines-hiddeninternal_funclibmy_class.a

使用 GNU Strip 也不会删除符号,我仍然能够将私有函数 grep 出来。--strip-unneeded

我错过了什么吗?还是这些符号无法剥离?

C++ gcc c++17 静态库

评论

0赞 Ext3h 10/24/2023
您需要完全禁用对重新定位的支持(而不仅仅是 fpic!),以便能够删除所有符号,否则链接器仍然需要所有这些符号。在任何情况下,您未内联/声明为编译单元范围的内容都不能丢弃。
0赞 Ext3h 10/24/2023
但总的来说:剥离静态库仍然有些毫无意义。即使是可见性属性等,在链接到共享对象之前也不会生效。
2赞 Ext3h 10/24/2023
如果你想有机会隐藏一些东西:公共接口、纯虚拟方法、工厂方法和接口的实现被放置在编译单元内的匿名命名空间中,只有工厂方法可见,其他人看不到。

答: 暂无答案