Ich versuche, ein Multiarch-Rootfs für ein System einzurichten, auf dem beide Endianess auf demselben Kernel ausgeführt werden können. Natürlich kann ich keine Bibliotheken unterschiedlicher Endianness innerhalb desselben Programms mischen. Darüber hinaus ist das Big-Endian-Rootfs mit µClibc und seinem Dynamic Loader verknüpft, während die Little-Endian-Version mit glibc verknüpft ist.
Ich habe keine Ahnung, wie sich die bekannten Systeme von denen trennen, auf denen sowohl i686 als auch amd64 laufen (auch wenn sie selten eine andere Bytereihenfolge verwenden) .
Aber meine Situation sieht in gewisser Hinsicht ähnlich aus ... es bedeutet, dass:
- Ich kann mit chroot auf ein anderes System wechseln: (
chroot /tmp/rootfs
) - statisch kompilierte Binärdateien können überall ausgeführt werden;
²
example.c:
int main() {return 200;}
²
localhost# gcc -static -Ofast $HOME/example.c -o $HOME/example
localhost# $HOME/example
localhost# echo $?
200
localhost# mv $HOME/example /tmp/rootfs
localhost# chroot /tmp/rootfs /example
localhost# echo $?
200
Also habe ich die folgenden Pfade zu /etc/ld.so.conf hinzugefügt:
/tmp/rootfs/lib
/tmp/rootfs/usr/lib
und ich habe den Dynamic Loader von den anderen Rootfs kopiert: (µClibc benutze ld-uClibc.so)
localhost# ln /tmp/rootfs/lib/ld-linux.so.2 /lib/
localhost# ln /tmp/rootfs/bin/zsh5 /bin/
ld-linux.so.2 ist eine statische Binärdatei, mit der ich jede dynamisch verknüpfte Bibliothek ausführen kann.
localhost# /lib/ld-linux.so.2 /bin/zsh5
localhost# exit
localhost#
Es sieht gut aus, aber die Skripte von portage können so nicht funktionieren. Ich kann binfmt nicht verwenden, da dies eine Schleife erzeugen würde, da /lib/ld-linux.so.2 dieselbe Architektur wie das Ziel hat.
Also dachte ich, der Kernel würde den richtigen ELF-Interpreter automatisch finden und verwenden, aber das tut er nicht:
localhost# zsh5
/bin/zsh5: No such file or directory
Ich kann immer noch µClibc-Programme ausführen:
localhost# busybox
BusyBox v1.22.1 (2014-06-11 08:01:31 UTC) multi-call binary.
BusyBox is copyrighted by many authors between 1998-2012.
Licensed under GPLv2. See source distribution for detailed
copyright notices.
Usage: busybox [function [arguments]...]
or: busybox --list[-full]
or: busybox --install [-s] [DIR]
or: function [arguments]...
BusyBox is a multi-call binary that combines many common Unix
utilities into a single executable. Most people will create a
link to busybox for each function they wish to use and BusyBox
will act like whatever it was invoked as.
Currently defined functions:
[, [[, acpid, addgroup, adduser, adjtimex, ar, arp, arping, ash, awk, base64, basename, bb, bbconfig, bbsh, blkid, blockdev, brctl, bunzip2, bzcat, bzip2, cal, cat, catv, chat, chattr, chgrp, chmod, chown, chpasswd, chpst,
chroot, chrt, chvt, cksum, clear, cmp, comm, conspy, cp, cpio, crond, cryptpw, cttyhack, cut, date, dd, deallocvt, delgroup, deluser, depmod, devmem, df, dhcprelay, diff, dirname, dmesg, dnsdomainname, dos2unix, du, dumpkmap,
dumpleases, echo, ed, egrep, eject, env, envdir, envuidgid, ether-wake, expand, expr, false, fbset, fdflush, fdformat, fdisk, fgconsole, fgrep, find, findfs, flash_eraseall, flash_lock, flash_unlock, flashcp, flock, free,
freeramdisk, fsck, fstrim, fsync, ftpd, fuser, getopt, getty, ginit, grep, groups, gunzip, gzip, halt, hd, hdparm, head, hexdump, hostname, httpd, hwclock, id, ifconfig, ifdown, ifenslave, ifplugd, ifup, init, insmod, install,
ionice, iostat, ip, ipaddr, ipcrm, ipcs, iplink, iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5, last, less, linux32, linux64, linuxrc, ln, loadfont, loadkmap, login, losetup, lpq, lpr, ls, lsattr, lsmod, lsof,
lspci, lsusb, lzcat, lzma, lzop, lzopcat, makedevs, man, md5sum, mdev, mesg, microcom, mkdir, mkdosfs, mke2fs, mkfifo, mkfs.ext2, mkfs.reiser, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, modinfo, modprobe, more, mount,
mountpoint, mpstat, mt, mv, nameif, nanddump, nandwrite, nbd-client, nc, netstat, nice, nmeter, nohup, nslookup, ntpd, openvt, passwd, patch, pgrep, pidof, ping, ping6, pipe_progress, pivot_root, pkill, pmap, popmaildir,
poweroff, powertop, printenv, printf, ps, pscan, pstree, pwd, pwdx, raidautorun, rdate, readahead, readlink, realpath, reboot, renice, reset, resize, rev, rm, rmdir, rmmod, route, rtcwake, runlevel, rx, script, scriptreplay,
sed, sendmail, seq, setarch, setconsole, setfont, setkeycodes, setlogcons, setserial, setsid, setuidgid, sh, sha1sum, sha256sum, sha3sum, sha512sum, showkey, sleep, softlimit, sort, split, start-stop-daemon, stat, strings, stty,
su, sum, swapoff, swapon, switch_root, sync, sysctl, tac, tail, tar, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top, touch, tr, traceroute, traceroute6, true, tty, ttysize, tunctl, tune2fs, ubiattach, ubidetach,
ubimkvol, ubirmvol, ubirsvol, ubiupdatevol, udhcpc, udhcpc6, udhcpd, umount, uname, uncompress, unexpand, uniq, unix2dos, unlzma, unlzop, unxz, unzip, uptime, users, usleep, vconfig, vi, vlock, volname, wall, watch, watchdog,
wc, wget, which, who, whoami, whois, xargs, xz, xzcat, yes, zcat, zcip
Daher verstehe ich nicht, wie Multiarch-Systeme die richtige Interpreterbibliothek für die richtige Architektur verwenden, da dies nicht funktioniert, und mein Verständnis bleibt an diesem Punkt stecken.
/lib/ld-linux.so.2
gegen ein 64-Bit /lib64/ld-linux-x64-64.so.2
.
system it differs which dynamic linker the program is linked to, e.g. a 32-bit program is linked to /lib/ld-linux.so.2 vs a 64-bit /lib64/ld-linux-x64-64.so.2
"bringt.