我想链接两个共享库,这两个库具有相同的符号名称但符号类型不同。
例如,有 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并使用该变量
有没有办法可以链接两个具有相同符号名但符号类型不同的共享库?