c - 限制 Linux 静态库中的符号

标签 c linux gcc static

我正在寻找限制导出到 Linux 静态库(存档)的 C 符号数量的方法。我想将这些限制为仅属于库官方 API 一部分的那些符号。我已经使用“static”将大多数函数声明为静态的,但这将它们限制在文件范围内。我正在寻找一种方法来限制图书馆的范围。

我可以使用 Ulrich Drepper 的 How to Write Shared Libraries 中的技术为共享库执行此操作,但我无法将这些技术应用于静态文件。在他之前的 Good Practices in Library Design纸上,他写道:

The only possibility is to combine all object files which need certain internal resources into one using 'ld -r' and then restrict the symbols which are exported by this combined object file. The GNU linker has options to do just this.

谁能帮我看看这些选项可能是什么?我在“strip -w -K prefix_*”方面取得了一些成功,但这感觉很野蛮。理想情况下,我想要一个适用于 GCC 3 和 4 的解决方案。

谢谢!

最佳答案

我不相信 GNU ld 有任何这样的选择; Ulrich 一定是指 objcopy,它有很多这样的选项:--localize-hidden--localize-symbol=symbolname --localize-symbols=文件名.

--localize-hidden 特别允许人们对公开哪些符号进行非常精细的控制。考虑:

int foo() { return 42; }
int __attribute__((visibility("hidden"))) bar() { return 24; }

gcc -c foo.c
nm foo.o
000000000000000b T bar
0000000000000000 T foo

objcopy --localize-hidden foo.o bar.o
nm bar.o
000000000000000b t bar
0000000000000000 T foo

因此 bar() 不再从对象中导出(即使它仍然存在并且可用于调试)。您还可以将 bar()objcopy --strip-unneeded 一起删除。

关于c - 限制 Linux 静态库中的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/393980/

相关文章:

linux - 移动和重命名 Xml 文件

c++ - GCC 和 Clang 不同意 lambda 的 constexpr-ness?

c - 使用 %*[^|] 分隔符时 sscanf() 是否从标准输入中删除字符?

c++ - 编译器会做什么

linux - 如何自动登录 Linux 服务器并在网站上运行 git fetch/pull?

linux - Sed 4.2.1 的编译问题

android - 如何在 Android.mk 中添加 C-only 选项?

C:如何在二维字符数组的每个空间中放置一个字符串?

c - 我想用C语言将两个变量初始化为一个二维数组

升级到 Catalina 10.15 后无法在 Mac 上编译 C 程序