我正在寻找限制导出到 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/