On 24 June 2015 at 17:21, Cohen, Eugene <eug...@hp.com> wrote:
>> +   * Since some AArch64 code is aligned to 0x800 (i.e., the vector table), 
>> we
>> +   * need to use at least this alignment for .text.
>
> >From what I can see the vector table code uses .align directives to increase 
> >the alignment size which is propagated into the resulting ELF.  The PE-COFF 
> >conversion respects this so I don't believe it is necessary to impose this 
> >alignment requirement.
>
> We are very sensitive to code size in SEC and PEI which are typically 
> uncompressed and XIP so I would ask that we keep the alignment padding to a 
> minimum (see Andrew's email about this topic).
>

Indeed. If we end up agreeing that using the small C model has its
merits, we would ideally implement it in the following way:
- use 'large' C model for SEC and PEI, with the smallest alignment
that we can support
- use 'small' C model for boot time modules, using the linker script
in this patch
- use 'small' C model and 64 KB alignment (with an alternative linker
script) for runtime modules, so that we can benefit from the
Properties Table feature, which allows code regions to be mapped R-X
and data regions to be mapped RW-

I know this is a it of a jumble of related but not entirely similar
issues. I was just triggered by your patch, and decided to experiment
and come up with something that addresses all these issues.

-- 
Ard.


> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
> Sent: Tuesday, June 23, 2015 9:31 AM
> To: edk2-devel@lists.sourceforge.net; olivier.mar...@arm.com; 
> leif.lindh...@linaro.org
> Subject: [edk2] [RFC PATCH 2/4] BaseTools: AArch64: use an explicit linker 
> script
>
> Instead of relying on the builtin linker script of GNU ld, which may vary 
> based on binutils version (which is not tightly coupled to the GCC version) 
> and linker command line options, introduce a linker script for AArch64 to be 
> used by all GCC/binutils versions.
>
> The script is laid out such that both the file and memory layout are 
> identical between the ELF intermediate file and the final PE/COFF file. This 
> should prevent problems with debuggers and other tooling that are ELF based.
> It also places the .text section such that, provided that the entire image is 
> loaded at a 4 KB aligned offset, the build time and runtime relative 
> alignment with respect to the nearest 4 KB boundary is the same. This allows 
> the 'small' GCC C model to be used.
>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
> ---
>  BaseTools/Conf/tools_def.template       | 23 +++++++++++++----------
>  BaseTools/Scripts/gcc-aarch64-ld-script | 33 
> +++++++++++++++++++++++++++++++++
>  2 files changed, 46 insertions(+), 10 deletions(-)
>
> diff --git a/BaseTools/Conf/tools_def.template 
> b/BaseTools/Conf/tools_def.template
> index fd7b4b55e8ba..9ba8d38a1791 100644
> --- a/BaseTools/Conf/tools_def.template
> +++ b/BaseTools/Conf/tools_def.template
> @@ -3821,9 +3821,12 @@ DEFINE GCC_ARM_CC_FLAGS            = 
> DEF(GCC_ALL_CC_FLAGS) -mword-relocations -m
>  DEFINE GCC_AARCH64_CC_FLAGS        = DEF(GCC_ALL_CC_FLAGS) -mcmodel=large 
> -mlittle-endian -fno-short-enums -save-temps -fverbose-asm -fsigned-char  
> -ffunction-sections -fdata-sections -fomit-frame-pointer -fno-builtin 
> -Wno-address
>  DEFINE GCC_DLINK_FLAGS_COMMON      = -nostdlib --pie
>  DEFINE GCC_IA32_X64_DLINK_COMMON   = DEF(GCC_DLINK_FLAGS_COMMON) 
> --gc-sections
> -DEFINE GCC_ARM_AARCH64_DLINK_COMMON= -Ttext=0x0 --emit-relocs -nostdlib 
> --gc-sections -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map 
> $(DEST_DIR_DEBUG)/$(BASE_NAME).map
> +DEFINE GCC_ARM_AARCH64_DLINK_COMMON= --emit-relocs -nostdlib --gc-sections 
> -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map 
> $(DEST_DIR_DEBUG)/$(BASE_NAME).map
> +DEFINE GCC_ARM_DLINK_FLAGS         = DEF(GCC_ARM_AARCH64_DLINK_COMMON) 
> -Ttext=0x0
> +DEFINE GCC_AARCH64_DLINK_FLAGS     = DEF(GCC_ARM_AARCH64_DLINK_COMMON) 
> --script=$(EDK_TOOLS_PATH)/Scripts/gcc-aarch64-ld-script
>  DEFINE GCC_IA32_X64_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_COMMON) --entry 
> _ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) -DEFINE 
> GCC_ARM_AARCH64_ASLDLINK_FLAGS = DEF(GCC_ARM_AARCH64_DLINK_COMMON) --entry 
> ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT)
> +DEFINE GCC_ARM_ASLDLINK_FLAGS      = DEF(GCC_ARM_DLINK_FLAGS) --entry 
> ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT)
> +DEFINE GCC_AARCH64_ASLDLINK_FLAGS  = DEF(GCC_AARCH64_DLINK_FLAGS)
> +--entry ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT)
>  DEFINE GCC_IA32_X64_DLINK_FLAGS    = DEF(GCC_IA32_X64_DLINK_COMMON) --entry 
> _$(IMAGE_ENTRY_POINT) --file-alignment 0x20 --section-alignment 0x20 -Map 
> $(DEST_DIR_DEBUG)/$(BASE_NAME).map
>  DEFINE GCC_IPF_DLINK_FLAGS         = -nostdlib -O2 --gc-sections --dll 
> -static --entry $(IMAGE_ENTRY_POINT) --undefined $(IMAGE_ENTRY_POINT) -Map 
> $(DEST_DIR_DEBUG)/$(BASE_NAME).map
>  DEFINE GCC_IPF_OBJCOPY_FLAGS       = -I elf64-ia64-little -O efi-bsdrv-ia64
> @@ -3866,8 +3869,8 @@ DEFINE GCC46_X64_DLINK_FLAGS         = 
> DEF(GCC45_X64_DLINK_FLAGS)
>  DEFINE GCC46_ASM_FLAGS               = DEF(GCC45_ASM_FLAGS)
>  DEFINE GCC46_ARM_ASM_FLAGS           = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) 
> DEF(GCC_ASM_FLAGS) -mlittle-endian
>  DEFINE GCC46_ARM_CC_FLAGS            = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) 
> DEF(GCC44_ALL_CC_FLAGS) DEF(GCC_ARM_CC_FLAGS) -fstack-protector
> -DEFINE GCC46_ARM_DLINK_FLAGS         = DEF(GCC_ARM_AARCH64_DLINK_COMMON) 
> --oformat=elf32-littlearm
> -DEFINE GCC46_ARM_ASLDLINK_FLAGS      = DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS) 
> --oformat=elf32-littlearm
> +DEFINE GCC46_ARM_DLINK_FLAGS         = DEF(GCC_ARM_DLINK_FLAGS) 
> --oformat=elf32-littlearm
> +DEFINE GCC46_ARM_ASLDLINK_FLAGS      = DEF(GCC_ARM_ASLDLINK_FLAGS) 
> --oformat=elf32-littlearm
>
>  DEFINE GCC47_IA32_CC_FLAGS           = DEF(GCC46_IA32_CC_FLAGS)
>  DEFINE GCC47_X64_CC_FLAGS            = DEF(GCC46_X64_CC_FLAGS)
> @@ -3881,9 +3884,9 @@ DEFINE GCC47_AARCH64_ASM_FLAGS       = $(ARCHASM_FLAGS) 
> $(PLATFORM_FLAGS) DEF(GC
>  DEFINE GCC47_ARM_CC_FLAGS            = DEF(GCC46_ARM_CC_FLAGS) 
> -mno-unaligned-access
>  DEFINE GCC47_AARCH64_CC_FLAGS        = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) 
> DEF(GCC44_ALL_CC_FLAGS) DEF(GCC_AARCH64_CC_FLAGS)
>  DEFINE GCC47_ARM_DLINK_FLAGS         = DEF(GCC46_ARM_DLINK_FLAGS)
> -DEFINE GCC47_AARCH64_DLINK_FLAGS     = DEF(GCC_ARM_AARCH64_DLINK_COMMON)
> +DEFINE GCC47_AARCH64_DLINK_FLAGS     = DEF(GCC_AARCH64_DLINK_FLAGS)
>  DEFINE GCC47_ARM_ASLDLINK_FLAGS      = DEF(GCC46_ARM_ASLDLINK_FLAGS)
> -DEFINE GCC47_AARCH64_ASLDLINK_FLAGS  = DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS)
> +DEFINE GCC47_AARCH64_ASLDLINK_FLAGS  = DEF(GCC_AARCH64_ASLDLINK_FLAGS)
>
>  DEFINE GCC48_IA32_CC_FLAGS           = DEF(GCC47_IA32_CC_FLAGS)
>  DEFINE GCC48_X64_CC_FLAGS            = DEF(GCC47_X64_CC_FLAGS)
> @@ -3897,9 +3900,9 @@ DEFINE GCC48_AARCH64_ASM_FLAGS       = 
> DEF(GCC47_AARCH64_ASM_FLAGS)
>  DEFINE GCC48_ARM_CC_FLAGS            = DEF(GCC47_ARM_CC_FLAGS)
>  DEFINE GCC48_AARCH64_CC_FLAGS        = DEF(GCC47_AARCH64_CC_FLAGS)
>  DEFINE GCC48_ARM_DLINK_FLAGS         = DEF(GCC47_ARM_DLINK_FLAGS)
> -DEFINE GCC48_AARCH64_DLINK_FLAGS     = DEF(GCC_ARM_AARCH64_DLINK_COMMON)
> +DEFINE GCC48_AARCH64_DLINK_FLAGS     = DEF(GCC47_AARCH64_DLINK_FLAGS)
>  DEFINE GCC48_ARM_ASLDLINK_FLAGS      = DEF(GCC47_ARM_ASLDLINK_FLAGS)
> -DEFINE GCC48_AARCH64_ASLDLINK_FLAGS  = DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS)
> +DEFINE GCC48_AARCH64_ASLDLINK_FLAGS  =
> +DEF(GCC47_AARCH64_ASLDLINK_FLAGS)
>
>  DEFINE GCC49_IA32_CC_FLAGS           = DEF(GCC48_IA32_CC_FLAGS)
>  DEFINE GCC49_X64_CC_FLAGS            = DEF(GCC48_X64_CC_FLAGS)
> @@ -3913,9 +3916,9 @@ DEFINE GCC49_AARCH64_ASM_FLAGS       = 
> DEF(GCC48_AARCH64_ASM_FLAGS)
>  DEFINE GCC49_ARM_CC_FLAGS            = DEF(GCC48_ARM_CC_FLAGS)
>  DEFINE GCC49_AARCH64_CC_FLAGS        = DEF(GCC48_AARCH64_CC_FLAGS)
>  DEFINE GCC49_ARM_DLINK_FLAGS         = DEF(GCC48_ARM_DLINK_FLAGS)
> -DEFINE GCC49_AARCH64_DLINK_FLAGS     = DEF(GCC_ARM_AARCH64_DLINK_COMMON)
> +DEFINE GCC49_AARCH64_DLINK_FLAGS     = DEF(GCC48_AARCH64_DLINK_FLAGS)
>  DEFINE GCC49_ARM_ASLDLINK_FLAGS      = DEF(GCC48_ARM_ASLDLINK_FLAGS)
> -DEFINE GCC49_AARCH64_ASLDLINK_FLAGS  = DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS)
> +DEFINE GCC49_AARCH64_ASLDLINK_FLAGS  =
> +DEF(GCC48_AARCH64_ASLDLINK_FLAGS)
>
>  
> ####################################################################################
>  #
> diff --git a/BaseTools/Scripts/gcc-aarch64-ld-script 
> b/BaseTools/Scripts/gcc-aarch64-ld-script
> new file mode 100644
> index 000000000000..cf09b63d916f
> --- /dev/null
> +++ b/BaseTools/Scripts/gcc-aarch64-ld-script
> @@ -0,0 +1,33 @@
> +SECTIONS {
> +
> +  /*
> +   * By positioning the .text section at 0x800, and aligning it at 0x800, it
> +   * is guaranteed to end up at 0x800 offset in the resulting PE/COFF image 
> as
> +   * well. This allows us to use GCC's 'small' C model, which uses PC 
> relative
> +   * ADRP/ADD and ADRP/LDR pairs to reference global symbols, instead of 
> 64-bit
> +   * absolute addresses.
> +   * Since some AArch64 code is aligned to 0x800 (i.e., the vector table), we
> +   * need to use at least this alignment for .text. The actual PE/COFF 
> headers
> +   * are only around 0x260 bytes in size, so we are wasting around 1.5 KB 
> here.
> +   */
> +  .text 0x800 : ALIGN(0x800) {
> +    *(.text .text.* .rodata .rodata.*)
> +  }
> +  .data : ALIGN(0x40) {
> +    *(.data .data.*)
> +    *(.bss .bss.* *COM*)
> +  }
> +  .rela ALIGN(0x20) : {
> +    *(.rela .rela.*)
> +  }
> +
> +  /DISCARD/ : {
> +    *(.note.GNU-stack)
> +    *(.interp)
> +    *(.dynsym)
> +    *(.dynstr)
> +    *(.dynamic)
> +    *(.hash)
> +    *(.comment)
> +  }
> +}
> --
> 1.9.1
>
>
> ------------------------------------------------------------------------------
> Monitor 25 network devices or servers for free with OpManager!
> OpManager is web-based network management software that monitors
> network devices and physical & virtual servers, alerts via email & sms
> for fault. Monitor 25 devices for free with no restriction. Download now
> http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>
> ------------------------------------------------------------------------------
> Monitor 25 network devices or servers for free with OpManager!
> OpManager is web-based network management software that monitors
> network devices and physical & virtual servers, alerts via email & sms
> for fault. Monitor 25 devices for free with no restriction. Download now
> http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------------------------------------------------------
Monitor 25 network devices or servers for free with OpManager!
OpManager is web-based network management software that monitors 
network devices and physical & virtual servers, alerts via email & sms 
for fault. Monitor 25 devices for free with no restriction. Download now
http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to