setup进行单节点部署之排错分析(6)

问题6、编译工具链不对

特点:这个问题往往比较容易忽略,而且很多时候也不太好发现。这种错误其实很常见,Linux不像windows,兼容可以做的那么好,所以经常出现兼容的问题。“高帅富”告诉我一个简单的判断方法,查看源码的日期,太老的源码,那用新版本的工具链绝对要出问题,当然我这边这次遇到的不是这样的,先看出错时的情况:

make[3]: Leaving directory `/tmp/otp_src_R14B01/lib/hipe/misc' 

make[2]: Leaving directory `/tmp/otp_src_R14B01/lib/hipe' 

make[1]: Leaving directory `/tmp/otp_src_R14B01/lib' 

STDERR: gcc: fatal error: no input files 

compilation terminated. 

make[3]: *** [../ebin/hipe_consttab.beam] Aborted 

make[2]: *** [opt] Error 2 

make[1]: *** [opt] Error 2 

make: *** [secondary_bootstrap_build] Error 2 

make[3]: *** [../ebin/hipe_consttab.beam] Aborted 

make[2]: *** [opt] Error 2 

make[1]: *** [opt] Error 2 

make: *** [secondary_bootstrap_build] Error 2 

---- End output of "bash"  "/tmp/chef-script20121001-23468-1f1aaz2-0" ---- 

Ran "bash"  "/tmp/chef-script20121001-23468-1f1aaz2-0" returned 2 

首先确定,这个过程不是configure过程,也不是编译过程的错误(我们没有看到ld)。所以可以初步断定编译工具链版本出问题了。“ gcc: fatal error: no input files”这个错误提示也在提醒我们编译工具链版本有问题。

但是我们暂时还不知道自己在编译哪个软件。所以,第一步我要找到自己的编译哪个软件,后面的才有的说。从STDERR这行往上看,可以看到现在是在/tmp/otp_src_R14B01这个目录下,那我就进入这个目录看看是怎么回事吧。

Ubuntu@cloudfoundry:/tmp/otp_src_R14B01$ ls 

AUTHORS           INSTALL.md        README.md      bin            configure               lib        prebuilt.files 

EPLICENCE         Makefile          README.md.txt  bootstrap      configure.in            make       system 

INSTALL-CROSS.md  Makefile.in       TAR.include    config.log     erl-build-tool-vars.sh  otp_build  xcomp 

INSTALL-WIN32.md  README.bootstrap  aclocal.m4     config.status  erts                    plt 

很明显的,这是一个标准的源码包的配置。我们再make一次看看,是不是这里的问题:

make[1]: Entering directory `/tmp/otp_src_R14B01/lib' 

make[2]: Entering directory `/tmp/otp_src_R14B01/lib/hipe' 

#### Entering application hipe 

make[3]: Entering directory `/tmp/otp_src_R14B01/lib/hipe/misc' 

erlc -W  +debug_info +warn_exported_vars +warn_missing_spec +warn_untyped_record -o../ebin hipe_consttab.erl 

* buffer overflow detected *: /tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam.smp terminated 

Backtrace: 

========== 

/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x2af0df5d2ee7] 

/lib/x86_64-linux-gnu/libc.so.6(+0x107de0)[0x2af0df5d1de0] 

/tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam.smp[0x551dbf] 

/tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam.smp(erts_write_to_port+0x853)[0x47db13] 

/tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam.smp[0x4f3cae] 

/tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam.smp(process_main+0x4ab9)[0x5202a9] 

/tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam.smp[0x48930b] 

/tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam.smp[0x584fa4] 

/lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a)[0x2af0df0abe9a] 

/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x2af0df5bc39d] 

从这里,我们可以确定就是这里出现问题了。

现在我们可以确定两点:

(1)我们编译的是otp_src_R14B01这个软件

(2)我们现在的编译工具链版本不能编译这个源码包

解决方法一般两种:

(1)到这个软件的官网上下载适合我们编译工具链的源码包

(2)把编译工具链进行降级(或升级),以适应我们的源码包。

两种办法都是可取的,但是我们这边因为这个只是整个CF节点安装的一小部分,第一种方法估计没办法,所以我们采取第二种办法。

所以现在需要查我们需要弄哪个版本的编译工具链。这种东西当然是问度娘了:

Same error here. If I redirect stdout and stderr, I get a buffer overflow report from gcc... that's why it aborts. The first line is: 

 

* buffer overflow detected *: /tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam terminated 

 

This appears to be a conflict between Erlang/OTP R14B01 and gcc-4.5+... basically there's some functionality enabled that attempts to detect buffer overflows, and it thinks the Erlang code has one. If you google around you should be able to find it. My (secondary!) research indicates someone concluded there is *not* a buffer overflow, but Erlang is behaving oddly and causing the check to fail. 

 

Anyway, it appears this was fixed shortly after R14B01, and should be fine in R14B02: 

 (search for OTP-9025). 

 

CloudFoundry however is deliberately pinned to the old version: https://github.com/cloudfoundry/vcap/blob/master/dev_setup/cookbooks/erlang/attributes/default.rb. 

 

Note that R14B01 was released in December 2010... it's 3 service releases and 1 major version behind upstream. 

 

It would be really nice if Erlang/OTP could get bumped up a couple versions... I would guess that up to R14B04 would be minimal effort. 

 

 

An alternative option is to downgrade to gcc-4.4. This worked for me, and allowed me to get the DEA host installed. Here's how I did it: 

 

很开心,正好有一个回帖说了这个问题,他的答案也很明确,就是编译工具链的问题了。而且也给出了解决方法,降级到4.4版本的gcc。

注:我这时的gcc版本是4.6.3

4.4版本的gcc可以直接在ubuntu的软件源中下载到。所以安装很简单,主要是如何修改使用的默认gcc版本,这个很好理解,我们电脑原来用的是IE浏览器,现在我们装了chrome,然后为了使用,我们需要把默认浏览器改成chrome是一个道理的。所以现在的事情就是怎么改过来。

很开心的是作者也给出了怎么修改。其实一行命令就可以完成了:

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 50

然后可以使用命令gcc -v查看一下自己的版本是否有问题

ubuntu@cloudfoundry:~$ gcc -v 

Using built-in specs. 

Target: x86_64-linux-gnu 

Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.7-1ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 

Thread model: posix 

gcc version 4.4.7 (Ubuntu/Linaro 4.4.7-1ubuntu2) 

OK,现在已经更换到4.4版本的GCC了,重新编译了一下,木有问题。

注:更换了GCC版本,但是还是需要进入/tmp/otp_src_R14B01执行一次make clean否则还是会提示失败

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/656f57704f19a2e976cf3c8b0acc7e9c.html