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 .static
Erweiterung 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 FLAGS
Variablen benötigen; ersetzen Sie sie in Ihrem Setup gnueabihf
durch , ich habe das nur verwendet, weil ich bereits ein funktionierendes Cross-Compilation-Setup hatte).gnueabi
armhf
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 lsblk
statisch 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?