On 15.01.25 10:34, Ilias Apalodimas wrote:
On Wed, 15 Jan 2025 at 10:53, Heinrich Schuchardt
<[email protected]> wrote:

On 15.01.25 09:06, Ilias Apalodimas wrote:
Hi Heinrich


On Tue, 14 Jan 2025 at 12:30, Heinrich Schuchardt
<[email protected]> wrote:

Use the same include as arm64 for the linker script.

Adjust the 32-bit ARM PE-COFF header accordingly and harmonize it with the
64-bit ARM header.

Signed-off-by: Heinrich Schuchardt <[email protected]>
---
   arch/arm/lib/crt0_arm_efi.S  | 37 ++++++++++---------
   arch/arm/lib/elf_arm_efi.lds | 71 +-----------------------------------
   2 files changed, 20 insertions(+), 88 deletions(-)

diff --git a/arch/arm/lib/crt0_arm_efi.S b/arch/arm/lib/crt0_arm_efi.S
index b5dfd4e3819..590fcf515da 100644
--- a/arch/arm/lib/crt0_arm_efi.S
+++ b/arch/arm/lib/crt0_arm_efi.S
@@ -14,11 +14,11 @@
          /*
           * Magic "MZ" signature for PE/COFF
           */
-       .globl  image_base
-image_base:
+       .globl  ImageBase
+ImageBase:
          .short  IMAGE_DOS_SIGNATURE             /* 'MZ' */
          .skip   58                              /* 'MZ' + pad + offset == 64 
*/
-       .long   pe_header - image_base          /* Offset to the PE header */
+       .long   pe_header - ImageBase           /* Offset to the PE header */
   pe_header:
          .long   IMAGE_NT_SIGNATURE              /* 'PE' */
   coff_header:
@@ -38,16 +38,16 @@ optional_header:
          .short  IMAGE_NT_OPTIONAL_HDR32_MAGIC   /* PE32 format */
          .byte   0x02                            /* MajorLinkerVersion */
          .byte   0x14                            /* MinorLinkerVersion */
-       .long   _edata - _start                 /* SizeOfCode */
+       .long   _etext - _start                 /* SizeOfCode */

Was that an error all along? Or the boundaries changed by using the
include file?

According to https://learn.microsoft.com/en-us/windows/win32/debug/pe-format

SizeOfCode:
"The size of the code (text) section, or the sum of all code sections if
there are multiple sections."

We only have one code section.

Looking at EDK2's Shell.efi SizeOfCode equals the VirtualSize of the
.text section. It does not include the .data section.


Hmm that's interesting. gnu-efi includes .data AFAICT.
Looking at the pe/coff spec there's SizeOfCode and
SizeOfInitializedData (for .data) and SizeOfUninitializedData (for
.bss).
But in both gnu-efi and U-Boot we define those two as 0 though. So I
think we should either keep SizeOfData as is, or define it as you
propose and also define SizeOfInitializedData and
SizeOfUninitializedData correctly -- and I don't know if the latter
will have any implication on loaders.

Arm64 and RISC-V are already using SizeOfCode = _etext - _start. This patch only followed up on 32-bit ARM.

We should follow the example of EDK II and fill SizeOfInitializedData.

We are putting the _bss sections into .data. So SizeOfUninitializedData should be kept at 0.

Best regards

Heinrich


Cheers
/Ilias
Best regards

Heinrich


          .long   0                               /* SizeOfInitializedData */
          .long   0                               /* SizeOfUninitializedData */
-       .long   _start - image_base             /* AddressOfEntryPoint */
-       .long   _start - image_base             /* BaseOfCode */
+       .long   _start - ImageBase              /* AddressOfEntryPoint */
+       .long   _start - ImageBase              /* BaseOfCode */
          .long   0                               /* BaseOfData */
[...]

Other than that it looks ok

Thanks for cleaning this up!
/Ilias


Reply via email to