强制未使用的函数在共享库中导出

时间:2016-07-13 10:02:46

标签: c++ gcc

在top.cpp和top.h中定义的

printme()和getme()

我在main函数

中的test.cpp(test cpp文件)中使用了printme()函数
g++34 -c top.cpp -fPIC    
ar rcs libtop.a top.o    
g++34 -c test.cpp -fPIC

g++34 -shared -o ltop.so -ltop -L. -fPIC   

getme未在ltop.so

中导出

如何强制在ltop.so中导出getme函数 当我做nm ltop.so
它没有显示getme符号
我想强迫这个

注意:文件可以有多个未使用的函数,如 - getme()
我想强制所有人导出到所以

2 个答案:

答案 0 :(得分:2)

不要使用静态库来创建动态库。而是直接使用组件对象文件:

g++34 -shared -o ltop.so -fPIC top.o

原因是当您在编译二进制文件时指定带有-l的库时,只会拾取编译行中较早的未解析的外部符号。在你的情况下,这没什么,所以从libtop.so

创建libtop.a时没有任何内容

UPDATE:作为替代方案,如果原始目标文件不再可用,则使用--whole-archive链接器选项强制它包含静态库中的所有内容,而不是只是未解决的外部因素:

g++34 -shared -o ltop.so -fPIC -Wl,--whole-archive ./libtop.a

或者:

g++34 -shared -o ltop.so -fPIC -Wl,--whole-archive -L. -ltop

答案 1 :(得分:2)

通常,当链接到静态库时,只有静态库中包含未解析符号的模块最终会被链接。

这里,由于没有未解析的getme()引用,因此该模块不会从静态库链接。解决方案是明确地解决它。

一个次要的复杂因素是C ++符号名称错误。有必要弄清楚getme()函数的错位符号名称是什么。最简单的方法是使用nm命令查看库:

$ nm libtop.a

top.o:
0000000000000000 T _Z5getmei

好的,因此受损的符号名称为_Z5getmei-u链接器标志强制对链接时使用的指示符号进行未解析的引用:

g++ -shared -o ltop.so -L. -ltop -Wl,-u -Wl,_Z5getmei

-u手册的文档位于ld手册页中。这包括共享库中的模块:

$ nm ltop.so | grep getme
0000000000000680 T _Z5getmei