【问题标题】:duplicate symbol and application crash重复符号和应用程序崩溃
【发布时间】:2012-09-19 16:44:07
【问题描述】:

我正在 AIX 上编译一个程序。它编译成功但给出以下警告:

ld: 0711-224 WARNING: Duplicate symbol: .basename
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.

我试图在“common.o”文件中找到这个符号。

nm -X64 -f common.o | fgrep '.basename'

.basename            T        3776         120

但是当在可执行文件上找到这个符号时,我发现以下内容:

nm -X64 CCF | fgrep '.basename'
.basename            T  4295089984         120
.basename            T  4295174672
.basename            t  4295174672          40
  • 我可以显示包含此符号的库名称吗?

  • 这个符号是否出现在我的源文件中? (可能听起来很傻,但我真的不知道)

我已经找到了这个问题的答案,它可以在源头中追踪。

  • 我应该采取哪些步骤来消除此警告? 这个重复的符号也会导致应用程序崩溃吗? 就我而言,它正在崩溃。

【问题讨论】:

  • 你接受链接器的建议了吗? Use the -bloadmap or -bnoquiet option to obtain more information.
  • 我没有尝试,但我更改了源代码中的函数名称。现在重复符号警告不再存在。

标签: c warnings aix nm duplicate-symbol


【解决方案1】:

根据man pagebasename() 有两个版本,一个是 POSIX,一个是 GNU,看起来你正在链接它们。您将需要根据您的需要选择一个并抑制另一个。手册页解释了如何操作。

由于它们的行为不同,为其中一个编译的代码可能会在链接器/加载器将其绑定到另一个时崩溃。如果您可以选择编译器,选择非 gcc 的编译器可能会有所帮助。

【讨论】:

  • 感谢您的回复。此警告是否会导致程序崩溃?
  • 可能。为一个库版本编译的代码在运行时链接到另一个版本时可能会崩溃。当您混合来自不同 gcc/g++ 版本的代码和库时,这种情况在 C++ 中总是会发生。
  • 感谢兰德尔的回复。删除了这个警告,但似乎其他一些区域也导致内存泄漏:(在 AIX 上
  • 没问题,QMG。祝你的内存泄漏好运。如果您发现我的回答有用,请考虑支持或接受它。 :)
猜你喜欢
  • 2023-03-21
  • 2015-12-30
  • 1970-01-01
  • 2010-11-30
  • 2016-06-17
  • 2018-03-16
  • 2018-10-07
  • 2012-05-20
相关资源
最近更新 更多