【问题标题】:compling glibc: /glibc-2.7/w/elf/ld.so: No such file or directory正在编译 glibc:/glibc-2.7/w/elf/ld.so:没有这样的文件或目录
【发布时间】:2015-11-05 15:42:20
【问题描述】:

我要在超级计算机中心的目录下安装一个软件,但是我不能使用sudo,root,甚至apt-get,yum...这个软件需要glibc2.7,所以我必须手动安装gcc和glibc(因为我无法更改内置 gcc 的路径以找到 glibc)。

gcc好像安装成功了:

[geosign@node117 ~/binutils/bin]$ gcc -v
Using built-in specs.
Target: x86_64-unknown-linux-gnu
Configured with: /public/home/geosign/software/gcc/configure -prefix=/public/home/geosign/gcc --with-gmp=/public/home/geosign/Gcc --with-   mpfr=/public/home/geosign/Gcc --with-mpc=/public/home/geosign/Gcc --with-ppl=/public/home/geosign/ppl --with-cloog=/public/home/geosign/ppl --enable-threads=posix CFLAGS=-I/public/home/geosign/ppl/lib:/public/home/geosign/Gcc/lib CPPFLAGS=-I/public/home/geosign/ppl/lib:/public/home/geosign/Gcc/lib CXXFLAGS=-I/public/home/geosign/ppl/lib:/public/home/geosign/Gcc/lib --enable-languages=c,c++,fortran --disable-multilib

线程模型:posix gcc 版本 4.4.7 (GCC)

但是,当我使用“make”编译 glibc 时,它显示:

make[3]: Leaving directory `/public/home/geosign/software/glibc/elf'
gcc -B/public/home/geosign/binutils/   -nostdlib -nostartfiles -r -o /public/home/geosign/software/build/glibc/elf/librtld.os '-Wl,-(' /public/home/geosign/software/build/glibc/elf/dl-allobjs.os /public/home/geosign/software/build/glibc/elf/rtld-libc.a -lgcc '-Wl,-)' \
      -Wl,-Map,/public/home/geosign/software/build/glibc/elf/librtld.os.map
gcc -B/public/home/geosign/binutils/   -nostdlib -nostartfiles -shared  \
      -Wl,-z,combreloc -Wl,-z,relro -Wl,--hash-style=both -Wl,-z,defs -Wl,--verbose 2>&1 |  \
      LC_ALL=C \
      sed -e '/^=========/,/^=========/!d;/^=========/d'    \
          -e 's/\. = 0 + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/' \
      > /public/home/geosign/software/build/glibc/elf/ld.so.lds
gcc -B/public/home/geosign/binutils/   -nostdlib -nostartfiles -shared -o /public/home/geosign/software/build/glibc/elf/ld.so           \
      -Wl,-z,combreloc -Wl,-z,relro -Wl,--hash-style=both -Wl,-z,defs   \
     /public/home/geosign/software/build/glibc/elf/librtld.os -Wl,--version-script=/public/home/geosign/software/build/glibc/ld.map     \
      -Wl,-soname=ld-linux-x86-64.so.2 -T /public/home/geosign/software/build/glibc/elf/ld.so.lds
/public/home/geosign/software/build/glibc/elf/librtld.os: In function `_dl_start_final':
/public/home/geosign/software/glibc/elf/rtld.c:290: undefined reference to `_begin'
/public/home/geosign/binutils/bin/ld: /public/home/geosign/software/build/glibc/elf/librtld.os: relocation R_X86_64_PC32 against undefined hidden symbol `_begin' can not be used when making a shared object
/public/home/geosign/binutils/bin/ld: final link failed: Bad value
collect2: ld returned 1 exit status
make[2]: *** [/public/home/geosign/software/build/glibc/elf/ld.so] Error 1
make[2]: Leaving directory `/public/home/geosign/software/glibc/elf'
make[1]: *** [elf/subdir_lib] Error 2
make[1]: Leaving directory `/public/home/geosign/software/glibc'
make: *** [all] Error 2

elf的Makefile中的这些句子是:

$(objpfx)ld.so: $(objpfx)librtld.os $(ld-map)
    @rm -f $@.lds
    $(LINK.o) -nostdlib -nostartfiles -shared $(z-now-$(bind-now))  \
          $(LDFLAGS-rtld) -Wl,-z,defs -Wl,--verbose 2>&1 |  \
          LC_ALL=C \
          sed -e '/^=========/,/^=========/!d;/^=========/d'    \
              -e 's/\. = 0 + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/' \
          > $@.lds
    $(LINK.o) -nostdlib -nostartfiles -shared -o $@         \
          $(LDFLAGS-rtld) -Wl,-z,defs $(z-now-$(bind-now))  \
          $(filter-out $(map-file),$^) $(load-map-file)     \
          -Wl,-soname=$(rtld-installed-name) -T $@.lds
    rm -f $@.lds
    readelf -s $@ \
      | awk '($$7 ~ /^UND(|EF)$$/ && $$1 != "0:" && $$4 != "REGISTER") { print; p=1 } END { exit p != 0 }'

这是我配置 glibc 的方式:

/public/home/geosign/software/glibc/configure --prefix=/public/home/geosign/glibc  --with-binutils=/public/home/geosign/binutils/ --enable-shared --disable-multilib

ldd ld 显示:

[geosign@node117 ~/binutils/bin]$ ldd ld
    linux-vdso.so.1 =>  (0x00007fff163be000)
    libz.so.1 => /lib64/libz.so.1 (0x0000003fd1400000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003fd0400000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003fd0000000)

非常感谢。我的时间真的很有限,我花了很多天。

【问题讨论】:

  • 任何机构可以帮助我吗?
  • 在我看来,包含 ld.so 文件的目录的目录路径部分或完全丢失。这就是我开始研究问题根源的地方。在研究时,请务必查看目录每一级的permissions,您“可能”需要使用sudo 功能运行make
  • 谢谢。但是,我不能在超级计算机中心使用 sudo...
  • 这是glibc2.7中的一个bug,已被报告。改变'-e's/\. = 0 + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/'\'到'-e's/\. = .*0)\+ + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/'\'

标签: c gcc makefile glibc


【解决方案1】:

您的直接问题是:

gcc   -nostdlib -nostartfiles -shared -o -mcmodel=large \
  /public/home/geosign/software/glibc-2.7/w/elf/ld.so ...

这告诉 GCC 创建一个名为 -mcmodel=large 的输出文件,而不是预期的输出文件 /public/home/geosign/software/glibc-2.7/w/elf/ld.so

您没有告诉我们您是如何配置此 GLIBC 构建的,但我怀疑您在 ./configure 调用中的某处使用了 -mcmodel=large。不要那样做,没有理由在构建 glibc 时使用-mcmodel=large

【讨论】:

  • 谢谢。我更新了一些配置时 mcmodel=large 被删除的信息。但是,它仍然显示相同的错误。
  • @Amy 你没有得到同样的错误,你得到了不同的错误(在同一个地方)。您可能没有从先前失败的构建中清理。尝试make distclean; configure; make,或者只是从头开始重新构建 GLIBC(完全删除目录并重新创建它,提取源代码,配置;制作)。
  • 非常感谢。我已修复它:这是 glibc 中报告的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 2021-05-27
  • 2016-07-04
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多