Wie installiere ich den 32-Bit Dynamic Linker unter 64-Bit NixOS?

6

Ich brauche das mksdcardaus dem Android SDK zu verwenden. Derzeit meldet das System beim Ausführen dieser ausführbaren Datei "Keine solche Datei oder kein solches Verzeichnis".

Für Debian kann man ia32-libs installieren . Unter Ubuntu wird das Paket aufgerufen libc6-i386.

Wie bekomme ich die Datei /lib/ld-linux.so.2auf NixOS?

Janus Troelsen
quelle
Haben Sie bereits auf diesen Link verwiesen: - sandervanderburg.blogspot.in/2012/11/… oder sandervanderburg.blogspot.in/2014/02/… ?
Sheesh Mohsin
Was meinst du mit 32-Bit-Laufzeit-Linker? Wollen Sie damit sagen, dass Sie wissen möchten, wie eine 32-Bit-Version von installiert wird ld? Normalerweise müssen Sie nur ld32-Bit-Bibliotheken / -Objekte verknüpfen. Was versuchen Sie mit dem "32-Bit-Laufzeitlinker", den Sie jetzt nicht können?
SSNOBODY
@ssnobody, sorry, ich hätte "Dynamic Linker" sagen sollen, aber ich denke, "Laufzeit" macht mehr Sinn. Die Datei wird /lib64/ld-linux-x86-64.so.2für ausführbare 64-Bit-Dateien und /lib/ld-linux.so.2für 32-Bit- Dateien aufgerufen . Ich bestätigte dies, indem ich ein Beispiel-C-Programm mit und ohne kompilierte -m32und es dann ausführte ldd.
Janus Troelsen
@ssnobody zu Ihrer Frage "Was möchten Sie tun, [...] das Sie jetzt nicht können": Mit einem dynamischen 32-Bit-Linker kann ich dynamisch verknüpfte ausführbare 32-Bit-Dateien ausführen.
Janus Troelsen

Antworten:

4

NixOS unterstützt Multiarch nicht von Haus aus.

Das einzige Nix-Paket, das die 32-Bit-ELF-Interpreterdatei ld-linux.so.2enthält, ist die i386-Version von glibc.

Glücklicherweise können wir das Problem umgehen, indem wir das Paket von Debian ausleihen.

  1. Installieren Sie dpkg:nix-env -i dpkg
  2. Laden Sie das libc-i386Paket für 64-Bit-Systeme von debian herunter :curl -O http://ftp.us.debian.org/debian/pool/main/e/eglibc/libc6-i386_2.11.3-4_amd64.deb
  3. Extrahieren Sie dieses Paket: dpkg -x libc6-i386_2.11.3-4_amd64.deb libc6-i386
  4. Führen Sie mksdcardmit 32-Bit - ELF - Interpreter:./libc6-i386/lib32/ld-linux.so.2 /path/to/mksdcard

Eine Möglichkeit, Dinge wie mksdcardvia auszuführen, ./mksdcardbesteht darin, sie mit patchelfinstallierten via zu patchen :nix-env -i patchelf

Sie können dann so etwas tun patchelf --set--interpreter /path/to/libc6-i386/lib32/ld-linux.so.2 /path/to/mksdcard

Andernfalls können Sie versuchen, Symlinks auf Ihre Website an ld-linux.so.2den Stellen zu platzieren, an denen lddsie Ihnen mitteilt, dass sie von Ihnen erwartet werden.

[root@nixos:/tmp]# ./libc6-i386/lib32/ld-linux.so.2
Usage: ld.so [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...]
You have invoked `ld.so', the helper program for shared library executables.
This program usually lives in the file `/lib/ld.so', and special directives
in executable files using ELF shared libraries tell the system's program
loader to load the helper program from this file.  This helper program loads
the shared libraries needed by the program executable, prepares the program
to run, and runs it.  You may invoke this helper program directly from the
command line to load and run an ELF executable file; this is like executing
that file itself, but always uses this helper program from the file you
specified, instead of the helper program file specified in the executable
file you run.  This is mostly of use for maintainers to test new versions
of this helper program; chances are you did not intend to run this program.

  --list                list all dependencies and how they are resolved
  --verify              verify that given object really is a dynamically linked
                        object we can handle
  --library-path PATH   use given PATH instead of content of the environment
                        variable LD_LIBRARY_PATH
  --inhibit-rpath LIST  ignore RUNPATH and RPATH information in object names
                        in LIST
  --audit LIST          use objects named in LIST as auditors
ssnobody
quelle
Um eine 32-Bit-Anwendung in NixOS / nixpkgs zu packen, sollte es eine Möglichkeit geben, einen nix-Ausdruck in eine shell.nix- oder default.nix-Datei zu schreiben, die dies für Sie erledigt. Sie müssen nur den relevanten nix-Ausdruck finden, der die i386-Version von glibc bereitstellt, und dann aus dem Quellcode oder Patchelf aus der Binärdatei erstellen und verknüpfen.
CMCDragonkai
0

Sie können diesen Code ausprobieren. (Ich bin nicht sicher, ob es funktioniert, weil ich dies in meinem Fedora-Betriebssystem und auch für Ubuntu-Betriebssysteme getan habe.)

Laden Sie das SDK von diesem Code herunter:

wget "http://dl.google.com/android/android-sdk_r24.1.2-linux.tgz"
  1. Nachdem der Download abgeschlossen ist, extrahieren Sie den Ordner android-sdk-linuxin Ihr Ausgangsverzeichnis.

    / home / user / android-sdk-linux

  2. Erstellen Sie eine Umgebungsvariable namens ANDROID_HOME.

    ANDROID_HOME = / home / user / android-sdk-linux

Und diese beiden Ordner auf Ihre Umgebungsvariable PATH,

/home/user/android-sdk-linux/tools
/home/user/android-sdk-linux/platform-tools
  1. Öffnen Sie nun das Terminal und überprüfen Sie, ob alle Binärdateien funktionieren oder nicht wie 'android' und alle. Wenn es funktioniert, führen Sie jetzt die folgenden beiden Befehle im Terminal aus.

Führen Sie die folgenden Befehle im Terminal aus, um das Android ARM-Image herunterzuladen und das SDK zu aktualisieren:

echo y | android update sdk --all --filter platform-tools,android-19,sys-img-armeabi-v7a-android-19 --no-ui --force

Um nun eine AVD zu erstellen, führen Sie diesen Befehl im Terminal aus:

echo no | android create avd -n emul -t android-19 -s 360x600 --abi default/armeabi-v7a

HINWEIS: Im obigen Befehl ist 'emul' der AVD-Name.

  1. Führen Sie nach Abschluss dieser Schritte den folgenden Befehl im Terminal aus, um die im obigen Schritt erstellte AVD zu starten:

    Emulator -avd Emul -noskin -netfast

Sheesh Mohsin
quelle
Sie beantworten nicht die eigentliche Frage ... Dieses Problem ist systematisch für NixOS, es geht nicht nur um das Android SDK
Janus Troelsen
0

Auf der meiner Version von NixOS, konnte ich eine Arbeit bekommen mksdcarddurch Ausgabe: nix-env -i android-sdk-24.1.2nach einem tunnix-channel --update

[root@nixos:~]# /root/.nix-profile/bin/mksdcard
mksdcard: create a blank FAT32 image to be used with the Android emulator
usage: mksdcard [-l label] <size> <file>

  if <size> is a simple integer, it specifies a size in bytes
  if <size> is an integer followed by 'K', it specifies a size in KiB
  if <size> is an integer followed by 'M', it specifies a size in MiB
  if <size> is an integer followed by 'G', it specifies a size in GiB

Minimum size is 9M. The Android emulator cannot use smaller images.
Maximum size is 1099511627264 bytes, 1073741823K, 1048575M or 1023G

Von Package Management Grunde : abonniert „Nixpkgs wird automatisch in der Liste der hinzugefügt‚‘Kanäle , wenn Sie Nichts zu installieren.“

Wenn Sie jedoch das Abonnement entfernt haben oder lieber "eine ältere Version des Pakets installieren möchten als die, die vom aktuellen Inhalt des Kanals bereitgestellt wird" oder wenn das android sdk-Paket "aus dem Kanal entfernt wurde", können Sie dies Befolgen Sie die Anweisungen zur One-Click-Installation :

Sie können http://hydra.nixos.org/jobset/nixpkgs/trunk/channel/latest aufrufen und auf einen beliebigen Link für die einzelnen Pakete für Ihre Plattform klicken. Wenn Sie dies zum ersten Mal tun, werden Sie von Ihrem Browser gefragt, was mit application / nix-package-Dateien geschehen soll. Sie sollten sie mit / nix / bin / nix-install-package öffnen. Daraufhin wird ein Fenster geöffnet, in dem Sie aufgefordert werden, die Installation des Pakets zu bestätigen. Wenn Sie mit Y antworten, werden das Paket und alle zugehörigen Abhängigkeiten installiert. Dies ist ein Mechanismus zur binären Bereitstellung. Sie erhalten Pakete, die für den ausgewählten Plattformtyp vorkompiliert wurden.

In diesem Fall würde Sie x86_64 android-studio interessieren

Meine Systeminformationen als Referenz

[root@nixos:~]# uname -a Linux nixos 3.18.20 #1-NixOS SMP Thu Jan 1 00:00:01 UTC 1970 x86_64 GNU/Linux

[root@nixos:~]# cat /etc/issue

<<< Welcome to NixOS 15.09.10.4a1c7fd (\m) - \l >>>
ssnobody
quelle
Vielen Dank, aber diese Anweisungen gelten nur für das Android SDK. Mein Hauptinteresse ist die Installation des 32-Bit-Runtime-Linkers, da dies wahrscheinlich auch in Zukunft nützlich sein wird.
Janus Troelsen
Ihr Kommentar zur vorherigen Antwort hat mir den Anschein vermittelt, als wollten Sie NixOS-spezifische Anweisungen für die Installation des Android SDK.
SSNOBODY