Menelik Logo

Notas de Compilación de Unix

Algunas notas sobre cómo construir Menelik Core en Unix.

(Para obtener instrucciones específicas de OpenBSD, consulte build-openbsd.md).

Dependencias de Compilación Base

Para crear las dependencias y Menelik Core, es necesario instalar previamente algunas herramientas de compilación y bibliotecas esenciales. Ejecute los siguientes comandos para instalar los paquetes necesarios:

Debian/Ubuntu:

$ sudo apt-get install curl build-essential libtool autotools-dev automake pkg-config python3 bsdmainutils

Fedora:

$ sudo dnf install gcc-c++ libtool make autoconf automake python3 libstdc++-static patch

Arch Linux:

$ sudo pacman -S base-devel python3

Linux Alpine:

$ sudo apk --update --no-cache add autoconf automake curl g++ gcc libexecinfo-dev libexecinfo-static libtool make perl pkgconfig python3 patch linux-headers

FreeBSD/OpenBSD:


pkg_add gmake libtool
pkg_add autoconf # (select highest version, e.g. 2.69)
pkg_add automake # (select highest version, e.g. 1.15)
pkg_add python # (select highest version, e.g. 3.5)
    

Compilación

Siga las instrucciones en build-generic.

Seguridad

Para que su instalación de Menelik sea más segura, puede habilitar ciertos mecanismos de protección que dificultan la explotación de vulnerabilidades, incluso si se encuentran. Los archivos binarios están protegidos de forma predeterminada. Esto se puede desactivar con las siguientes banderas:


./configure --prefix= --enable-hardening
./configure --prefix= --disable-hardening
    

El endurecimiento permite las siguientes funciones:

Ejecutable Independiente de la Posición

Cree código independiente de la posición para aprovechar la aleatorización del diseño del espacio de direcciones que ofrecen algunos núcleos. Los atacantes que pueden provocar la ejecución de código en una ubicación de memoria arbitraria se ven frustrados si no saben dónde se encuentra algo útil. La pila y el montón se ubican aleatoriamente de forma predeterminada, pero esto permite que la sección de código también se ubique aleatoriamente.

Para comprobar que ha creado el ejecutable PIE, instale scanelf, parte de paxutils, y use:

$ scanelf -e ./menelikd

La salida debe contener: TYPE ET_DYN.

Pila No Ejecutable

Si la pila es ejecutable, entonces es posible que se produzcan exploits de desbordamiento de búfer basados en pila triviales si se encuentran búferes vulnerables. De manera predeterminada, Menelik Core debería compilarse con una pila no ejecutable, pero si una de las bibliotecas que utiliza solicita una pila ejecutable o alguien comete un error y utiliza una extensión del compilador que requiere una pila ejecutable, compilará silenciosamente un ejecutable sin la protección de pila no ejecutable.

Para verificar que la pila no sea ejecutable después de compilar, utilice:

$ scanelf -e ./menelikd

La salida debe contener: STK/REL/PTL RW- R-- RW-

STK RW- significa que la pila es legible y escribible, pero no ejecutable.

Modo de Billetera Desactivada

Cuando la intención es ejecutar solo un nodo P2P sin una billetera, Menelik Core puede compilarse en modo de billetera deshabilitada con:

$ ./configure --prefix= --disable-wallet

En este caso, no hay ninguna dependencia de Berkeley DB 4.8. La minería también es posible en modo de billetera deshabilitada, pero solo usando la llamada RPC getblocktemplate, no getwork.

Banderas de Configuración Adicionales

Se puede mostrar una lista de indicadores de configuración adicionales con:

$ ./configure --help

Construcción en FreeBSD

(TODO, esto no está probado, informe si funciona y si se necesitan cambios en esta documentación)

Construir en FreeBSD es básicamente lo mismo que en sistemas basados en Linux, con la diferencia de que hay que utilizar gmake en lugar de make.

Nota sobre la depuración: la versión gdb instalada por defecto es antigua y se considera dañina. No es adecuada para depurar un programa C++ multiproceso, ni siquiera para obtener trazas. Instale el paquete gdb y utilice el comando gdb versionado, por ejemplo gdb7111.

Compilación en OpenBSD

(TODO, esto no está probado, informe si funciona y si se necesitan cambios en esta documentación)

Importante: A partir de OpenBSD 6.2, la imagen base incluye un compilador clang compatible con C++11. Durante la compilación, es necesario asegurarse de que se utilice este compilador y no el antiguo g++ 4.2.1. Esto se hace agregando CC=cc CXX=c++ comandos a la configuración. Mezclar distintos compiladores en el mismo ejecutable provocará errores en el enlazador.


$ cd depends
$ make CC=cc CXX=c++
$ cd ..
$ export AUTOCONF_VERSION=2.69 # replace this with the autoconf version that you installed
$ export AUTOMAKE_VERSION=1.15 # replace this with the automake version that you installed
$ ./autogen.sh
$ ./configure --prefix= CC=cc CXX=c++
$ gmake # use -jX here for parallelism
    

Límites de Recursos de OpenBSD

Si la compilación presenta errores de falta de memoria, las instrucciones de esta sección pueden ayudar. Las restricciones ulimit estándar en OpenBSD son muy estrictas:

data(kbytes)         1572864

Lamentablemente, en algunos casos esto no es suficiente para compilar algunos archivos .cpp del proyecto (consulte el problema n.° 6658). Si su usuario está en el grupo staff, el límite se puede aumentar con:

$ ulimit -d 3000000

El cambio solo afectará al shell actual y a los procesos generados por él. Para que el cambio se aplique a todo el sistema, cambie datasize-cur y datasize-max en /etc/login.conf, y reinicie.