0

尝试对在 AIX 5.3 上编译的可执行文件或共享库执行 objdump 时,我多次收到此错误消息。对于这台机器上的任何其他可执行文件,它都可以正常工作。这个可执行文件也会在运行时崩溃(在字符串赋值时)。

我不确定它是否重要,但在链接过程中我有几个警告,例如: ld: 0711-224 警告:重复符号:非虚拟 thunk 到 XYZ::~XYZ() 整个可执行文件是直接从 .o 文件构建的(和一个外部库,但我确信它很好)。

有些东西告诉我它可以连接到弱符号,但我不知道如何解决这个问题。知道可能出了什么问题,或者我可以检查什么以继续进行此操作吗?

我还尝试将所有 cpp 文件包含在一个大文件中,然后编译它。我仍然遇到分段错误,但在其他地方(现在在 g_strXXXXX.erase() - 擦除全局字符串)。部分堆栈跟踪如下所示:

(...)

.#3 0x101d8534 in __static_initialization_and_destruction_0(int, int) (__initialize_p=1, __priority=65535) at ../../licserver/someclass1.cpp:4

.#4 0x101d8df0 in GLOBAL _I_fc_softc () at ../../shared/someclass1.cpp:225

.#5 0x103c81fc in GLOBAL _FI_licserver_unittest ()

.#6 0xd03aadb0 in mod_init1 () from /usr/lib/libc.a(shr.o)

.#7 0xd03aacc4 in __modinit () from /usr/lib/libc.a(shr.o)

.#8 0x100001d4 in __start () (gdb) GLOBAL _I_fc_softc

所以看起来 libc 或 libstdc++ 有问题?

4

1 回答 1

0

你实际上是对的,约翰,非常感谢!我的代码存在“静态初始化订单惨败”问题。用函数调用替换所有可疑的全局对象后,问题似乎得到了解决。

所以我改变了:

CFoo g_F;

进入:

CFoo& GetF() {
  static CFoo F;
  return F;
}

现在很好。对于这部分代码,我不需要多线程支持,否则我猜我会使用单例(代码太多,无法摆脱全局变量)。

于 2011-08-08T15:28:49.550 回答