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.