c - 是否可以从静态库中删除死代码?

标签 c linker clang

我想通过指定入口点从静态库中删除死代码。

例如:

lib1.c

int foo() { return 0; }
int bar() { return 0; }

lib2.c

#include "lib1.h"
int entry() {
    return foo();
}

new.a(lib1.a + lib2.a)

libtool -static -o new.a lib1.a lib2.a

我希望 new.a 包含 int bar() 因为它在 lib1 的入口点中未使用.a,而且我不打算直接使用 lib2.a

这可能吗?

最佳答案

如果使用 -ffunction-sections (可能还有 -fdata-sections)进行编译并使用 -Wl,--gc-sections 进行链接>,未引用的函数将被删除。这与它们一开始就不存在有微妙的不同(例如,如果 bar 包含对其他函数或数据的引用,则可能会导致包含它们的文件被拉入考虑,可能会导致新的全局因素或覆盖弱定义)但对于大多数目的来说足够接近。

另一方面,正确的方法是不要在同一个翻译单元(源文件)中定义可以独立使用的函数。将它们分成单独的文件,这会自动工作,无需特殊选项。

关于c - 是否可以从静态库中删除死代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57901361/

相关文章:

c - Unix 域套接字错误,sendmsg : No buffer space available

c - c 中使用 TCP 的多用户聊天服务器。如何向多个客户端发送数据?

c - 从 eth0 向 eth1 发送多播

java - 如何制定图像压缩算法?

c - 如何查找外部函数定义

c++ - 在 Linux 上将 GraphicsMagick++ 与 clang libc++ 链接起来

c++ - 两个静态库,两个不同的 vector 实现,链接器会做什么?

c++ - 为什么 "void operator delete(void* ptr, std::size_t size) noexcept;"没有在 gcc 4.9.0 中定义?

c++ - Clang 何时添加了对共享对象的可见性支持?

编译时函数 ptr 取消引用