gpt4 book ai didi

c++ - 链接器。如何同时定义和取消定义符号?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:16 25 4
gpt4 key购买 nike

$ nm --demangle /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/libsupc++.a  | grep "__cxxabiv1::__class_type_info::~__class_type_info"

给出以下输出:

0000000000000000 T __cxxabiv1::__class_type_info::~__class_type_info()
0000000000000000 T __cxxabiv1::__class_type_info::~__class_type_info()
0000000000000000 T __cxxabiv1::__class_type_info::~__class_type_info()
U __cxxabiv1::__class_type_info::~__class_type_info()
U __cxxabiv1::__class_type_info::~__class_type_info()

那么,如何解释这个输出?

  1. 这里是符号的多个定义(三个 T)- 它怎么可能?为什么链接器生成的库违反了 ODR?目的是什么?为什么它们都有相同(且奇怪)的地址 (0000000000000000)?
  2. 同一个符号如何同时被定义(T)和未定义(U)?

最佳答案

静态库(存档文件,.a)本质上是单个 .o 文件的集合(加上一些索引信息,以便链接器可以找到 .o 它需要的文件)。其中一些 undefined symbol 与定义它们的对象位于不同的对象中。如果您查看 nm 的完整输出,这一点就很清楚了。 (或者使用 -o 标志到 nm。)

您有多个已定义符号的原因是 demangle 不是一对一的操作。在我的 libsupc++ 拷贝中,这三个定义是:

0000000000000000 T _ZN10__cxxabiv117__class_type_infoD0Ev
0000000000000000 T _ZN10__cxxabiv117__class_type_infoD1Ev
0000000000000000 T _ZN10__cxxabiv117__class_type_infoD2Ev

为什么有几个符号都分解为析构函数?他们是 destructors for different situations . gcc 使用 Itanium ABI for C++,其 name mangling rules are described here.

关于c++ - 链接器。如何同时定义和取消定义符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32518527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com