32-bit executables on aarch64?

Mark Millard marklmi at yahoo.com
Wed Mar 31 20:11:06 UTC 2021


On 2021-Mar-31, at 12:39, Mark Millard <marklmi at yahoo.com> wrote:

> On 2021-Mar-31, at 11:26, Thomas David Rivers <rivers at dignus.com> wrote:
> 
>> marklmi at yahoo.com  wrote:
>>> armv7# file `which uname`
>>> /usr/bin/uname: ELF 32-bit LSB executable, ARM, EABI5 version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, FreeBSD-style, for FreeBSD 14.0 (1400005), not stripped
>>> 
>>> armv7# uname -apKU
>>> FreeBSD RPi4B 14.0-CURRENT FreeBSD 14.0-CURRENT mm-src-n245445-def0058cc690 GENERIC-NODBG  arm armv7 1400005 1400005
>>> 
>>> (I did both buildworld builds from the same source.)
>>> 
>>> There is no lib32 implementation for aarch64.
>>> So, direct execution of code for armv7 FreeBSD
>>> without being in such a chroot is not available.
>>> (I ignore qemu and the like here.)
>>> 
>>> ===
>>> Mark Millard
>> 
>> Ah!
>> 
>> So, the kernel _can_ run a 32-bit executable...
> 
> Only in a chroot to an armv7 world, not directly.
> You can use the chroot's system compiler/toolchain
> to build armv7 materials for use in the chroot.
> 
> powerpc64 FreeBSD on on PowerMacs has a lib32 in
> the powerpc64 world and so allows 32-bit powerpc
> FreeBSD coded to be used either with or without
> a choot being in use to do so. amd64 and i386 are
> similar. More than the kernel is involved in
> avoiding the need for a chroot to be in use.
> 
> powerpc64 allows building without lib32 and
> without it the handling is like for aarch64
> and armv7.
> 
>> but we just can't
>> build one on an aarch64 machine...
> 
> Without a lib32 in the aarch64 world, the armv7
> FreeBSD code use has to be from inside an
> appropriate chroot as far as I know.
> 
>> I wonder if I can "cross-build" an LLVM/dcc for armv7 and just
>> cross-compile to get a 32-bit executable that executes on 
>> a 64-bit kernel.. perhaps with -static to avoid any runtime problems?
> 
> armv7 FreeBSD code use: only in an appropriate
> chroot unless the lib32 has been implmented
> (as is installed).

Some powerpc64 vs. aarch64 comparisons/contrasts:

powerpc64 (built with lib32):

# ls -ldt /libexec/*ld*
-r-xr-xr-x  1 root  wheel  143412 Mar  3 19:12 /libexec/ld-elf32.so.1
-r-xr-xr-x  1 root  wheel  151528 Mar  3 19:12 /libexec/ld-elf.so.1

The ld-elf32.so.1 is generated by the lib32 build during buildworld
(and later is installed).

# file /libexec/ld-elf*.so.1
/libexec/ld-elf.so.1:   ELF 64-bit MSB shared object, 64-bit PowerPC or cisco 7500, OpenPOWER ELF V2 ABI, version 1 (FreeBSD), dynamically linked, for FreeBSD 14.0 (1400005), not stripped
/libexec/ld-elf32.so.1: ELF 32-bit MSB shared object, PowerPC or cisco 4500, version 1 (FreeBSD), dynamically linked, for FreeBSD 14.0 (1400005), not stripped


aarch64 (no option to build lib32):

# ls -ldt /libexec/*ld*
-r-xr-xr-x  1 root  wheel  136600 Mar  3 20:37 /libexec/ld-elf.so.1

# file /libexec/ld-elf*.so.1
/libexec/ld-elf.so.1:     ELF 64-bit LSB shared object, ARM aarch64, version 1 (FreeBSD), dynamically linked, for FreeBSD 14.0 (1400005), not stripped

So aarch64 FreeBSD just does not have the supporting infrastructure
in place to run armv7 FreeBSD code directly.


But powerpc64 built with lib32 also has:

# ls -Tld /usr/lib32/* | more
-r--r--r--  1 root  wheel      7816 Mar 12 14:07:13 2021 /usr/lib32/Scrt1.o
-r--r--r--  1 root  wheel      7772 Mar 12 14:07:13 2021 /usr/lib32/crt1.o
-r--r--r--  1 root  wheel      3488 Mar 12 14:07:13 2021 /usr/lib32/crtbegin.o
-r--r--r--  1 root  wheel      3852 Mar 12 14:07:13 2021 /usr/lib32/crtbeginS.o
-r--r--r--  1 root  wheel      3488 Mar 12 14:07:13 2021 /usr/lib32/crtbeginT.o
-r--r--r--  1 root  wheel      2828 Mar 12 14:07:13 2021 /usr/lib32/crtend.o
-r--r--r--  1 root  wheel      2896 Mar 12 14:07:13 2021 /usr/lib32/crtendS.o
-r--r--r--  1 root  wheel      2184 Mar 12 14:07:13 2021 /usr/lib32/crti.o
-r--r--r--  1 root  wheel      1664 Mar 12 14:07:13 2021 /usr/lib32/crtn.o
-r--r--r--  1 root  wheel      8900 Mar 12 14:07:13 2021 /usr/lib32/crtsavres.o
drwxr-xr-x  2 root  wheel       512 Mar 12 21:29:28 2021 /usr/lib32/dtrace
drwxr-xr-x  2 root  wheel       512 Mar 12 21:29:28 2021 /usr/lib32/engines
-r--r--r--  1 root  wheel      8100 Mar 12 14:07:13 2021 /usr/lib32/gcrt1.o
drwxr-xr-x  2 root  wheel       512 Mar 12 21:29:28 2021 /usr/lib32/geom
drwxr-xr-x  2 root  wheel      1536 Mar 12 21:29:28 2021 /usr/lib32/i18n
-r--r--r--  1 root  wheel     56050 Mar  3 19:13:13 2021 /usr/lib32/lib80211.a
lrwxr-xr-x  1 root  wheel        13 Mar 12 14:07:13 2021 /usr/lib32/lib80211.so -> lib80211.so.1
-r--r--r--  1 root  wheel     22604 Mar 12 14:07:13 2021 /usr/lib32/lib80211.so.1
-r--r--r--  1 root  wheel     57348 Mar  3 19:13:13 2021 /usr/lib32/lib80211_p.a
-r--r--r--  1 root  wheel    494894 Mar  3 19:13:12 2021 /usr/lib32/lib9p.a
lrwxr-xr-x  1 root  wheel        10 Mar 12 14:07:13 2021 /usr/lib32/lib9p.so -> lib9p.so.1
-r--r--r--  1 root  wheel    119288 Mar 12 14:07:13 2021 /usr/lib32/lib9p.so.1
-r--r--r--  1 root  wheel    502702 Mar  3 19:13:12 2021 /usr/lib32/lib9p_p.a
-r--r--r--  1 root  wheel     28658 Mar  3 19:13:12 2021 /usr/lib32/libBlocksRuntime.a
lrwxr-xr-x  1 root  wheel        21 Mar 12 14:07:13 2021 /usr/lib32/libBlocksRuntime.so -> libBlocksRuntime.so.0
-r--r--r--  1 root  wheel     12796 Mar 12 14:07:13 2021 /usr/lib32/libBlocksRuntime.so.0
-r--r--r--  1 root  wheel     30794 Mar  3 19:13:12 2021 /usr/lib32/libBlocksRuntime_p.a
-r--r--r--  1 root  wheel    217736 Mar  3 19:13:12 2021 /usr/lib32/libalias.a
lrwxr-xr-x  1 root  wheel        13 Mar 12 14:07:13 2021 /usr/lib32/libalias.so -> libalias.so.7
. . .
lrwxr-xr-x  1 root  wheel        15 Mar 12 14:07:13 2021 /usr/lib32/pam_rhosts.so -> pam_rhosts.so.6
-r--r--r--  1 root  wheel      5748 Mar 12 14:07:13 2021 /usr/lib32/pam_rhosts.so.6
lrwxr-xr-x  1 root  wheel        15 Mar 12 14:07:13 2021 /usr/lib32/pam_rootok.so -> pam_rootok.so.6
-r--r--r--  1 root  wheel      5132 Mar 12 14:07:13 2021 /usr/lib32/pam_rootok.so.6
lrwxr-xr-x  1 root  wheel        18 Mar 12 14:07:13 2021 /usr/lib32/pam_securetty.so -> pam_securetty.so.6
-r--r--r--  1 root  wheel      6228 Mar 12 14:07:13 2021 /usr/lib32/pam_securetty.so.6
lrwxr-xr-x  1 root  wheel        13 Mar 12 14:07:13 2021 /usr/lib32/pam_self.so -> pam_self.so.6
-r--r--r--  1 root  wheel      5612 Mar 12 14:07:13 2021 /usr/lib32/pam_self.so.6
lrwxr-xr-x  1 root  wheel        12 Mar 12 14:07:13 2021 /usr/lib32/pam_ssh.so -> pam_ssh.so.6
-r--r--r--  1 root  wheel     15504 Mar 12 14:07:13 2021 /usr/lib32/pam_ssh.so.6
lrwxr-xr-x  1 root  wheel        16 Mar 12 14:07:13 2021 /usr/lib32/pam_tacplus.so -> pam_tacplus.so.6
-r--r--r--  1 root  wheel     11036 Mar 12 14:07:13 2021 /usr/lib32/pam_tacplus.so.6
lrwxr-xr-x  1 root  wheel        13 Mar 12 14:07:13 2021 /usr/lib32/pam_unix.so -> pam_unix.so.6
-r--r--r--  1 root  wheel     16324 Mar 12 14:07:13 2021 /usr/lib32/pam_unix.so.6
lrwxr-xr-x  1 root  wheel        16 Mar 12 14:07:13 2021 /usr/lib32/pam_zfs_key.so -> pam_zfs_key.so.6
-r--r--r--  1 root  wheel     20492 Mar 12 14:07:13 2021 /usr/lib32/pam_zfs_key.so.6

where aarch64 has:

# ls -Tld /usr/lib32/*
ls: /usr/lib32/*: No such file or directory

===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)



More information about the freebsd-arm mailing list