Ligação estática util-linux - compilação cruzada (produz arquivos vinculados dinamicamente)

3

Eu tenho tentado compilar util-linux para arm mas continuo com arquivos executáveis vinculados dinamicamente e não sei por que isso acontece. Meu objetivo é estático. Eu tenho compilação cruzada antes de diferentes ferramentas usando etapas semelhantes e sempre funcionou, então não sei o que estou fazendo de errado dessa vez. Eu estou usando o Ubuntu 16.04. Aqui estão os comandos que estou executando:

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 você pode ver, eu especifiquei static em todos os lugares em que consegui pensar, mesmo repetindo o material "apenas para ter certeza de que ele me entende" e depois de executar o script de configuração, aqui está a saída:

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:

Então eu faço:

make fdisk

ou

make whereis

e assim que a compilação é feita, eu faço:

file fdisk

fdisk sendo o arquivo que acabou de ser criado e:

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 você pode ver, "vinculado dinamicamente". Eu tenho procurado por toda a Internet, mas não consegui encontrar uma resposta. Eu também faço:

./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

Qual é exatamente o mesmo comando configure que o anterior, exceto pelo parâmetro "--enable-static-programs" que "deve" por padrão compilar tudo como estático, exceto que isso não acontece.

Estou fazendo algo errado ou isso é um erro do Makefile?

    
por rwx 31.10.2016 / 09:01

3 respostas

2

Eu só descobri porque os comandos originais postados na minha pergunta não estavam produzindo arquivos estáticos! Eu tive que correr make LDFLAGS="- static ". Depois que fiz isso, tudo está vinculado estaticamente!

Para repetir, eu corri:

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

então

./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

e depois

make LDFLAGS="--static"

e tudo ligado estaticamente! Não há mais necessidade de coleta de arquivos objeto, como demonstrado na minha resposta anterior, mas sim que também pode ser usado como uma alternativa.

Também para sua informação, aqui está a minha informação de versão, como alguns de vocês provavelmente se importarão:

$ 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.
    
por 05.11.2016 / 08:45
2

Os binários estáticos são criados com uma extensão .static ; depois da compilação, recebo

$ 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

Eu tenho isso com apenas

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

(você não precisa de nenhuma variável FLAGS ; substitua gnueabihf por gnueabi em sua configuração, eu usei isso porque já tinha uma configuração de compilação cruzada armhf ).

    
por 31.10.2016 / 10:20
2

Atualização - Veja minha outra resposta abaixo

Ok, depois de horas (literalmente) e horas de análise do arquivo Makefile criado pelo script de configuração do util-linux e outro arquivo Makefile criado por outro utilitário que acaba com arquivos estaticamente vinculados, recuperei com sucesso os parâmetros passados para arm-linux-gnueabi-gcc que produz arquivos estaticamente vinculados. Então acabei com isso:

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>

Então, depois de compilar whereis :

make whereis

Eu então fiz uma pesquisa por todos os arquivos de objetos produzidos:

find . -name "*.o"

Acabei com:

./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

Então, eu consolidei todos os arquivos objeto em uma linha e executei outro 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

E voila! :) mywhereis foi gerado.

Então eu fiz as honras executando o comando file:

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

Que alívio! Ok, a solução não é ideal mas faz o trabalho e pode ser simplificada!

Eu gastei cerca de 8 horas no total trabalhando nisso e experimentei e percebi que pode não haver "uma solução para todos", mas isso realmente faz o trabalho! Eu testei o arquivo no meu telefone Android e funciona !!

Além disso, essa solução parece ser uma "correção única", pois apenas vincula os arquivos de objeto para criar um arquivo vinculado estaticamente. Eu testei isso com outro utilitário de um pacote fonte completamente diferente e isso também funcionou.

    
por 01.11.2016 / 02:09

Tags