diff mbox series

[V2] lib32-64k-pagesize.inc: add conf for building 32bit binary with 64K alignment

Message ID 20241225030437.972359-1-Qi.Chen@windriver.com
State New
Headers show
Series [V2] lib32-64k-pagesize.inc: add conf for building 32bit binary with 64K alignment | expand

Commit Message

ChenQi Dec. 25, 2024, 3:04 a.m. UTC
From: Chen Qi <Qi.Chen@windriver.com>

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

Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
---
 meta/conf/distro/include/lib32-64k-pagesize.inc | 4 ++++
 1 file changed, 4 insertions(+)
 create mode 100644 meta/conf/distro/include/lib32-64k-pagesize.inc
diff mbox series

Patch

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 @@ 
+MAX_PAGE_SIZE_FLAGS ?= " -Wl,-z,max-page-size=0x10000"
+MAX_PAGE_SIZE_FLAGS:pn-lib32-systemd-boot = ""
+CFLAGS:append:virtclass-multilib-lib32 = "${MAX_PAGE_SIZE_FLAGS}"
+LDFLAGS:append:virtclass-multilib-lib32 = "${MAX_PAGE_SIZE_FLAGS}"