Hi Simon, On Sun, Apr 30, 2023 at 9:30 AM Simon Glass <s...@chromium.org> wrote: > > We need to place the linker lists, etc. in the .rdata section but this > is not possible with the default linker script. We can only add new > sections, which causes Windows to give an "Exec format error" error. > > Add a rule to create a new linker script, by obtaining the one from > the linker and adding some things to the end of the .rdata section.
I am not sure I understand this. So the arch/sandbox/cpu/u-boot.lds does not work for MSYS2? > > Signed-off-by: Simon Glass <s...@chromium.org> > --- > > Changes in v2: > - Add an awk script to augment the built-in link script > > Makefile | 17 ++++++++++++----- > arch/sandbox/config.mk | 19 ++++++++++++++++++- > arch/sandbox/cpu/u-boot-pe.lds.in | 25 +++++++++++++++++++++++++ > scripts/add_to_rdata.awk | 25 +++++++++++++++++++++++++ > 4 files changed, 80 insertions(+), 6 deletions(-) > create mode 100644 arch/sandbox/cpu/u-boot-pe.lds.in > create mode 100644 scripts/add_to_rdata.awk > > diff --git a/Makefile b/Makefile > index a328652f0f23..760c143049aa 100644 > --- a/Makefile > +++ b/Makefile > @@ -1734,6 +1734,12 @@ else > u-boot-keep-syms-lto := > endif > > +ifeq ($(MSYS_VERSION),0) > +add_ld_script := -T u-boot.lds > +else > +add_ld_script := u-boot.lds MSYS2 does not need "-T"? > +endif > + > # Rule to link u-boot > # May be overridden by arch/$(ARCH)/config.mk > ifeq ($(LTO_ENABLE),y) > @@ -1742,7 +1748,7 @@ quiet_cmd_u-boot__ ?= LTO $@ > $(CC) -nostdlib -nostartfiles > \ > $(LTO_FINAL_LDFLAGS) $(c_flags) > \ > $(KBUILD_LDFLAGS:%=-Wl,%) $(LDFLAGS_u-boot:%=-Wl,%) -o $@ > \ > - -T u-boot.lds $(u-boot-init) > \ > + $(add_ld_script) $(u-boot-init) > \ > -Wl,--whole-archive > \ > $(u-boot-main) > \ > $(u-boot-keep-syms-lto) > \ > @@ -1753,7 +1759,7 @@ quiet_cmd_u-boot__ ?= LTO $@ > else > quiet_cmd_u-boot__ ?= LD $@ > cmd_u-boot__ ?= $(LD) $(KBUILD_LDFLAGS) $(LDFLAGS_u-boot) -o $@ > \ > - -T u-boot.lds $(u-boot-init) > \ > + $(add_ld_script) $(u-boot-init) > \ > --whole-archive > \ > $(u-boot-main) > \ > --no-whole-archive > \ > @@ -1905,10 +1911,11 @@ endif > # prepare2 creates a makefile if using a separate output directory > prepare2: prepare3 outputmakefile cfg > > +# Allow the linker script to be generated from LDSCRIPT_IN > prepare1: prepare2 $(version_h) $(timestamp_h) $(dt_h) $(env_h) \ > - include/config/auto.conf > -ifeq ($(wildcard $(LDSCRIPT)),) > - @echo >&2 " Could not find linker script." > + include/config/auto.conf $(if $(LDSCRIPT_IN),$(LDSCRIPT)) > +ifeq ($(wildcard $(LDSCRIPT))$(LDSCRIPT_IN),) > + @echo >&2 " Could not find linker script $(LDSCRIPT)" > @/bin/false > endif > > diff --git a/arch/sandbox/config.mk b/arch/sandbox/config.mk > index 2d184c5f652a..c97c39d4301b 100644 > --- a/arch/sandbox/config.mk > +++ b/arch/sandbox/config.mk > @@ -1,4 +1,4 @@ > -# SPDX-License-Identifier: GPL-2.0+ > + # SPDX-License-Identifier: GPL-2.0+ > # Copyright (c) 2011 The Chromium OS Authors. > > PLATFORM_CPPFLAGS += -D__SANDBOX__ -U_FORTIFY_SOURCE > @@ -71,3 +71,20 @@ EFI_CRT0 := crt0_sandbox_efi.o > EFI_RELOC := reloc_sandbox_efi.o > AFLAGS_crt0_sandbox_efi.o += -DHOST_ARCH="$(HOST_ARCH)" > CFLAGS_reloc_sandbox_efi.o += -DHOST_ARCH="$(HOST_ARCH)" > + > +ifneq ($(MSYS_VERSION),0) > +LDSCRIPT := $(objtree)/u-boot-pe.lds > + > +AWK_RDATA := ${srctree}/scripts/add_to_rdata.awk > +LDSCRIPT_IN := ${srctree}/arch/sandbox/cpu/u-boot-pe.lds.in > + > +quiet_cmd_gen_lds = GEN LDS $@ > +cmd_gen_lds = echo "int main() { return 0; }" | $(CC) -x c - -Wl,-verbose | \ > + awk -f $(AWK_RDATA) -v INFILE=$< >$@ > + > +# Write out the contents of INFILE immediately before the close of the .rdata > +# block > +$(LDSCRIPT): $(LDSCRIPT_IN) $(AWK_RDATA) FORCE > + $(call if_changed,gen_lds) > + > +endif > diff --git a/arch/sandbox/cpu/u-boot-pe.lds.in > b/arch/sandbox/cpu/u-boot-pe.lds.in > new file mode 100644 > index 000000000000..0ec7ef3bb350 > --- /dev/null > +++ b/arch/sandbox/cpu/u-boot-pe.lds.in > @@ -0,0 +1,25 @@ > + /* U-Boot additions from here on */ > + . = ALIGN(4); > + KEEP(*(SORT(__u_boot_list*))); > + > + *(_u_boot_sandbox_getopt_start) > + *(_u_boot_sandbox_getopt) > + *(_u_boot_sandbox_getopt_end) > + > + *(___efi_runtime_start) > + *(efi_runtime_text) > + *(efi_runtime_data) > + *(___efi_runtime_stop) > + > + *(___efi_runtime_rel_start) > + *(.relefi_runtime_text) > + *(.relefi_runtime_data) > + *(___efi_runtime_rel_stop) > + > + . = ALIGN(4); > + *(.rodata.ttf.init) > + *(.rodata.splash.init) > + *(.rodata.helloworld.init) > + *(.dtb.init.rodata) > + > + /* U-Boot additions end */ > diff --git a/scripts/add_to_rdata.awk b/scripts/add_to_rdata.awk > new file mode 100644 > index 000000000000..43fdfe8bb789 > --- /dev/null > +++ b/scripts/add_to_rdata.awk > @@ -0,0 +1,25 @@ > +# SPDX-License-Identifier: GPL-2.0+ > +# > +# Copyright 2023 Google, Inc > +# > +# Awk script to extract the default link script from the linker and write out > +# the contents of INFILE immediately before the close of the .rdata section. > + > +# to a C string which can be compiled into U-Boot. > + > +# INS = 1 if we are inside the link script (delimited by ======== lines) > +# INR = 1 if we are inside the .rdata section > + > +# When we see } while in the .rdata part of the link script, insert INFILE > +/}/ { if (INS && INR) { while ((getline < INFILE) > 0) {print}; DONE=1; > INR=0; $0="}"; }} > + > +# Find start and end of link script > +/===================/ { if (INS) exit; INS=1; next; } > + > +# If inside the link script, print each line > +{ if (INS) print; } > + > +# Detect the .rdata section and get ready to insert INFILE when we see the > end } > +/\.rdata.*:/ {INR=1; } > + > +END { if (!DONE) { print "add_to_rdata.awk: Could not find link script in ld > output" > "/dev/stderr"; exit 1;} } > -- Regards, Bin