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

Reply via email to