如何从共享库中删除*ALL*未使用的符号?

use*_*514 3 c c++ shared-libraries

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

// 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"
Run Code Online (Sandbox Code Playgroud)

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

无论我做什么,海湾合作委员会将始终保持void Foo::bar()hello周围.有没有办法在不破坏编译器的情况下删除这些符号?(是的,我现在正在考虑它!)

谢谢!

Die*_*Epp 6

用旗帜编译-ffunction-sections.然后链接-Wl,--gc-sections.我认为LTO也可以实现这一点,我不确定细节.

请注意,dylib中的所有公共符号都被视为实时符号.只有隐藏的符号才会被剥离.

  • @ user2662514:此解决方案背后的解释是链接器不在符号级别检查,而是在部分级别(包含可能包含许多符号的部分)进行检查.通过将`-ffunction-sections`传递给gcc,你可以指示编译器在它自己的一个部分中发出每个函数; 你应该期望它显着减慢链接阶段,但另一方面,链接器现在可以从库中删除更多的代码. (2认同)