6

我有一个代码需要编译到共享库并从中删除所有未使用的代码,但我找不到合适的解决方案。这是一个简单的例子:

// test.cpp, compiled with GCC -fPIC -shared -fvisibility=hidden
#include <stdio.h>
class Foo {
    void bar();
};
void Foo::bar() { printf("hello"); } // unused and should be removed
// I'm using printf("hello") so I can detect the symbols with `strings`

__attribute__((visibility("default"))) void test() {} // this function is "used"

-fvisibility=hidden使其默认隐藏所有功能,并且我手动将公共功能标记为__attribute__((visibility("default"))). static但是,除非标记为(显然我不能对 C++ 方法执行此操作),否则隐藏函数不会被删除。

无论我做什么,GCC 都会一直void Foo::bar()存在hello。有没有办法在不破解编译器的情况下删除这些符号?(是的,我正在考虑这一点!)

谢谢!

4

1 回答 1

7

用标志编译-ffunction-sections。然后与 链接-Wl,--gc-sections。我认为这也可以通过 LTO 实现,我不确定细节。

请注意,dylib 中的所有公共符号都被认为是活动的。只有隐藏的符号会以这种方式被剥离。

于 2013-08-07T23:47:29.807 回答