gcc elf gmp mpfr mpc

¿Cómo instalar GCC pieza por pieza con GMP, MPFR, MPC, ELF, sin bibliotecas compartidas?



(6)

¿Cómo instalo GCC (la colección de compiladores GNU) pieza por pieza, usando la versión actual,
utilizando las versiones correctas de las dependencias, sin usar un administrador de paquetes (como yum, rpm, apt, dpkg) y sin usar bibliotecas compartidas?

Los desarrolladores típicos probablemente deseen instalar GCC de la manera típica, use su administrador de paquetes (yum, rpm, apt, dpkg, port, brew, etc.) o siga las instrucciones aquí ( http://gcc.gnu.org/wiki/InstallingGCC ).

Mi pregunta es cómo instalar GCC pieza por pieza, sin bibliotecas compartidas.

  • Quiero un GCC totalmente independiente que pueda moverse por mi sistema sin utilizar ninguna biblioteca compartida, y sin crear ninguna biblioteca compartida.
  • Esto es lo que GCC llama "la manera difícil" y no se recomienda para usuarios típicos.

GCC depende de:

  • GMP: Biblioteca aritmética de precisión múltiple de GNU
  • MPFR: GNU Biblioteca de redondeo de coma flotante de precisión múltiple
  • MPC: biblioteca C de precisión múltiple GNU
  • ELF: biblioteca de formato ejecutable y enlazable
  • PPL: Biblioteca de Poliedros de Parma (opcional, para optimizaciones de memoria)

La manera fácil

Si eres un desarrollador típico, puedes instalarlo de la manera más sencilla, usando las instrucciones en http://gcc.gnu.org/wiki/InstallingGCC o el administrador de paquetes de tu sistema, como por ejemplo:

apt install gcc # for Debian, Ubuntu, etc. yum install gcc # for RedHat, CentOS, etc. brew install gcc # for Mac OS X

El camino difícil

GCC dice que la respuesta aquí es "por las malas" porque construye todo pieza por pieza, y no usa bibliotecas compartidas.

Infraestructura de GCC

Obtenga la infraestructura de GCC:

ftp://gcc.gnu.org/pub/gcc/infrastructure/

Coloque las descargas en un directorio temporal (puede usar el directorio que desee).

/opt/downloads

Cree la infraestructura en un directorio temporal que sea diferente al directorio de descargas o sus subdirectorios:

/tmp/gcc

Configure la infraestructura usando bibliotecas estáticas como esta:

./configure --disable-shared --enable-static --prefix=/tmp/gcc

La bandera --disable-shared puede merecer una mirada más cercana según tus necesidades. Utilizo --disable-shared porque estoy construyendo código estático solamente, y quiero asegurarme de que no construyo ningún código compartido. Mi necesidad es mover el GCC resultante alrededor de mis discos fácilmente, así que quiero todo el código estático, y no quiero ningún código compartido. Si prefiere el código compartido, omita el indicador --disable-shared.

Versiones

Cuando ejecute cualquiera de los comandos en esta respuesta, asegúrese de actualizar los comandos para usar el número de versión actual de GCC que coincida con sus necesidades. Los comandos en esta respuesta son para GCC 4.6.2.

Tenga en cuenta que la documentación de GCC dice: "Si bien cualquier versión suficientemente nueva de las herramientas necesarias suele funcionar, los requisitos de la biblioteca son generalmente más estrictos. Las versiones más nuevas pueden funcionar en algunos casos, pero es más seguro utilizar las versiones exactas documentadas".

GMP

GMP es la Biblioteca de Aritmética de Precisión Múltiple de GNU.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2 bunzip2 gmp-4.3.2.tar.bz2 tar xvf gmp-4.3.2.tar cd gmp-4.3.2 ./configure --disable-shared --enable-static --prefix=/tmp/gcc make && make check && make install

MPFR

MPFR es la biblioteca de redondeo de punto flotante de precisión múltiple de GNU. Depende de GMP.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2 bunzip2 mpfr-2.4.2.tar.bz2 tar xvf mpfr-2.4.2.tar cd mpfr-2.4.2 ./configure --disable-shared --enable-static --prefix=/tmp/gcc --with-gmp=/tmp/gcc make && make check && make install

MPC

MPC es la biblioteca C de precisión múltiple de GNU. Depende de GMP y MPFR.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz tar zxvf mpc-0.8.1.tar.gz cd mpc-0.8.1 ./configure --disable-shared --enable-static --prefix=/tmp/gcc --with-gmp=/tmp/gcc --with-mpfr=/tmp/gcc make && make check && make install

DUENDE

ELF significa Formato Ejecutable y Vinculable. Esta biblioteca proporciona compatibilidad con tamaño independiente de arquitectura y endian.

wget http://www.mr511.de/software/libelf-0.8.13.tar.gz tar zxvf libelf-0.8.13.tar.gz cd libelf-0.8.13 ./configure --disable-shared --enable-static --prefix=/tmp/gcc make && make check && make install

GCC

GCC es la colección de compiladores de GNU. Depende de GMP, MPFR, MPC y ELF.

wget http://www.netgull.com/gcc/releases/gcc-4.6.2/gcc-4.6.2.tar.gz tar zxvf gcc-4.6.2.tar.gz

Construya gcc en un directorio reutilizable en el mismo punto de montaje. (Crearlo dentro de / tmp desencadenaría problemas de host de compilación cruzada)

mkdir -p /opt/downloads/gcc-4.6.2-scratch cd /opt/downloads/gcc-4.6.2-scratch

El comando de configuración y sus banderas deben estar todos en una línea de comando (esta publicación los muestra en líneas separadas solo por el ancho de la página web).

Nota: Usamos la ruta completa para configurar y no configuramos las variables de entorno de la ruta de la biblioteca. Elegimos desactivar bootstrap y deshabilitar las bibliotecas compartidas porque no las queremos (los usuarios típicos pueden querer ambas), y usar los subprocesos de posix y los indicadores que son predeterminados porque los queremos (los usuarios típicos pueden querer usar otros hilos u omitir banderas predeterminadas). YMMV y lee sobre las banderas here

/opt/downloads/gcc-4.6.2/configure --disable-shared --disable-bootstrap --disable-libstdcxx-pch --enable-languages=all --enable-libgomp --enable-lto --enable-threads=posix --enable-tls --with-gmp=/tmp/gcc --with-mpfr=/tmp/gcc --with-mpc=/tmp/gcc --with-libelf=/tmp/gcc --with-fpmath=sse make && make install

Esta página es ideal para la información de instalación de GCC, cómo construirla, varias banderas y más:

http://www.acsu.buffalo.edu/~charngda/cc_build.html

Actualizaciones

Las bibliotecas ppl se pueden utilizar para optimizar la memoria: consulte bugseng.com/products/ppl/Download (gracias a Paul en los comentarios)

Puede ejecutar ./contrib/download_prerequisites desde el directorio de origen de gcc. (Gracias a N7P en reddit)


Después de intentar instalar dependencias de GCC, incluidas GMP, MPFR y MPC. Me encontré con requisitos de instalación adicionales, errores y archivos perdidos; como archivo de cabecera gmp.h requerido por MPFR para instalar. Se eliminan una serie de problemas que se encontrarán en el proceso. Sin embargo, existe una manera más fácil de compilar e instalar GCC-X.0.0 o una versión posterior con un enlace automático .

OPCION UNO.

Para ahorrar el problema de construir con make, make install y Linking the dynamic libraries, simplemente:

  • Descargue su GCC-X.0.0 -version (con la última versión de: https://gcc.gnu.org/ )
  • Extraiga los archivos gcc-X-000.tar.gz a una ubicación / somepath /.
  • Una vez que haya extraído el archivo .tar.gz, ejecute la secuencia de comandos ./contrib/download_prerequisites que se encuentra en / somepath / o en el directorio de origen.
  • Este script descargará bibliotecas de soporte que incluyen: GMP, MPFR y MPC y creará un enlace simbólico para usted, que CONSTRUIRÁ todas las dependencias de gcc automáticamente como parte del proceso de instalación de gcc.

    No es necesario compilar y vincular las bibliotecas de soporte que se descargaron a / somepath / emitiendo Make, Make Install o ejecutando el archivo ./configure o agregando enlaces como --with-gmp = / gmp_path / ... / ..... , --with-mpfr = / mpfr_path / ... / ... porque esto se hizo cuando ejecutó un script que creó enlaces simbólicos .

OPCIÓN DOS.

  • Use su sistema de administración de paquetes OS para instalar las bibliotecas de soporte en la ubicación estándar del sistema. Para el sistema basado en Debian, incluidos Ubuntu, instale los paquetes libgmp-dev, libmpfr-dev y libmpc-dev . Para el sistema basado en RPM, incluidos Fedora y SUSE, instale los paquetes gmp-devel y libmpc-devel ( mpc-devel en SUSE).
  • Esta opción instalará bibliotecas y archivos de encabezado en un directorio de sistema estándar donde se encontrarán automáticamente al compilar GCC.
  • Esta es la ventaja de OS Package Installation Management cuando se invoca "sudo apt-get install libgmp-dev" o "sudo apt-get install libmpfr-dev" y se realiza el enlace. Además, no tiene que compilar las bibliotecas de soporte con Make, Make install o ./configure. Además, el proceso lleva unos minutos para completar todo el proceso.
  • Ahora puede continuar con la instalación de GCC.

CONFIGURACIÓN:

This is the GCC config Process, with gcc-X-000.tar.gz

Problema:

tar -xvf gcc-X-000.tar.gz cd gcc-X-000 ./contrib/download_prerequisites cd .. mkdir objdir /../gcc-X-000/configure --prefix=$HOME/gcc-X-000 --enable-languages=c,c++,fortran,go --disable-multilib make -j 2 make install

NÓTESE BIEN:

- idiomas aptos tales como c ++ o c.

--disable-multilib ; deshabilite multilib según su sistema y sistema operativo, se le preguntará acerca de multilib para continuar.

Hacer tardará mucho tiempo en completarse. Sin embargo, puede emitir la opción -j #no_pro. Esto ejecutará simultáneamente en paralelo en función de la cantidad de procesadores en su PC o Mac.

Para obtener información detallada sobre cómo ejecutar este proceso, puede visitar: https://gcc.gnu.org/wiki/InstallingGCC .


La respuesta aceptada lo hace mucho más complicado de lo necesario y no es correcto para todas las versiones. Crear GCC con --disable-shared es generalmente una muy mala idea. Vea http://gcc.gnu.org/wiki/InstallingGCC para un acercamiento más fácil.

El proceso completo no debería ser más difícil que esto (reemplazando 4.6.2 con la versión que desea construir):

tar xzf gcc-4.6.2.tar.gz cd gcc-4.6.2 ./contrib/download_prerequisites cd .. mkdir objdir cd objdir $PWD/../gcc-4.6.2/configure --prefix=$HOME/GCC-4.6.2 make make install

(Pero lea el enlace de arriba, de todos modos, contiene información útil).

Aparentemente algunas personas en Ubuntu tienen montones de basura en su entorno que interfieren con el proceso de compilación de GCC, y necesitan eliminar eso primero:

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH


Seguí la respuesta más aceptada por joelparkerhenderson. Esta es la mejor respuesta que pude encontrar para instalar en un sistema * NIX a través de Internet.

Para la posteridad, quiero agregar que si recibe un error como "error de instalación: no se puede calcular el sufijo de los archivos de objeto: no se puede compilar"

luego actualiza tu LD_LIBRBARY_PATH con / tmp / gcc / lib (Consulta la respuesta completa de joelparkerhenderson para el contexto)

/ tmp / gcc / lib contiene todos los archivos mpfr / mpc / gmp necesarios y el enlazador de tiempo de ejecución no los puede encontrar a menos que los agregue a LD_LIBRARY_PATH. Tampoco te olvides de exportar LD_LIBRARY_PATH;). Más contexto aquí: https://gcc.gnu.org/wiki/FAQ#configure_suffix


Usé lo que Jonathan mencionó anteriormente, excepto que tuve que descargar gmp y mpfr manualmente y crear un enlace suave (la distribución de gcc 4.4.2 probablemente no tiene "requisitos_preliminares")

cd src/gcc-4.4.2 ln -s ~/linux64/gmp-4.2.1 gmp ln -s ~/linux64/mpfr-2.3.0 mpfr

Por cierto, el uso de "-with-gmp" y "con-mpfr" con "./configure" me dio "configure: error: no se puede calcular el sufijo de los archivos de objeto: no se puede compilar". Por lo tanto, descargué los srcs de gmp y mpfr y luego creé el enlace suave desde dentro de gcc src top leve dir


Yo trabajo en un clúster Solo el nodo maestro está conectado a Internet. El software en los nodos está desactualizado y, en general, no se mantiene. No tengo acceso de root. Tengo dos opciones:

  • construir el software estático que necesito (paquetes computacionales); o
  • compilar compiladores estáticos.

Elegí el segundo y construí gcc, g ++ y gfortran.

Construí todo en

PREFIX=$HOME/cmp/soft/sft

y para make utilicé

THREADS=8

A continuación, gcc está construido con

  • GMP
  • MPFR
  • MPC
  • ISL
  • CLOOG

Uno puede obtener el último gcc desde aquí: ftp://gcc.gnu.org/pub/gcc/releases

Las dependencias se encuentran aquí: ftp://gcc.gnu.org/pub/gcc/infrastructure

Dependencias

Obtengo dependencias con el siguiente script:

#!/bin/sh # =========== ## variables: GMP=gmp-4.3.2.tar.bz2 MPFR=mpfr-2.4.2.tar.bz2 MPC=mpc-0.8.1.tar.gz ISL=isl-0.12.2.tar.bz2 CLOOG=cloog-0.18.1.tar.gz MIRROR=ftp://gcc.gnu.org/pub/gcc/infrastructure # =========== ## functions: extract() { if [ -f $1 ]; then case $1 in *.tar.bz2) tar xvjf $1 ;; *.tar.gz) tar xvzf $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar x $1 ;; *.gz) gunzip $1 ;; *.tar) tar xvf $1 ;; *.tbz2) tar xvjf $1 ;; *.tgz) tar xvzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress $1 ;; *.7z) 7z x $1 ;; *) echo "I don''t know how to extract ''$1''..." ;; esac else echo "''$1'' is not a valid file!" fi } # ====================== ## download and extract: wget $MIRROR/$GMP extract $GMP wget $MIRROR/$MPFR extract $MPFR wget $MIRROR/$MPC extract $MPC wget $MIRROR/$ISL extract $ISL wget $MIRROR/$CLOOG extract $CLOOG

La siguiente función bash se usa a continuación:

mkdircd () { mkdir -p "$@" && eval cd "/"/$$#/""; }

Cada uno de los siguientes comandos se emitirá en el directorio de la lib recién descargada.

GMP

mkdircd build ../configure --disable-shared --enable-static --prefix=$PREFIX/gmp make -j $THREADS && make check && make install

MPFR

mkdircd build ../configure --with-gmp=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/mpfr make -j $THREADS && make install

MPC

mkdircd build ../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --disable-shared --enable-static --prefix=$PREFIX/mpc make -j $THREADS && make install

ISL

mkdircd build ../configure --with-gmp-prefix=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/isl make -j $THREADS && make install

CLOOG

mkdircd build ../configure --with-gmp-prefix=$PREFIX/gmp --with-isl-prefix=$PREFIX/isl --disable-shared --enable-static --prefix=$PREFIX/cloog make -j $THREADS && make install

gcc

mkdircd build export LD_LIBRARY_PATH=$PREFIX/gmp/lib:$PREFIX/mpfr/lib:$PREFIX/mpc/lib:$PREFIX/isl/lib:$PREFIX/cloog/lib export C_INCLUDE_PATH=$PREFIX/gmp/include:$PREFIX/mpfr/include:$PREFIX/mpc/include:$PREFIX/isl/include:$PREFIX/cloog/include export CPLUS_INCLUDE_PATH=$PREFIX/gmp/include:$PREFIX/mpfr/include:$PREFIX/mpc/include:$PREFIX/isl/include:$PREFIX/cloog/include ../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --with-mpc=$PREFIX/mpc --with-isl=$PREFIX/isl --with-cloog=$PREFIX/cloog --disable-shared --enable-static --disable-multilib --prefix=$PREFIX/gcc --enable-languages=c,c++,fortran make -j $THREADS bootstrap && make install