我正在寻找限制导出到 Linux 静态库(存档)的 C 符号数量的方法。我想将这些限制为仅属于库官方 API 一部分的符号。我已经使用“static”将大多数函数声明为静态,但这将它们限制在文件范围内。我正在寻找一种方法来限制图书馆的范围。
我可以使用 Ulrich Drepper 中的技术对共享库执行此操作如何编写共享库 http://people.redhat.com/drepper/dsohowto.pdf,但我无法将这些技术应用于静态档案。在他早期的图书馆设计的良好实践 http://people.redhat.com/drepper/goodpractice.pdf论文中,他写道:
唯一的可能性是合并所有需要的目标文件
使用“ld -r”将某些内部资源合并为一个,然后限制符号
由该组合目标文件导出。 GNU 链接器有以下选项:
就这样做。
谁能帮我发现这些选项可能是什么?我在“strip -w -K prefix_*”方面取得了一些成功,但这感觉很野蛮。理想情况下,我想要一个可以与 GCC 3 和 4 一起使用的解决方案。
Thanks!
我不相信 GNU ld 有任何这样的选择;乌尔里希一定是指objcopy
,它有很多这样的选项:--localize-hidden
, --localize-symbol=symbolname
, --localize-symbols=filename
.
The --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
So bar()
不再从对象中导出(即使它仍然存在并且可用于调试)。您还可以删除bar()
全部与objcopy --strip-unneeded
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)