为什么g++会生成多个(弱)相似符号?

4
我正在查看 nm -C 的输出。
0804a86a W ForkMessageHandler::ForkMessageHandler()
0804a86a W ForkMessageHandler::ForkMessageHandler()
0804a6fa T ForkMessageHandler::~ForkMessageHandler()
0804a698 T ForkMessageHandler::~ForkMessageHandler()
0804a698 T ForkMessageHandler::~ForkMessageHandler()
0804a800 W MultiMessageHandler::MultiMessageHandler()
0804a800 W MultiMessageHandler::MultiMessageHandler()
0804a84c W MultiMessageHandler::~MultiMessageHandler()
0804a81c W MultiMessageHandler::~MultiMessageHandler()
0804a81c W MultiMessageHandler::~MultiMessageHandler()

为什么g++会生成许多相似的符号,弱符号的目的是什么?
编辑:这是针对最终可执行文件而言,而不是.o文件。ForkMessageHandler在.cpp文件中被定义,没有人包含它的头文件 - 但有几个头文件包含了它的基类。

1
这是来自一个目标文件还是同时来自多个目标文件? - AnT stands with Russia
2个回答

6

这些是默认构造函数和自动生成的析构函数。它们将作为弱符号在包含类定义的每个编译单元中生成,以确保至少有一个可用。

它们之所以是弱符号,是为了避免链接过程中的冲突,因为包括头文件的每个目标文件都会包含类定义。


0

我的理解是,GCC使用弱符号生成inline函数,因此对于任何未内联的函数调用,它可以将其链接到其中一个定义并丢弃其他定义。


但是为什么要多个定义 - 一个不足以吗? - leeeroy
我并不太清楚,因为我对目标文件格式并不是特别熟悉。一个可能就足够了,但也许没有人愿意去担心这个问题,因为当所有链接完成后,它将被减少到最多一个。另外,可能还有一些我没有考虑到的更重要的原因。 - Michael Burr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接