首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将模板实例化导出为非弱?

如何将模板实例化导出为非弱?
EN

Stack Overflow用户
提问于 2021-05-12 15:25:21
回答 1查看 175关注 0票数 0

C++模板函数作为弱符号导出,以绕过“一个定义规则”(related question)。在为每个用例显式实例化函数的情况下,是否有一种方法将符号导出为非弱符号?

示例用例:

代码语言:javascript
运行
复制
// foo.hpp
template<typename T>
void foo();

// All allowed instantiations are explicitly listed.
extern template void foo<int>();
extern template void foo<short>();
extern template void foo<char>();
代码语言:javascript
运行
复制
// foo.cpp
template<typename T>
void foo()
{
  // actual implementation
}

// All explicit instantiations.
template void foo<int>();
template void foo<short>();
template void foo<char>();

当我用GCC或ICC编译上面的代码时,它们被标记为弱:

代码语言:javascript
运行
复制
$ nm foo.o
                 U __gxx_personality_v0
0000000000000000 W _Z3fooIcEvv
0000000000000000 W _Z3fooIiEvv
0000000000000000 W _Z3fooIsEvv

有什么办法可以防止这种情况吗?由于它们实际上是确定的,我不希望它们成为替代者。

EN

Stack Overflow用户

回答已采纳

发布于 2021-05-13 03:53:12

objcopy支持--weaken选项,但您希望相反。

它还支持--globalize-symbol,但这似乎对弱符号没有影响:

代码语言:javascript
运行
复制
gcc -c t.cc
readelf -Ws t.o | grep _Z3fooI

    14: 0000000000000000     7 FUNC    WEAK   DEFAULT    7 _Z3fooIiEvv
    15: 0000000000000000     7 FUNC    WEAK   DEFAULT    8 _Z3fooIsEvv
    16: 0000000000000000     7 FUNC    WEAK   DEFAULT    9 _Z3fooIcEvv

objcopy -w --globalize-symbol _Z3fooI* t.o t1.o && 
readelf -Ws t1.o | grep _Z3fooI

    14: 0000000000000000     7 FUNC    WEAK   DEFAULT    7 _Z3fooIiEvv
    15: 0000000000000000     7 FUNC    WEAK   DEFAULT    8 _Z3fooIsEvv
    16: 0000000000000000     7 FUNC    WEAK   DEFAULT    9 _Z3fooIcEvv

为了不被吓倒,我们可以先将符号本地化,然后使它们全球化:

代码语言:javascript
运行
复制
objcopy -w -L _Z3fooI* t.o t1.o &&
objcopy -w --globalize-symbol _Z3fooI* t1.o t2.o &&
readelf -Ws t2.o | grep _Z3fooI

    14: 0000000000000000     7 FUNC    GLOBAL DEFAULT    7 _Z3fooIiEvv
    15: 0000000000000000     7 FUNC    GLOBAL DEFAULT    8 _Z3fooIsEvv
    16: 0000000000000000     7 FUNC    GLOBAL DEFAULT    9 _Z3fooIcEvv

符号学:符号现在被强烈地定义了。

我想要解决的问题是链接时间太慢,我想把链接器的工作减少到最小。

如果这使得链接器做的工作更少(我对此表示怀疑),我会考虑链接器中的一个bug --如果符号被定义了一次,那么对于链接器来说,这个定义是强的还是弱的,都不重要。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67506579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档