Linking problems for GMP to GCC during cross compilation

天涯浪子 提交于 2020-01-07 03:05:52

问题


Following this How To Build GCC 4.8.2 ARM Cross-Compiler, I have successfully installed everything. But GMP linkage to GCC isn't done there for which I referred to this tutorial- shown below

    mkdir $BUILDDIR/gmp
    cd $BUILDDIR/gmp
    export CFLAGS=-static
    ../../sources/gmp-4.3.2/configure \
    --build=$BUILDMACH \
    --host=$TARGETMACH \
    --prefix=$INSTALLDIR \
    --disable-shared
    make
    make install

When I try to configure, this is what happens:

    checking build system type... i686-pc-linux-gnu
    checking host system type... arm-none-linux-gnueabi
    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    checking for gawk... gawk
    checking whether make sets $(MAKE)... yes
    checking for arm-none-linux-gnueabi-strip... no
    checking for strip... strip
    configure: WARNING: In the future, Autoconf will not detect cross-tools
    whose name does not start with the host triplet.  If you think this
    configuration is useful to you, please write to autoconf@gnu.org.
    checking whether to enable maintainer-specific portions of Makefiles... no
    checking ABI=standard
    checking compiler arm-none-linux-gnueabi-gcc -static ... no
    checking compiler gcc -static ... yes
    checking whether ARM gcc unsigned division works... yes
    checking for arm-none-linux-gnueabi-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... yes
    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 gcc option to accept ISO C99... -std=gnu99
    checking for gcc -std=gnu99 option to accept ISO Standard C... (cached) -std=gnu99
    checking how to run the C preprocessor... gcc -std=gnu99 -E
    checking build system compiler gcc -std=gnu99... yes
    checking for build system preprocessor... gcc -std=gnu99 -E
    checking for build system executable suffix... 
    checking whether build system compiler is ANSI... yes
    checking for build system compiler math library... -lm
    checking for grep that handles long lines and -e... /bin/grep
    checking for egrep... /bin/grep -E
    using ABI="standard"
          CC="gcc -std=gnu99"
          CFLAGS="-static"
          CPPFLAGS=""
          MPN_PATH=" arm generic"
    checking for function prototypes... yes
    checking for ANSI C header files... yes
    checking for sys/types.h... yes
    checking for sys/stat.h... yes
    checking for stdlib.h... yes
    checking for string.h... yes
    checking for memory.h... yes
    checking for strings.h... yes
    checking for inttypes.h... yes
    checking for stdint.h... yes
    checking for unistd.h... yes
    checking for string.h... (cached) yes
    checking whether assembler supports --noexecstack option... yes
    checking for arm-none-linux-gnueabi-ar... no
    checking for ar... ar
    checking for BSD-compatible nm... nm
    checking for BSD-compatible nm... /usr/bin/nm -B
    checking for a sed that does not truncate output... /bin/sed
    checking for ld used by gcc -std=gnu99... /usr/bin/ld
    checking if the linker (/usr/bin/ld) is GNU ld... yes
    checking for /usr/bin/ld option to reload object files... -r
    checking whether ln -s works... yes
    checking how to recognize dependent libraries... pass_all
    checking dlfcn.h usability... yes
    checking dlfcn.h presence... yes
    checking for dlfcn.h... yes
    checking the maximum length of command line arguments... 1572864
    checking command to parse /usr/bin/nm -B output from gcc -std=gnu99 object... ok
    checking for objdir... .libs
    checking for arm-none-linux-gnueabi-ar... ar
    checking for arm-none-linux-gnueabi-ranlib... no
    checking for ranlib... ranlib
    checking for arm-none-linux-gnueabi-strip... strip
    checking if gcc -std=gnu99 supports -fno-rtti -fno-exceptions... no
    checking for gcc -std=gnu99 option to produce PIC... -fPIC
    checking if gcc -std=gnu99 PIC flag -fPIC works... yes
    checking if gcc -std=gnu99 static flag -static works... yes
    checking if gcc -std=gnu99 supports -c -o file.o... yes
    checking whether the gcc -std=gnu99 linker (/usr/bin/ld) supports shared libraries... yes
    checking dynamic linker characteristics... GNU/Linux ld.so
    checking how to hardcode library paths into programs... immediate
    checking whether stripping libraries is possible... yes
    checking if libtool supports shared libraries... yes
    checking whether to build shared libraries... no
    checking whether to build static libraries... yes
    configure: creating libtool
    checking for ANSI C header files... (cached) yes
    checking whether time.h and sys/time.h may both be included... yes
    checking fcntl.h usability... yes
    checking fcntl.h presence... yes
    checking for fcntl.h... yes
    checking float.h usability... yes
    checking float.h presence... yes
    checking for float.h... yes
    checking invent.h usability... no
    checking invent.h presence... no
    checking for invent.h... no
    checking langinfo.h usability... yes
    checking langinfo.h presence... yes
    checking for langinfo.h... yes
    checking locale.h usability... yes
    checking locale.h presence... yes
    checking for locale.h... yes
    checking nl_types.h usability... yes
    checking nl_types.h presence... yes
    checking for nl_types.h... yes
    checking sys/attributes.h usability... no
    checking sys/attributes.h presence... no
    checking for sys/attributes.h... no
    checking sys/iograph.h usability... no
    checking sys/iograph.h presence... no
    checking for sys/iograph.h... no
    checking sys/mman.h usability... yes
    checking sys/mman.h presence... yes
    checking for sys/mman.h... yes
    checking sys/param.h usability... yes
    checking sys/param.h presence... yes
    checking for sys/param.h... yes
    checking sys/processor.h usability... no
    checking sys/processor.h presence... no
    checking for sys/processor.h... no
    checking sys/pstat.h usability... no
    checking sys/pstat.h presence... no
    checking for sys/pstat.h... no
    checking sys/sysinfo.h usability... yes
    checking sys/sysinfo.h presence... yes
    checking for sys/sysinfo.h... yes
    checking sys/syssgi.h usability... no
    checking sys/syssgi.h presence... no
    checking for sys/syssgi.h... no
    checking sys/systemcfg.h usability... no
    checking sys/systemcfg.h presence... no
    checking for sys/systemcfg.h... no
    checking sys/time.h usability... yes
    checking sys/time.h presence... yes
    checking for sys/time.h... yes
    checking sys/times.h usability... yes
    checking sys/times.h presence... yes
    checking for sys/times.h... yes
    checking for sys/resource.h... yes
    checking for sys/sysctl.h... yes
    checking for machine/hal_sysinfo.h... no
    checking whether fgetc is declared... yes
    checking whether fscanf is declared... yes
    checking whether optarg is declared... yes
    checking whether ungetc is declared... yes
    checking whether vfprintf is declared... yes
    checking whether sys_errlist is declared... yes
    checking whether sys_nerr is declared... yes
    checking return type of signal handlers... void
    checking for intmax_t... yes
    checking for long double... yes
    checking for long long... yes
    checking for ptrdiff_t... yes
    checking for quad_t... yes
    checking for uint_least32_t... yes
    checking for preprocessor stringizing operator... yes
    checking for working volatile... yes
    checking for C/C++ restrict keyword... restrict
    checking whether <stdarg.h> exists and works... yes
    checking whether gcc __attribute__ ((const)) works... yes
    checking whether gcc __attribute__ ((malloc)) works... yes
    checking whether gcc __attribute__ ((mode (XX))) works... yes
    checking whether gcc __attribute__ ((noreturn)) works... yes
    checking for inline... inline
    checking for cos in -lm... yes
    checking for working alloca.h... yes
    checking for alloca (via gmp-impl.h)... yes
    checking how to allocate temporary memory... alloca
    checking whether byte ordering is bigendian... no
    checking format of `double' floating point... IEEE little endian
    checking for alarm... yes
    checking for attr_get... no
    checking for clock... yes
    checking for clock_gettime... yes
    checking for cputime... no
    checking for getpagesize... yes
    checking for getrusage... yes
    checking for gettimeofday... yes
    checking for getsysinfo... no
    checking for localeconv... yes
    checking for memset... yes
    checking for mmap... yes
    checking for mprotect... yes
    checking for nl_langinfo... yes
    checking for obstack_vprintf... yes
    checking for popen... yes
    checking for processor_info... no
    checking for pstat_getprocessor... no
    checking for raise... yes
    checking for read_real_time... no
    checking for sigaction... yes
    checking for sigaltstack... yes
    checking for sigstack... yes
    checking for syssgi... no
    checking for strchr... yes
    checking for strerror... yes
    checking for strnlen... yes
    checking for strtol... yes
    checking for strtoul... yes
    checking for sysconf... yes
    checking for sysctl... yes
    checking for sysctlbyname... no
    checking for times... yes
    checking for vsnprintf... yes
    checking whether vsnprintf works... probably
    configure: WARNING: cannot check for properly working vsnprintf when cross compiling, will assume it's ok
    checking whether sscanf needs writable input... no
    checking for struct pst_processor.psp_iticksperclktick... no
    checking for suitable m4... m4
    checking if m4wrap produces spurious output... no
    checking how to switch to text section... .text
    checking how to switch to data section... .data
    checking for assembler label suffix... :
    checking for assembler global directive... .globl
    checking for assembler global directive attribute... 
    checking if globals are prefixed by underscore... no
    checking how to switch to read-only data section...     .section    .rodata
    checking for assembler .type directive... .type $1,@$2
    checking for assembler .size directive... .size $1,$2
    checking for assembler local label prefix... .L
    checking for assembler byte directive... .byte
    checking how to define a 32-bit word... .long
    checking if .align assembly directive is logarithmic... no
    checking for unsigned short... yes
    checking size of unsigned short... 2
    checking for unsigned... yes
    checking size of unsigned... 4
    checking for unsigned long... yes
    checking size of unsigned long... 8
    checking for mp_limb_t... yes
    checking size of mp_limb_t... 8
    configure: error: Oops, mp_limb_t is 64 bits, but the assembler code
    in this configuration expects 32 bits.
    You appear to have set $CFLAGS, perhaps you also need to tell GMP the
    intended ABI, see "ABI and ISA" in the manual.

How to fix this? I have looked exhaustively but in vain.

Thanks!


回答1:


configure: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org.

That's a clue to review the previous messages, which are:

checking for arm-none-linux-gnueabi-strip... no

checking for strip... strip

It seems your cross-binutils aren't found. Note that configure may also issue this warning for a utility named mt on normal desktop systems, but that one isn't really a problem. The fact that a binutils program wasn't found for the specified host/target system is generally a sign that you won't be able to compile anything as you intend to do.

checking compiler arm-none-linux-gnueabi-gcc -static ... no

further indicates that you don't have the cross-toolchain in your PATH at all because it can't find the C cross-compiler. If you've run make install for everything you compiled and also added the installation's bin directory to your PATH, it should find the tools properly. From the ARM cross-compiler tutorial you linked:

Your done! :) Now go compile a test program with your new toy and see if it works. In a new terminal run:

$ export INSTALLDIR=~/workbench/gcc-4.8.2/arm
$ export PATH=$INSTALLDIR/bin:$PATH
$ export TARGETMACH=arm-none-linux-gnueabi
$ export BUILDMACH=i686-pc-linux-gnu
$ export CROSS=arm-none-linux-gnueabi
$ export CC=${CROSS}-gcc
$ export LD=${CROSS}-ld
$ export AS=${CROSS}-as

Notice the lines with INSTALLDIR and PATH. Additionally, make sure that you could compile a test program:

Now compile your test program:

$ $CC -Wall -Wextra <your test>.c -o <your test>

Check to see if your test program was successfully cross-compiled for ARM:

$ file <your test>
bash: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped

If you see something similar to the output above, then you have successfully cross-compiled your test program.



来源:https://stackoverflow.com/questions/32798560/linking-problems-for-gmp-to-gcc-during-cross-compilation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!