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

时间:2010-02-05 23:11:29

标签: c++ gcc linker

我正在查看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文件中定义,没有人包含它的标题 - 但是有几个包含其基类的标题。

2 个答案:

答案 0 :(得分:3)

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

它们弱的原因是为了避免链接过程中的冲突,因为类定义将出现在每个目标文件中,包括它定义的头文件。

答案 1 :(得分:0)

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