diff options
author | Tamar Christina <tamar.christina@arm.com> | 2021-11-23 09:36:39 +0000 |
---|---|---|
committer | Tamar Christina <tamar.christina@arm.com> | 2021-11-23 09:36:39 +0000 |
commit | b69c9d41e89498442cb5af5287f378b3583dd445 (patch) | |
tree | 2e7a9d40deb5b1b17bd16b6556f73bd33db3f0a9 /binutils | |
parent | 0c3e266dc283a45a23185be3bb49e4d33987a892 (diff) | |
download | gdb-b69c9d41e89498442cb5af5287f378b3583dd445.zip gdb-b69c9d41e89498442cb5af5287f378b3583dd445.tar.gz gdb-b69c9d41e89498442cb5af5287f378b3583dd445.tar.bz2 |
AArch64: Add support for AArch64 EFI (efi-*-aarch64).
This adds support for efi-*-aarch64 by virtue of adding a new PEI target
pei-aarch64-little. This is not a full target and only exists to support EFI
at this time.
This means that this target does not support relocation processing and is mostly
a container format. This format has been added to elf based aarch64 targets
such that efi images can be made natively on Linux.
However this target is not valid for use with gas but only with objcopy.
With these changes the resulting file is recognized as an efi image by
third party tools:
> pecli info hello.efi
Metadata
================================================================================
MD5: 598c32a778b0f0deebe977fef8578c4e
SHA1: 4580121edd5cb4dc40f51b28f171fd15250df84c
SHA256: 3154bd7cf42433d1c957f6bf55a17ad8c57ed41b29df2d485703349fd6ff1d5c
Imphash:
Size: 47561 bytes
Type: PE32+ executable (EFI application) (stripped to external PDB), for MS Windows
Compile Time: 1970-01-01 00:00:00 (UTC - 0x0 )
Entry point: 0x2000 (section .text)
Sections
================================================================================
Name RWX VirtSize VirtAddr RawAddr RawSize Entropy md5
.text R-X 0x5bb0 0x2000 0x400 0x5c00 6.39 551fbc264256a3f387de8a891500ae0d
.reloc R-- 0xc 0x8000 0x6000 0x200 0.02 0c45f6d812d079821c1d54c09ab89e1d
.data RW- 0x1d88 0x9000 0x6200 0x1e00 4.18 5d1137c09f01289dc62bf754f7290db3
.dynamic RW- 0xf0 0xb000 0x8000 0x200 0.34 5c94ed3206f05a277e6f04fbf131f131
.rela R-- 0xe58 0xc000 0x8200 0x1000 1.87 8b5c6bc30f3acb7ca7bf2e6789d68519
.dynsym R-- 0x138 0xd000 0x9200 0x200 0.96 bdcf5101da51aadc663ca8859f88138c
Imports
================================================================================
Any magic number is based on the Microsoft PE specification [1].
[1] https://docs.microsoft.com/en-us/windows/win32/debug/pe-format
bfd/ChangeLog:
2021-10-21 Tamar Christina <tamar.christina@arm.com>
PR binutils/26206
* .gitignore (pe-aarch64igen.c): New.
* Makefile.am (pei-aarch64.lo, pe-aarch64igen.lo, pei-aarch64.c,
pe-aarch64igen.c): Add support.
* Makefile.in: Likewise.
* bfd.c (bfd_get_sign_extend_vma): Add pei-aarch64-little.
* coff-aarch64.c: New file.
* coffcode.h (coff_set_arch_mach_hook, coff_set_flags,
coff_write_object_contents) Add aarch64 (aarch64_pei_vec) support.
* config.bfd: Likewise.
* configure: Likewise.
* configure.ac: Likewise.
* libpei.h (GET_OPTHDR_IMAGE_BASE, PUT_OPTHDR_IMAGE_BASE,
GET_OPTHDR_SIZE_OF_STACK_RESERVE, PUT_OPTHDR_SIZE_OF_STACK_RESERVE,
GET_OPTHDR_SIZE_OF_STACK_COMMIT, PUT_OPTHDR_SIZE_OF_STACK_COMMIT,
GET_OPTHDR_SIZE_OF_HEAP_RESERVE, PUT_OPTHDR_SIZE_OF_HEAP_RESERVE,
GET_OPTHDR_SIZE_OF_HEAP_COMMIT, PUT_OPTHDR_SIZE_OF_HEAP_COMMIT,
GET_PDATA_ENTRY, _bfd_peAArch64_bfd_copy_private_bfd_data_common,
_bfd_peAArch64_bfd_copy_private_section_data,
_bfd_peAArch64_get_symbol_info, _bfd_peAArch64_only_swap_filehdr_out,
_bfd_peAArch64_print_private_bfd_data_common,
_bfd_peAArch64i_final_link_postscript,
_bfd_peAArch64i_only_swap_filehdr_out, _bfd_peAArch64i_swap_aouthdr_in,
_bfd_peAArch64i_swap_aouthdr_out, _bfd_peAArch64i_swap_aux_in,
_bfd_peAArch64i_swap_aux_out, _bfd_peAArch64i_swap_lineno_in,
_bfd_peAArch64i_swap_lineno_out, _bfd_peAArch64i_swap_scnhdr_out,
_bfd_peAArch64i_swap_sym_in, _bfd_peAArch64i_swap_sym_out,
_bfd_peAArch64i_swap_debugdir_in, _bfd_peAArch64i_swap_debugdir_out,
_bfd_peAArch64i_write_codeview_record,
_bfd_peAArch64i_slurp_codeview_record,
_bfd_peAArch64_print_ce_compressed_pdata): New.
* peXXigen.c (_bfd_XXi_swap_aouthdr_in, _bfd_XXi_swap_aouthdr_out,
pe_print_pdata, _bfd_XX_print_private_bfd_data_common,
_bfd_XX_bfd_copy_private_section_data, _bfd_XXi_final_link_postscript):
Support COFF_WITH_peAArch64,
* pei-aarch64.c: New file.
* peicode.h (coff_swap_scnhdr_in, pe_ILF_build_a_bfd, pe_ILF_object_p):
Support COFF_WITH_peAArch64.
(jtab): Add dummy entry that traps.
* targets.c (aarch64_pei_vec): New.
binutils/ChangeLog:
2021-10-21 Tamar Christina <tamar.christina@arm.com>
PR binutils/26206
* NEWS: Add new support.
* objcopy.c (convert_efi_target): Add efi-*-aarch64 support.
* testsuite/binutils-all/aarch64/pei-aarch64-little.d: New test.
* testsuite/binutils-all/aarch64/pei-aarch64-little.s: New test.
include/ChangeLog:
2021-10-21 Tamar Christina <tamar.christina@arm.com>
PR binutils/26206
* coff/aarch64.h: New file.
* coff/pe.h (IMAGE_FILE_MACHINE_ARM64): New.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/NEWS | 3 | ||||
-rw-r--r-- | binutils/objcopy.c | 7 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/aarch64/pei-aarch64-little.d | 16 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/aarch64/pei-aarch64-little.s | 42 |
4 files changed, 68 insertions, 0 deletions
diff --git a/binutils/NEWS b/binutils/NEWS index 6a2eba8..6b82790 100644 --- a/binutils/NEWS +++ b/binutils/NEWS @@ -15,6 +15,9 @@ * readelf -r dumps RELR relative relocations now. +* Support for efi-app-aarch64, efi-rtdrv-aarch64 and efi-bsdrv-aarch64 has been + added to objcopy in order to enable UEFI development using binutils. + Changes in 2.37: * The readelf tool has a new command line option which can be used to specify diff --git a/binutils/objcopy.c b/binutils/objcopy.c index e0d52d1..6faf8f3 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -4993,6 +4993,13 @@ convert_efi_target (char *efi) /* Change x86_64 to x86-64. */ efi[7] = '-'; } + else if (strcmp (efi + 4, "aarch64") == 0) + { + /* Change aarch64 to aarch64-little. */ + efi = (char *) xrealloc (efi, strlen (efi) + 7); + char *t = "aarch64-little"; + strcpy (efi + 4, t); + } } /* Allocate and return a pointer to a struct section_add, initializing the diff --git a/binutils/testsuite/binutils-all/aarch64/pei-aarch64-little.d b/binutils/testsuite/binutils-all/aarch64/pei-aarch64-little.d new file mode 100644 index 0000000..27cb6e1 --- /dev/null +++ b/binutils/testsuite/binutils-all/aarch64/pei-aarch64-little.d @@ -0,0 +1,16 @@ +#skip: aarch64_be-*-* +#ld: -e0 +#PROG: objcopy +#objcopy: -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel -j .rela -j .rel.* -j .rela.* -j .rel* -j .rela* -j .reloc --target=efi-app-aarch64 +#objdump: -h -f +#name: Check if efi app format is recognized + +.*: file format pei-aarch64-little +architecture: aarch64, flags 0x00000132: +EXEC_P, HAS_SYMS, HAS_LOCALS, D_PAGED +start address 0x0000000000000000 + +Sections: +Idx Name Size VMA LMA File off Algn + 0 \.text 00000030 0[^ ]+ 0[^ ]+ 0[^ ]+ 2\*\*2 + CONTENTS, ALLOC, LOAD, READONLY, CODE diff --git a/binutils/testsuite/binutils-all/aarch64/pei-aarch64-little.s b/binutils/testsuite/binutils-all/aarch64/pei-aarch64-little.s new file mode 100644 index 0000000..dafc5fa --- /dev/null +++ b/binutils/testsuite/binutils-all/aarch64/pei-aarch64-little.s @@ -0,0 +1,42 @@ + .arch armv8-a + .text + .align 2 + .global foo + .type foo, %function +foo: +.LFB0: + .cfi_startproc + sub sp, sp, #16 + .cfi_def_cfa_offset 16 + str w0, [sp, 12] + ldr w0, [sp, 12] + mul w0, w0, w0 + add sp, sp, 16 + .cfi_def_cfa_offset 0 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + .align 2 + .global main + .type main, %function +main: +.LFB1: + .cfi_startproc + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + mov x29, sp + mov w0, 5 + bl foo + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa_offset 0 + ret + .cfi_endproc +.LFE1: + .size main, .-main + .ident "GCC: (fsf-trunk.2870) 12.0.0 20210930 (experimental)" + .section .note.GNU-stack,"",@progbits |