gcc 从C++静态库中剥离除API之外的所有内容?

kognpnkq  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(122)

我有一个静态库,我需要删除不需要的符号。只有两个面向外部的公共API函数。
我正在努力剥离归档文件,以便在库中只暴露外部API。如果我使用类似于:

objcopy --keep-global-symbol=some-mangled-cpp-symbol-name liblibrary.a liblibrary.a && ranlib liblibrary.a

...然后当我试图链接新的归档文件时,我得到一个链接器错误:

$ g++ -I $(pwd)/install/include -L$(pwd)/build -o main test_app.cpp -llibrary.a
/usr/bin/ld: error in ...liblibary.a(filename.cpp.o)(.eh_frame); no .eh_frame_hdr table will be created

代码运行时后跟segfault。
有什么修复方法或替代技术来去除所有无关的符号吗?

2izufjch

2izufjch1#

在静态库中,没有“面向外部的公共API函数”。任何没有声明为static的函数都是库的一部分,就编译器和链接器而言。任何代码都可以声明这些函数并链接到您的库,从而访问它们。
C作为一种语言不涉及“库”;它涉及“翻译单元”(.cpp文件)。因此它的作用域仅限于每个人或仅限于此TU。
然而,C
20有一种工具方法来声明函数,这些函数对于所有意图和目的来说都是库内部的:模块范围内但未导出的名称不能被该模块外部的代码声明和访问。因此,从理论上讲,可以剥离模块本身不使用的任何非导出的模块范围代码。

相关问题