【问题标题】:Explaining a difference between g++ on SUSE SLED 11 SP2 versus Ubuntu 14.04解释 SUSE SLED 11 SP2 与 Ubuntu 14.04 上的 g++ 之间的区别
【发布时间】:2016-08-11 16:37:35
【问题描述】:

我正在将 Ubuntu 14.04 操作系统提升到构建标准。目标是替换现有的 SUSE SLED 11 SP2 构建器。但是我遇到了一个我很难解释的错误。

产生错误的构建命令是

g++
-o
out/linux-rel/bin/PrtReporter
-fstack-protector
-m32
-Wl,-rpath,/local/out/linux-rel/bin
-l:libz.so.1.2.8
out/linux-rel/obj-static/prt/CrashReporter.o
out/linux-rel/obj-static/prt/LibArchiveWrapper.o
out/linux-rel/obj-static/utilities/RTSConfigUtilities.o
-Lout/linux-rel/bin
-Lout/linux-rel/bin
out/linux-rel/bin/libcurl.so
out/linux-rel/bin/libcurl.a
out/linux-rel/bin/libarchive.a
-lpthread
-lrt
-lxml2

在 Ubuntu 上,这会导致链接错误。 g++ 无法从 libz 中找到符号。

要解决这个问题,我可以简单地将 -l:libz.so.1.2.8 放在 out/linux-rel/bin/libarchive.a 之后。这“看起来”是正确的,因为它允许 libarchive.a 找到 libz 符号。即我认为应该在依赖它们的库之后列出。

但我不知道为什么这在 Ubuntu 上是必要的。相同的命令在 SLED 上运行良好。

有什么想法吗?

【问题讨论】:

标签: ubuntu linker g++ linker-errors suse


【解决方案1】:

g++ 无法从 libz 中找到符号。

你在链接行的错误位置有libz,并且Ubuntu配置他们的gcc默认将--as-needed传递给链接器。

您可以运行readelf -d PrtReporter | grep libz 并验证libz.so 是否丢失(即加载程序甚至不会尝试加载它)。

要修复,添加-Wl,--no-as-needed 或(更好)移动libz 到链接线上的正确位置。

【讨论】:

  • 仅供参考:可以使用 -Xlinker --no-as-needed 在 g++ 上设置此标志。 -Xlinker 允许您将命令传递给 ld。
  • @ShaneGannon 您应该使用-Wl,--no-as-needed 而不是-Xlinker正确的修复仍然是将libz移动到链接线上的正确位置。
  • 你是对的。但我正在采取婴儿步骤。我想在不做太多修改的情况下让当前版本在 Ubuntu 上运行。一旦完成,我们就可以修复这个明显的缺陷。 PS:我假设 -Wl 和 -Xlinker 是等价的。
  • @ShaneGannon -Wl-Xlinker 在某种程度上是等价的,但许多编译器都支持 -Wl-Xlinkder 是 GCC 特有的)。
猜你喜欢
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2017-07-23
  • 2014-02-06
  • 1970-01-01
  • 2010-12-03
相关资源
最近更新 更多