首页 文章

solaris - 编译64位gcc - 精灵类错误

提问于
浏览
1

我正在solaris上安装现代版的gcc . 我编译了gmp,mpfr和mpc,它们都是64位 . 当我尝试按如下方式配置gcc时,我得到一个错误,抱怨mpc,mpfr和gmp是错误的精灵类 . 是什么赋予了?

./../gcc-4.5.1/configure --prefix=/opt/OurAppDir/gcc --with-gmp=/opt/OurAppDir/gmp --with-mpfr=/opt/OurAppDir/mpfr --with-gnu-as --with-gnu-ld --build=sparc-sun-solaris2.10
checking build system type... sparc-sun-solaris2.10
checking host system type... sparc-sun-solaris2.10
checking target system type... sparc-sun-solaris2.10
checking for a BSD-compatible install... ./../gcc-4.5.1/install-sh -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for a sed that does not truncate output... /usr/bin/sed
checking for gawk... no
checking for mawk... no
checking for nawk... nawk
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking for gnatbind... no
checking for gnatmake... no
checking whether compiler driver understands Ada... no
checking how to compare bootstrapped objects... cmp $$f1 $$f2 16 16
checking for objdir... .libs
checking for the correct version of gmp.h... yes
checking for the correct version of mpfr.h... yes
checking for the correct version of mpc.h... yes
checking for the correct version of the gmp/mpfr/mpc libraries... no
configure: error: Building GCC requires GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0+.
Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify
their locations.  Source code for these libraries can be found at
their respective hosting sites as well as at
ftp://gcc.gnu.org/pub/gcc/infrastructure/.  See also
http://gcc.gnu.org/install/prerequisites.html for additional info.  If
you obtained GMP, MPFR and/or MPC from a vendor distribution package,
make sure that you have installed both the libraries and the header
files.  They may be located in separate packages.

config.log错误

configure:5474: checking for the correct version of gmp.h
configure:5494: gcc -c -g -O2 -I/opt/OurAppDir/gmp/include -I/opt/OurAppDir/mpfr/include   conftest.c >&5
configure:5494: $? = 0
configure:5512: gcc -c -g -O2 -I/opt/OurAppDir/gmp/include -I/opt/OurAppDir/mpfr/include   conftest.c >&5
configure:5512: $? = 0
configure:5513: result: yes
configure:5529: checking for the correct version of mpfr.h
configure:5547: gcc -c -g -O2 -I/opt/OurAppDir/gmp/include -I/opt/OurAppDir/mpfr/include   conftest.c >&5
configure:5547: $? = 0
configure:5564: gcc -c -g -O2 -I/opt/OurAppDir/gmp/include -I/opt/OurAppDir/mpfr/include   conftest.c >&5
configure:5564: $? = 0
configure:5565: result: yes
configure:5582: checking for the correct version of mpc.h
configure:5599: gcc -c -g -O2 -I/opt/OurAppDir/gmp/include -I/opt/OurAppDir/mpfr/include   conftest.c >&5
configure:5599: $? = 0
configure:5615: gcc -c -g -O2 -I/opt/OurAppDir/gmp/include -I/opt/OurAppDir/mpfr/include   conftest.c >&5
configure:5615: $? = 0
configure:5616: result: yes
configure:5634: checking for the correct version of the gmp/mpfr/mpc libraries
configure:5665: gcc -o conftest -g -O2 -I/opt/OurAppDir/gmp/include -I/opt/OurAppDir/mpfr/include   -R/usr/sfw/lib/sparcv9 conftest.c  -L/opt/OurAppDir/gmp/lib -L/opt/OurAppDir/m
pfr/lib -lmpc -lmpfr -lgmp >&5
ld: fatal: file /opt/OurAppDir/mpfr/lib/libmpc.so: wrong ELF class: ELFCLASS64
ld: fatal: file /opt/OurAppDir/mpfr/lib/libmpfr.so: wrong ELF class: ELFCLASS64
ld: fatal: file /opt/OurAppDir/gmp/lib/libgmp.so: wrong ELF class: ELFCLASS64
ld: fatal: File processing errors. No output written to conftest

2 回答

  • 1

    使用默认配置行,GCC不会构建为64位二进制,而是32位 . 因此,您需要通过强制 configure ABI=32 在32位模式下重建GMP,MPFR和MPC .

    或者,您可以使用 sparc64-sun-solarisX build三元组配置GCC . 在这种情况下,海湾合作委员会网站上有additional instructions .

  • 1

    您不需要64位gcc二进制文件来构建64位应用程序 . OpenCSW Solaris软件包提供32位和32位和64位目标的编译器 .

    我假设您更关心能够从您的gcc生成64位二进制文件,而更少关于gcc本身是64位 .

    构建32位和64位目标的方法,需要构建gmp两次,一次是32位,一次是64位 . 然后你有以下布局(示例来自包的pkgmap):

    1 f none /opt/csw/include/gmp-32.h 0644 root bin 86213 38841 1316878625
    1 f none /opt/csw/include/gmp-64.h 0644 root bin 86218 39139 1316879685
    1 f none /opt/csw/include/gmp.h 0755 root bin 159 12880 1316879688
    1 f none /opt/csw/include/gmpxx-32.h 0644 root bin 114646 51865 1316878625
    1 f none /opt/csw/include/gmpxx-64.h 0644 root bin 114646 51865 1316879685
    1 f none /opt/csw/include/gmpxx.h 0755 root bin 163 13360 1316879688
    1 s none /opt/csw/lib/libgmp.so=libgmp.so.10.0.2
    1 s none /opt/csw/lib/libgmpxx.so=libgmpxx.so.4.2.2
    1 s none /opt/csw/lib/libgmp.so.10=libgmp.so.10.0.2
    1 f none /opt/csw/lib/libgmp.so.10.0.2 0755 root bin 462552 51359 1316878625
    1 s none /opt/csw/lib/sparcv9/libgmp.so.10=libgmp.so.10.0.2
    1 f none /opt/csw/lib/sparcv9/libgmp.so.10.0.2 0755 root bin 503424 11223 1316879684
    

    GCC构建系统足够智能,可以查看64位库的 /opt/csw/lib/sparcv9 和32位库的 /opt/csw/lib .

    gmp.h 头文件是一个包装器,它包含 #ifdef 语句,包括 gmp-32.hgmp-64.h ,具体取决于所请求的编译模式 .

    /* Allow 32 and 64 bit headers to coexist */
    #if defined __amd64 || defined __x86_64 || defined __sparcv9
    #include "gmp-64.h"
    #else
    #include "gmp-32.h"
    #endif
    

    gmp库是唯一需要这种头文件包装器的库; mpc,mpfr,ppl和cloog库不会改变头文件,具体取决于体系结构/字长 .

    当您使用64位目标编译gcc时,您将获得包含两个crt1.o文件的布局:

    /opt/csw/lib/gcc/sparc-sun-solaris2.9/4.6.2/crt1.o
    /opt/csw/lib/gcc/sparc-sun-solaris2.9/4.6.2/sparcv9/crt1.o
    

    这样,当你传递-m64时,gcc将产生一个64位的二进制文件 .

相关问题