Linkin两个共享库具有相同的符号名称但不同的符号类型

时间:2018-04-10 05:41:23

标签: c linux g++ export shared-libraries

我想链接两个共享库,这两个库具有相同的符号名称但符号类型不同。

例如,有 liba.so libb.so 库,它们包含两个文件a.c / b.c和b_wrapper.c / a_wrapper.c

交流转换器

__thread int var;

a_wrapper.cpp

extern __thread int var;

liba.so

$ gcc -fPIC -c a.c -o a.o 
$ g++ -fPIC -c a_wrapper.cpp -o a_wrapper.o -std=c++11
$ g++ -fPIC -shared  -o liba.so a.o a_wrapper.o -std=c++11

b.c

int var;

b_wrapper.c

extern int var;

libb.so

$ gcc -fPIC -c b.c -o b.o 
$ g++ -fPIC -c b_wrapper.cpp -o b_wrapper.o -std=c++11
$ g++ -fPIC -shared  -o libb.so b.o b_wrapper.o -std=c++11

然后将liba.so和libb.so链接到top.c文件,我收到一些错误消息

$ g++ top.cpp -ldl -o exe ./liba.so ./libb.so  -std=c++11

/usr/bin/ld: var: TLS definition in ./liba.so section .tdata mismatches non-
TLS definition in ./libb.so section .bss
./libb.so: error adding symbols: Bad value
collect2: error: ld returned 1 exit status

我认为问题是因为ac中的var是在线程本地存储 bss(tbss) 中定义的,但是bc中的var是在正常 bss 中定义。

我已阅读此帖Linking two shared libraries with some of the same symbols 并尝试-Bsymbolic--version-script-fvisibility=hidden,但所有这些方法都无法实现我的目标。

-Bsymbolic:我在创建liba.so和libb.so时使用它,但是当我链接liba.so和libb.so时,我仍然得到上面描述的相同错误消息

--version-script-fvisibility=hidden:我不能让var变量成为一个文件(ac)的本地变量,因为其他文件(a_wrapper.cpp)将是extern并使用该变量

有没有办法可以链接两个具有相同符号名但符号类型不同的共享库?

0 个答案:

没有答案