Statisches Verknüpfen von Util-Linux – Cross-Kompilierung (erzeugt stattdessen dynamisch verknüpfte Dateien)

Statisches Verknüpfen von Util-Linux – Cross-Kompilierung (erzeugt stattdessen dynamisch verknüpfte Dateien)

Ich habe versucht, util-linux für arm zu plattformübergreifend zu kompilieren, aber ich lande immer bei dynamisch verknüpften ausführbaren Dateien und weiß nicht, warum das so ist. Mein Ziel ist statisch. Ich habe schon früher mit verschiedenen Tools mit ähnlichen Schritten plattformübergreifend kompiliert und es hat immer funktioniert, also weiß ich nicht, was ich diesmal falsch mache. Ich verwende Ubuntu 16.04. Hier sind die Befehle, die ich ausführe:

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

Wie Sie sehen, habe ich „static“ an jeder Stelle angegeben, an der es mir einfiel, und sogar Dinge wiederholt, „nur um sicherzugehen, dass es mich versteht“, und nachdem ich das Konfigurationsskript ausgeführt habe, ist hier die Ausgabe:

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:

Dann mach ich:

make fdisk

oder

make whereis

und sobald die Kompilierung abgeschlossen ist, mache ich:

file fdisk

fdiskwobei es sich um die Datei handelt, die gerade erstellt wurde und:

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

Wie Sie sehen, steht dort „dynamisch verknüpft“. Ich habe das ganze Internet durchsucht, aber keine Antwort gefunden. Ich mache auch Folgendes:

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

Das ist genau der gleiche Konfigurationsbefehl wie der davor, mit Ausnahme des fehlenden Parameters „--enable-static-programs“, der standardmäßig alles als statisch kompilieren „sollte“, was er aber nicht tut.

Mache ich etwas falsch oder ist das ein Makefile-Fehler?

Antwort1

Ich habe gerade herausgefunden, warum die ursprünglichen Befehle in meiner Frage keine statischen Dateien erzeugten! Ich musste ausführenmache LDFLAGS="--static". Nachdem ich dies getan hatte, war alles statisch verknüpft!

Um es zu wiederholen, ich habe Folgendes ausgeführt:

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

Dann

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

und dann

make LDFLAGS="--static"

und alles statisch verknüpft! Es besteht keine Notwendigkeit mehr für die Objektdateisammlung, wie in meiner vorherigen Antwort gezeigt, aber ja, auch das kann als Alternative verwendet werden.

Und zu Ihrer Information, hier sind meine Versionsinformationen, da es einige von Ihnen wahrscheinlich interessieren wird:

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

Antwort2

Die statischen Binärdateien werden mit einer .staticErweiterung erstellt. Nach dem Erstellen erhalte ich

$ 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

Ich habe dies nur mit

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

(Sie sollten keine FLAGSVariablen benötigen; ersetzen Sie sie in Ihrem Setup gnueabihfdurch , ich habe das nur verwendet, weil ich bereits ein funktionierendes Cross-Compilation-Setup hatte).gnueabiarmhf

Antwort3

Update – Siehe meine andere Antwort unten

Ok, nach stundenlanger (buchstäblicher) Analyse der Makefile-Datei, die vom Konfigurationsskript von util-linux erstellt wurde, und einer weiteren Makefile-Datei, die von einem anderen Dienstprogramm erstellt wurde, das mit statisch verknüpften Dateien endet, habe ich erfolgreich die Parameter abgerufen, die anarm-linux-gnueabi-gccdie statisch verknüpfte Dateien erzeugen. Am Ende kam ich also auf Folgendes:

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>

Nach dem Kompilierenwo ist:

make whereis

Anschließend habe ich eine Suche nach allen erstellten Objektdateien durchgeführt:

find . -name "*.o"

Das Ergebnis war:

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

Also habe ich alle diese Objektdateien in einer Zeile zusammengefasst und einen weiteren Befehl ausgeführt:

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

Und voila! :) mywhereis wurde generiert.

Also habe ich mir die Ehre erwiesen und den Dateibefehl ausgeführt:

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

Was für eine Erleichterung!! Ok, die Lösung ist nicht idealAberes macht seinen Job und kann optimiert werden!

Ich habe insgesamt etwa 8 Stunden damit verbracht, daran zu arbeiten und zu experimentieren, und mir ist klar geworden, dass es vielleicht nicht „eine Lösung für alle“ gibt, aber das hier funktioniert tatsächlich! Ich habe die Datei auf meinem Android-Telefon getestet und sie funktioniert!!

Außerdem scheint diese Lösung eine „Lösung für alles“ zu sein, da sie nur die Objektdateien verknüpft, um eine statisch verknüpfte Datei zu erstellen. Ich habe dies mit einem anderen Dienstprogramm aus einem völlig anderen Quellpaket getestet und auch das hat funktioniert.

Antwort4

Ich habe Stunden damit verbracht, alle Programme statisch zu verknüpfen. Es stellte sich heraus, dass sich nur wenige auf diese Weise erstellen lassen:

Aus configure.h:

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

Ich muss lsblkstatisch verknüpft sein und es funktioniert nicht, selbst wenn ich es zur Liste hinzufüge (andere tun das). Gibt es eine Möglichkeit, andere statische Versionen außerhalb dieser Liste zu erhalten?

verwandte Informationen