【问题标题】:ELDK gcc linker error in ld.so.1ld.so.1 中的 ELDK gcc 链接器错误
【发布时间】:2012-02-01 11:55:58
【问题描述】:

我在 Ubuntu 机器上安装了 ELDK-3.1,运行良好。

在另一台运行 64 位 OpenSuse 12.1 的机器上,我克隆了 ELDK 安装,并且在一段时间内它运行良好。

现在,当我尝试配置我的项目时,我看到:

configure: error: C compiler cannot create executables
See `config.log' for more details

日志显示:

configure:3411: ppc-linux-gcc    conftest.c  >&5
/opt/ELDK-3.1/usr/bin/../lib/gcc-lib/ppc-linux/3.3.3/../../../../ppc-linux/bin/ld: warning: ld.so.1, needed by /opt/ELDK-3.1//usr/../ppc_8xx/lib/libc.so.6, not found (try using -rpath or -rpath-link)
/opt/ELDK-3.1//usr/../ppc_8xx/lib/libc.so.6: undefined reference to `_dl_lookup_versioned_symbol_skip@GLIBC_PRIVATE'
...

文件ld.so.1libc.so.6在同一目录中。

s -l /opt/ELDK-3.1//usr/../ppc_8xx/lib/ld.so.1 
lrwxrwxrwx 1 root root 11 Jan 31 11:43 /opt/ELDK-3.1//usr/../ppc_8xx/lib/ld.so.1 -> ld-2.3.1.so

据我所知,我正确定义了所有需要的环境,并尝试使用与 Ubuntu 框中完全相同的构建系统进行构建(该项目是“自动制作的”)。

所以我写了一个脚本,试图模仿我自动制作的 configure 所做的一切:

#!/bin/bash


if [ ! -f confdefs.c ]; then
    cat > confdefs.c << EOF
/* confdefs.h */
#define PACKAGE_NAME "xyz"
#define PACKAGE_TARNAME "xyz"
#define PACKAGE_VERSION "1.00"
#define PACKAGE_STRING "xyz 1.00"
#define PACKAGE_BUGREPORT "<contact@company>"
#define PACKAGE_URL ""
#define PACKAGE "xyz"
#define VERSION "1.00"
/* end confdefs.h.  */

int
main ()
{

;
return 0;
}
EOF
fi

ARCH=powerpc
export CROSS_COMPILE=ppc_8xx
TOOLCHAIN=ppc-linux-
TOOLCHAIN_ROOT=/opt/ELDK
LD=`which ${TOOLCHAIN}ld`
CC=`which ${TOOLCHAIN}gcc`
GCC=$CC
export CFLAGS="-Wall -g -I${TOOLCHAIN_ROOT}/ppc_8xx/usr/include/"
export CPPFLAGS=$CFLAGS
# export LDFLAGS="-shared"

$CC $CFLAGS $LDFLAGS confdefs.c -o confdefs

这给了我与configure 完全相同的错误。

另一方面,如果我取消注释 export LDFLAGS="-shared" 行,它会完美构建!

> ls -l confdefs
-rwxr-xr-x 1 myself users 16136 Fev  1 09:52 confdefs
> file confdefs
confdefs: ELF 32-bit MSB shared object, PowerPC or cisco 4500, version 1 (SYSV), dynamically linked, not stripped

这里有人可以告诉我我缺少什么的任何线索,以便我的项目在一个盒子上正常工作,而不是在另一个盒子上工作吗?

谢谢!

【问题讨论】:

  • 尝试在您的项目上再次运行 automake 和 autoconf。顺便说一句,.so 扩展名意味着它是一个共享对象,您应该启用“-shared”以正确使用这些共享对象。
  • 您在切换到 Fedora 16 x86_64 时遇到了与我相同的错误。到目前为止,我们通过将以下符号链接“ld.so.1 -> ../../../ppc_8xx/lib/ld.so.1”添加到 eldk-3.1/usr/ppc-linux/lib 找到了解决方案我怀疑 F15 和 F16 之间的环境发生了一些变化。对于 OpenSUSE (11->12) 也是如此。
  • 嘿,谢尔盖,请发表一个答案,这样我就可以选择了。您的解决方法对我有用。这是有道理的,因为链接器脚本指向类似SEARCH_DIR("/usr/ppc-linux/lib") 的东西,但我仍然不明白为什么它可以在一个发行版上运行,而不能在另一个发行版上运行。我想这是关于他们的开发包(自动工具或类似的东西)的差异。谢谢!

标签: c gcc cross-compiling embedded-linux powerpc


【解决方案1】:

我不能 100% 确定它可以解决所有问题,但它对我们有用。

我们发现符号链接 "ld.so.1 -> ../../../ppc_8xx/lib/ld.so.1" 到 eldk-3.1/usr/ppc-linux/lib 解决了链接错误。

我怀疑 F15 和 F16 之间的环境发生了一些变化。对于 OpenSUSE (11->12) 也是如此。 还针对 Fedora https://bugzilla.redhat.com/show_bug.cgi?id=754695 提交了错误,该错误因故意 ABI 更改而终止。

【讨论】:

  • 这对我很有帮助,谢谢。它也适用于旧版本的 ELDK。
猜你喜欢
  • 1970-01-01
  • 2020-05-07
  • 2013-11-17
  • 1970-01-01
  • 2012-02-15
  • 2016-05-24
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多