]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/GenFw/Elf64Convert.c
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / C / GenFw / Elf64Convert.c
index 90351125893d083392947337c058e19d98cb3ac1..3d6319c821e9f6c0ca1d27946ebb6fa593e9801a 100644 (file)
@@ -4,13 +4,7 @@ Elf64 convert solution
 Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
 Portions copyright (c) 2013-2014, ARM Ltd. All rights reserved.<BR>\r
 \r
-This program and the accompanying materials are licensed and made available\r
-under the terms and conditions of the BSD License which accompanies this\r
-distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -74,7 +68,7 @@ CleanUp64 (
   );\r
 \r
 //\r
-// Rename ELF32 strucutres to common names to help when porting to ELF64.\r
+// Rename ELF32 structures to common names to help when porting to ELF64.\r
 //\r
 typedef Elf64_Shdr Elf_Shdr;\r
 typedef Elf64_Ehdr Elf_Ehdr;\r
@@ -486,7 +480,6 @@ ScanSections64 (
   mNtHdrOffset = mCoffOffset;\r
   switch (mEhdr->e_machine) {\r
   case EM_X86_64:\r
-  case EM_IA_64:\r
   case EM_AARCH64:\r
     mCoffOffset += sizeof (EFI_IMAGE_NT_HEADERS64);\r
   break;\r
@@ -581,7 +574,7 @@ ScanSections64 (
   mCoffOffset = CoffAlign(mCoffOffset);\r
 \r
   if (SectionCount > 1 && mOutImageType == FW_EFI_IMAGE) {\r
-    Warning (NULL, 0, 0, NULL, "Mulitple sections in %s are merged into 1 text section. Source level debug might not work correctly.", mInImageName);\r
+    Warning (NULL, 0, 0, NULL, "Multiple sections in %s are merged into 1 text section. Source level debug might not work correctly.", mInImageName);\r
   }\r
 \r
   //\r
@@ -635,7 +628,7 @@ ScanSections64 (
   }\r
 \r
   if (SectionCount > 1 && mOutImageType == FW_EFI_IMAGE) {\r
-    Warning (NULL, 0, 0, NULL, "Mulitple sections in %s are merged into 1 data section. Source level debug might not work correctly.", mInImageName);\r
+    Warning (NULL, 0, 0, NULL, "Multiple sections in %s are merged into 1 data section. Source level debug might not work correctly.", mInImageName);\r
   }\r
 \r
   //\r
@@ -693,10 +686,6 @@ ScanSections64 (
     NtHdr->Pe32Plus.FileHeader.Machine = EFI_IMAGE_MACHINE_X64;\r
     NtHdr->Pe32Plus.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC;\r
     break;\r
-  case EM_IA_64:\r
-    NtHdr->Pe32Plus.FileHeader.Machine = EFI_IMAGE_MACHINE_IPF;\r
-    NtHdr->Pe32Plus.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC;\r
-    break;\r
   case EM_AARCH64:\r
     NtHdr->Pe32Plus.FileHeader.Machine = EFI_IMAGE_MACHINE_AARCH64;\r
     NtHdr->Pe32Plus.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC;\r
@@ -822,9 +811,9 @@ WriteSections64 (
 \r
       default:\r
         //\r
-        //  Ignore for unkown section type.\r
+        //  Ignore for unknown section type.\r
         //\r
-        VerboseMsg ("%s unknown section type %x. We directly copy this section into Coff file", mInImageName, (unsigned)Shdr->sh_type);\r
+        VerboseMsg ("%s unknown section type %x. We ignore this unknown section type.", mInImageName, (unsigned)Shdr->sh_type);\r
         break;\r
       }\r
     }\r
@@ -1172,7 +1161,28 @@ WriteRelocations64 (
                 + (Rel->r_offset - SecShdr->sh_addr)),\r
                 EFI_IMAGE_REL_BASED_DIR64);\r
               break;\r
-            case R_X86_64_32S:\r
+            //\r
+            // R_X86_64_32 and R_X86_64_32S are ELF64 relocations emitted when using\r
+            //   the SYSV X64 ABI small non-position-independent code model.\r
+            //   R_X86_64_32 is used for unsigned 32-bit immediates with a 32-bit operand\r
+            //   size.  The value is either not extended, or zero-extended to 64 bits.\r
+            //   R_X86_64_32S is used for either signed 32-bit non-rip-relative displacements\r
+            //   or signed 32-bit immediates with a 64-bit operand size.  The value is\r
+            //   sign-extended to 64 bits.\r
+            //   EFI_IMAGE_REL_BASED_HIGHLOW is a PE relocation that uses 32-bit arithmetic\r
+            //   for rebasing an image.\r
+            //   EFI PE binaries declare themselves EFI_IMAGE_FILE_LARGE_ADDRESS_AWARE and\r
+            //   may load above 2GB.  If an EFI PE binary with a converted R_X86_64_32S\r
+            //   relocation is loaded above 2GB, the value will get sign-extended to the\r
+            //   negative part of the 64-bit address space.  The negative part of the 64-bit\r
+            //   address space is unmapped, so accessing such an address page-faults.\r
+            //   In order to support R_X86_64_32S, it is necessary to unset\r
+            //   EFI_IMAGE_FILE_LARGE_ADDRESS_AWARE, and the EFI PE loader must implement\r
+            //   this flag and abstain from loading such a PE binary above 2GB.\r
+            //   Since this feature is not supported, support for R_X86_64_32S (and hence\r
+            //   the small non-position-independent code model) is disabled.\r
+            //\r
+            // case R_X86_64_32S:\r
             case R_X86_64_32:\r
               VerboseMsg ("EFI_IMAGE_REL_BASED_HIGHLOW Offset: 0x%08X",\r
                 mCoffSectionsOffset[RelShdr->sh_info] + (Rel->r_offset - SecShdr->sh_addr));\r