diff options
author | Chen Qi <Qi.Chen@windriver.com> | 2024-12-24 19:04:37 -0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2025-01-11 18:37:16 +0000 |
commit | c1444d286ec75b4d9dbd903c00ada9c23a550e02 (patch) | |
tree | f1bf8ca9f5f8282513d071b0448afa74dc8aa46f /meta/conf/distro | |
parent | 6666815c17a4f2d5165b6c1da7f6af3935e453b0 (diff) | |
download | poky-c1444d286ec75b4d9dbd903c00ada9c23a550e02.tar.gz |
lib32-64k-pagesize.inc: add conf for building 32bit binary with 64K alignment
When 64K page size is enabled, for 32bit multilib, we'll need to build
applications with 64K alignment, otherwise, we'll see errors like below at runtime:
root@marvell-cn10xxx:~# /lib/ld-linux-armhf.so.3
Segmentation fault
marvell-cn10xxx in yocto-kernel-cache enables CONFIG_ARM64_4K_PAGES=y by default.
And the issue was first discovered there.
However, there's a kernel config fragment in yocto-kernel-cache which enableds
64K page size for arm64: arch/arm/arm64-64kb-pages.scc. So it's easy for other
arm64 BSPs to enable this. And when they do so, they'll have problem with
multilib. This patch adds a config file to help people a little bit in such
situation.
The max-page-size option is used to fix this issue. This option is added
to both CFLAGS and LDFLAGS for the purpose of covering as many recipes as
possible.
The systemd-boot (bootloader) is an exception. It uses max-page-size=4096
in src/boot/efi/meson.build and it has a hardcoded value in elf2efi.py.
See https://github.com/systemd/systemd/blob/main/tools/elf2efi.py#L233
and https://github.com/systemd/systemd/blob/main/src/boot/meson.build#L192.
As an example, below are the lines I used in local.conf to enable 64K page size
for qemuarm64 and use mutlilib on that.
KERNEL_FEATURES += "arch/arm/arm64-64kb-pages.scc"
require conf/multilib.conf
MULTILIBS ?= "multilib:lib32"
DEFAULTTUNE:virtclass-multilib-lib32 ?= "armv7athf-neon"
require conf/distro/include/lib32-64k-pagesize.inc
IMAGE_INSTALL:append = " lib32-sysstat"
Note that people will need to enable CONFIG_EXPERT=y to make kernel
recognize 32bit binaries. As qemuarm64 does not enable that by default,
we need to enable that too:
EXTRA_KERNEL_FILES =. "/PATH/TO/build-poky/kernel-cfgs:"
EXTRA_KERNEL_SRC_URI += "file://enable-expert.cfg"
SRC_URI:append:pn-linux-yocto = " ${EXTRA_KERNEL_SRC_URI}"
FILESEXTRAPATHS:prepend:pn-linux-yocto := "${EXTRA_KERNEL_FILES}:"
With the above lines, lib32-sysstat can work correctly on core-image-full-cmdline.
Extra testing include:
1. qemuarm64 enables 64K page size + lib32-core-image-full-cmdline can boot up correctly
2. oe-core world build succeeds
(From OE-Core rev: 77623f3bb413cc5272b69e58a2ddf8f0861a20a8)
Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/conf/distro')
-rw-r--r-- | meta/conf/distro/include/lib32-64k-pagesize.inc | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/meta/conf/distro/include/lib32-64k-pagesize.inc b/meta/conf/distro/include/lib32-64k-pagesize.inc new file mode 100644 index 0000000000..851a3a65a5 --- /dev/null +++ b/meta/conf/distro/include/lib32-64k-pagesize.inc | |||
@@ -0,0 +1,4 @@ | |||
1 | MAX_PAGE_SIZE_FLAGS ?= " -Wl,-z,max-page-size=0x10000" | ||
2 | MAX_PAGE_SIZE_FLAGS:pn-lib32-systemd-boot = "" | ||
3 | CFLAGS:append:virtclass-multilib-lib32 = "${MAX_PAGE_SIZE_FLAGS}" | ||
4 | LDFLAGS:append:virtclass-multilib-lib32 = "${MAX_PAGE_SIZE_FLAGS}" | ||