Enlace estático util-linux: compilación cruzada (en su lugar, produce archivos enlazados dinámicamente)

Enlace estático util-linux: compilación cruzada (en su lugar, produce archivos enlazados dinámicamente)

He estado intentando realizar una compilación cruzada de util-linux para arm, pero sigo terminando con archivos ejecutables vinculados dinámicamente y no sé por qué sucede esto. Mi objetivo es estático. He estado realizando una compilación cruzada antes de diferentes herramientas usando pasos similares y siempre ha funcionado, así que no sé qué estoy haciendo mal esta vez. Estoy usando Ubuntu 16.04. Estos son los comandos que estoy ejecutando:

export CC=arm-linux-gnueabi-gcc
export ac_cs_linux_vers=4
export CFLAGS=-static
export CPPFLAGS=-static
export LDFLAGS=-static

./configure --host=arm-linux LDFLAGS=-static --disable-shared --without-tinfo --without-ncurses --disable-ipv6 --disable-pylibmount --enable-static-programs=fdisk,sfdisk,whereis --prefix=/opt/util-linux/arm --bindir=/opt/util-linux/arm/bin --sbindir=/opt/util-linux/arm/sbin

Como puede ver, especifiqué estática en cada lugar en el que se me ocurrió repetir cosas "solo para asegurarme de que me entienda" y después de ejecutar el script de configuración, aquí está el resultado:

util-linux  2.28.2

prefix:            /opt/util-linux/arm
exec prefix:       ${prefix}

localstatedir:     ${prefix}/var
bindir:            /opt/util-linux/arm/bin
sbindir:           /opt/util-linux/arm/sbin
libdir:            ${exec_prefix}/lib
includedir:        ${prefix}/include
usrbin_execdir:    ${exec_prefix}/bin
usrsbin_execdir:   ${exec_prefix}/sbin
usrlib_execdir:    ${exec_prefix}/lib

compiler:          arm-linux-gnueabi-gcc
cflags:            -static
suid cflags:       
ldflags:           -static
suid ldflags:      

Python:            /usr/bin/python
Python version:    2.7
Python libs:       ${exec_prefix}/lib/python2.7/site-packages

Bash completions:  /usr/share/bash-completion/completions
Systemd support:   no
Btrfs support:     yes

warnings:

Entonces lo hago:

make fdisk

o

make whereis

y una vez hecha la compilación hago:

file fdisk

disco durosiendo el archivo que acaba de crear y:

fdisk: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=369363ef8f8173a3a1c2edc178eb77255a2dc415, not stripped

Como puede ver, dice "vinculado dinámicamente". He estado buscando por todo Internet pero no encontré una respuesta. Yo también hago:

./configure --host=arm-linux LDFLAGS=-static --disable-shared --without-tinfo --without-ncurses --disable-ipv6 --disable-pylibmount --prefix=/opt/util-linux/arm --bindir=/opt/util-linux/arm/bin --sbindir=/opt/util-linux/arm/sbin

Que es exactamente el mismo comando de configuración que el anterior, excepto por el parámetro "--enable-static-programs" que falta, que "debería" compilar de forma predeterminada todo como estático, excepto que no lo hace.

¿Estoy haciendo algo mal o se trata de un error de Makefile?

Respuesta1

¡Acabo de descubrir por qué los comandos originales publicados en mi pregunta no producían archivos estáticos! tuve que correrhacer LDFLAGS="--estático". Después de hacer esto, ¡todo se conectó estáticamente!

Para repetir, corrí:

export CC=arm-linux-gnueabi-gcc
export ac_cs_linux_vers=4
export CFLAGS=-static
export SUID_CFLAGS=-static
export SUID_LDFLAGS=-static
export CPPFLAGS=-static
export LDFLAGS=-static

entonces

./configure --host=arm-linux-gnueabi --disable-shared --without-tinfo --without-ncurses --disable-ipv6 --disable-pylibmount --prefix=/opt/util-linux/arm --bindir=/opt/util-linux/arm/bin --sbindir=/opt/util-linux/arm/sbin

y luego

make LDFLAGS="--static"

¡Y todo vinculado estáticamente! Ya no es necesario recopilar archivos de objetos como se demostró en mi respuesta anterior, pero sí, eso también se puede usar como alternativa.

También para su información, aquí está la información de mi versión, ya que a algunos de ustedes probablemente les interesará:

$ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ arm-linux-androideabi-ld --version
GNU gold (GNU Binutils 2.25.90.20151125) 1.11
Copyright (C) 2015 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.

Respuesta2

Los binarios estáticos se construyen con una .staticextensión; después de la construcción, obtengo

$ file fdisk.static
fdisk.static: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=b51ec4b17f772b881d2a1eaefd368cfb96d0db12, not stripped

Conseguí esto solo con

./configure --host=arm-linux-gnueabihf --enable-static-programs=fdisk

(No deberías necesitar ninguna FLAGSvariable; reemplázala gnueabihfcon gnueabien tu configuración, solo la usé porque ya tenía una armhfconfiguración de compilación cruzada funcional).

Respuesta3

Actualización: vea mi otra respuesta a continuación

Ok, después de horas (literalmente) y horas de analizar el archivo Makefile creado por el script de configuración de util-linux y otro archivo Makefile creado por otra utilidad que termina con archivos vinculados estáticamente, recuperé con éxito los parámetros pasados ​​aarm-linux-gnueabi-gccque producen archivos vinculados estáticamente. Entonces terminé con esto:

arm-linux-gnueabi-gcc -ffloat-store -static -DHAVE_CONFIG_H -static  -D_U_="__attribute__((unused))" -o <name_of_your_file> <object files produced by the compiler separated by space>

Entonces después de compilardónde es:

make whereis

Luego hice una búsqueda de todos los archivos objeto producidos:

find . -name "*.o"

Terminé con:

./misc-utils/whereis.o
./lib/libcommon_la-blkdev.o
./lib/libcommon_la-sysfs.o
./lib/libcommon_la-idcache.o
./lib/libcommon_la-procutils.o
./lib/libcommon_la-mbsalign.o
./lib/libcommon_la-linux_version.o
./lib/libcommon_la-env.o
./lib/libcommon_la-pager.o
./lib/libcommon_la-strutils.o
./lib/libcommon_la-mangle.o
./lib/libcommon_la-timeutils.o
./lib/libcommon_la-fileutils.o
./lib/libcommon_la-exec_shell.o
./lib/libcommon_la-match.o
./lib/libcommon_la-crc32.o
./lib/libcommon_la-md5.o
./lib/libcommon_la-randutils.o
./lib/libcommon_la-ttyutils.o
./lib/libcommon_la-cpuset.o
./lib/libcommon_la-color-names.o
./lib/libcommon_la-ismounted.o
./lib/libcommon_la-path.o
./lib/libcommon_la-canonicalize.o
./lib/libcommon_la-loopdev.o
./lib/libcommon_la-setproctitle.o
./lib/libcommon_la-strv.o

Entonces consolidé todos esos archivos de objetos en una línea y ejecuté otro comando:

arm-linux-gnueabi-gcc -ffloat-store -static -DHAVE_CONFIG_H -static  -D_U_="__attribute__((unused))" -o mywhereis ./misc-utils/whereis.o ./lib/libcommon_la-blkdev.o ./lib/libcommon_la-sysfs.o ./lib/libcommon_la-idcache.o ./lib/libcommon_la-procutils.o ./lib/libcommon_la-mbsalign.o ./lib/libcommon_la-linux_version.o ./lib/libcommon_la-env.o ./lib/libcommon_la-pager.o ./lib/libcommon_la-strutils.o ./lib/libcommon_la-mangle.o ./lib/libcommon_la-timeutils.o ./lib/libcommon_la-fileutils.o ./lib/libcommon_la-exec_shell.o ./lib/libcommon_la-match.o ./lib/libcommon_la-crc32.o ./lib/libcommon_la-md5.o ./lib/libcommon_la-randutils.o ./lib/libcommon_la-ttyutils.o ./lib/libcommon_la-cpuset.o ./lib/libcommon_la-color-names.o ./lib/libcommon_la-ismounted.o ./lib/libcommon_la-path.o ./lib/libcommon_la-canonicalize.o ./lib/libcommon_la-loopdev.o ./lib/libcommon_la-setproctitle.o ./lib/libcommon_la-strv.o

¡Y voilá! :) mywhereis se generó.

Entonces hice el honor ejecutando el comando de archivo:

mywhereis: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=a5b7c4ad147dc26ed211a7aa643f744a29e477f3, not stripped

¡¡Qué alivio!! Ok, la solución no es ideal.pero¡Hace el trabajo y se puede optimizar!

Pasé aproximadamente 8 horas en total trabajando en esto y experimentando y me di cuenta de que tal vez no haya "una solución para todos", ¡pero esto realmente funciona! ¡Probé el archivo en mi teléfono Android y funciona!

Además, esta solución parece ser una "solución única para todos", ya que simplemente vincula los archivos objeto para crear un archivo vinculado estáticamente. Probé esto con otra utilidad de un paquete fuente completamente diferente y también funcionó.

Respuesta4

Pasé horas tratando de vincular estáticamente todo el conjunto de programas, pero resulta que solo unos pocos se pueden producir de esa manera:

De configure.h:

  --enable-static-programs=LIST
                          link static the programs in LIST (comma-separated,
                          supported for losetup, mount, umount, fdisk, sfdisk,
                          blkid, nsenter, unshare)

Necesito lsblkestar vinculado estáticamente y no funciona incluso si lo agrego a la lista (otros sí lo hacen). ¿Hay alguna manera de obtener otras versiones estáticas fuera de esa lista?

información relacionada