【问题标题】:static library used in lower version gcc低版本 gcc 中使用的静态库
【发布时间】:2013-08-24 20:56:00
【问题描述】:

我遇到了一个奇怪的问题。

(1)我首先通过gcc(版本2.96-110)将模块构建到静态库xxx.a。 xxx.a 中的一些代码是这样的:

const char * const str = “hello world”
void fun()
{
printf(“%s”, str);
return;
}

(2)然后我通过 gcc(版本 2.96-98)将 xxx.a 与我的程序 EXE 链接。在 EXE 中,API fun() 被调用。

(3)当我运行EXE时,输出的是“llo world”,而不是“hello world”。太奇怪了。

是gcc版本不同造成的吗?

【问题讨论】:

  • 看起来像 ABI 差异。也许在更高版本上启用了某种堆栈粉碎保护?尝试禁用堆栈保护。
  • 可能,但也可能是因为您的 GCC 版本中的错误。你知道它是 4.8 版吗?
  • GCC 2.96?您是 1990 年代的时间旅行者吗?
  • 我们的产品从 1990 年代开始流行 ^_^

标签: c++ c gcc static-libraries


【解决方案1】:

看起来像堆栈损坏,可能是非官方的GCC版本造成的。如果你有源代码,为什么不使用最新的GCC编译库?

【讨论】:

    【解决方案2】:

    总是不能使用旧的 G++ 来链接而不是编译任何对象或库,所以你正在做的事情不太可能适用于任何两个 GCC 版本,尤其是非官方的、不稳定的2.96系列。

    在 2013 年加入我们并至少使用 GCC 4.4

    【讨论】:

      【解决方案3】:

      注意there was never any official GCC 2.96 release:

      我们注意到一些 GNU/Linux 发行版目前正在发布 ``GCC 2.96''。

      我们想指出,GCC 2.96 不是正式的 GCC 版本,也不会有这样的版本。相反,GCC 2.96 一直是我们最终将成为 GCC 3.0 的开发分支的代号。

      GCC 3.0 是一项重大工作,涉及从 GCC 2.95 更改 ABI。由于“GCC 2.96”是基于 GCC 3.0 开发的快照,ABI 可能在不断变化,您正在遭受使用开发快照作为生产编译器的副作用。

      【讨论】:

      • +1,虽然我猜“hello world”不是生产代码;)
      • 感谢您的回答。对我来说很有价值。
      猜你喜欢
      • 2014-09-21
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多