Hi Simon, On Wed, Jul 22, 2015 at 11:49 PM, Simon Glass <s...@chromium.org> wrote: > Add a link script and relocation code for building 64-bit EFI applications.
Nits: linker script > This can be used for the EFI stub. > > Signed-off-by: Simon Glass <s...@chromium.org> > --- > > arch/x86/cpu/efi/elf_x86_64_efi.lds | 87 +++++++++++++++++++++++++++++++++++ > arch/x86/lib/reloc_x86_64.c | 90 > +++++++++++++++++++++++++++++++++++++ > 2 files changed, 177 insertions(+) > create mode 100644 arch/x86/cpu/efi/elf_x86_64_efi.lds > create mode 100644 arch/x86/lib/reloc_x86_64.c > > diff --git a/arch/x86/cpu/efi/elf_x86_64_efi.lds > b/arch/x86/cpu/efi/elf_x86_64_efi.lds > new file mode 100644 > index 0000000..369f146 > --- /dev/null > +++ b/arch/x86/cpu/efi/elf_x86_64_efi.lds > @@ -0,0 +1,87 @@ > +/* > + * U-Boot EFI link script > + * Ditto. > + * SPDX-License-Identifier: bsd-2-clause > + * > + * Modified from usr/lib32/elf_ia32_efi.lds in gnu-efi I guess you want to say: usr/lib32/elf_x86_64_efi.lds > + */ > + > +#include <config.h> > + > +OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") > +OUTPUT_ARCH(i386:x86-64) > +ENTRY(_start) > +SECTIONS > +{ > + . = 0x0; We don't have this line in the elf_ia32_efi.lds. Can this be removed. Or we need add the same in the 32-bit lds. (BTW: I checked gnu-efi, it has this line) > + ImageBase = .; CamelCase > + .hash : { *(.hash) } /* this MUST come first! */ > + . = ALIGN(4096); > + .eh_frame : { > + *(.eh_frame) > + } > + > + . = ALIGN(4096); > + > + .text : { > + *(.text) > + *(.text.*) > + *(.gnu.linkonce.t.*) > + } > + > + . = ALIGN(4096); > + > + .reloc : { > + *(.reloc) > + } > + > + . = ALIGN(4096); > + > + .data : { > + *(.rodata*) > + *(.got.plt) > + *(.got) > + *(.data*) > + *(.sdata) > + /* the EFI loader doesn't seem to like a .bss section, so we > stick > + * it all into .data: */ > + *(.sbss) > + *(.scommon) > + *(.dynbss) > + *(.bss) > + *(COMMON) > + *(.rel.local) > + > + /* U-Boot lists and device tree */ > + . = ALIGN(8); > + KEEP(*(SORT(.u_boot_list*))); > + . = ALIGN(8); > + KEEP(*(.dtb*)); > + /* Keep U-Boot payload */ > + . = ALIGN(8); > + KEEP(*(.u_boot_bin.*)); > + } > + > + . = ALIGN(4096); > + .dynamic : { *(.dynamic) } > + . = ALIGN(4096); > + > + .rela : { > + *(.rela.data*) > + *(.rela.got) > + *(.rela.stab) > + } > + > + . = ALIGN(4096); > + .dynsym : { *(.dynsym) } > + . = ALIGN(4096); > + .dynstr : { *(.dynstr) } > + . = ALIGN(4096); > + .ignored.reloc : { > + *(.rela.reloc) > + *(.eh_frame) > + *(.note.GNU-stack) > + } > + > + .comment 0 : { *(.comment) } > +} > diff --git a/arch/x86/lib/reloc_x86_64.c b/arch/x86/lib/reloc_x86_64.c > new file mode 100644 > index 0000000..70a2b2a > --- /dev/null > +++ b/arch/x86/lib/reloc_x86_64.c > @@ -0,0 +1,90 @@ > +/* reloc_x86_64.c - position independent x86_64 ELF shared object relocator > + Copyright (C) 1999 Hewlett-Packard Co. > + Contributed by David Mosberger <dav...@hpl.hp.com>. > + Copyright (C) 2005 Intel Co. > + Contributed by Fenghua Yu <fenghua...@intel.com>. > + > + All rights reserved. > + > + Redistribution and use in source and binary forms, with or without > + modification, are permitted provided that the following conditions > + are met: > + > + * Redistributions of source code must retain the above copyright > + notice, this list of conditions and the following disclaimer. > + * Redistributions in binary form must reproduce the above > + copyright notice, this list of conditions and the following > + disclaimer in the documentation and/or other materials > + provided with the distribution. > + * Neither the name of Hewlett-Packard Co. nor the names of its > + contributors may be used to endorse or promote products derived > + from this software without specific prior written permission. > + > + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND > + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, > + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF > + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE > + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS > + BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, > + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, > + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR > + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY > + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR > + TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF > + THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF > + SUCH DAMAGE. Please replace this with SPDX version. > +*/ > + > +#include <common.h> > +#include <efi.h> > +#include <elf.h> > +#include <asm/elf.h> > + > +efi_status_t _relocate(long ldbase, Elf64_Dyn *dyn, efi_handle_t image, > + struct efi_system_table *systab) > +{ > + long relsz = 0, relent = 0; > + struct elf64_rel *rel = 0; > + unsigned long *addr; > + int i; > + > + for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { > + switch (dyn[i].d_tag) { > + case DT_RELA: > + rel = (struct elf64_rel *) > + ((unsigned long)dyn[i].d_un.d_ptr + ldbase); > + break; > + case DT_RELASZ: > + relsz = dyn[i].d_un.d_val; > + break; > + case DT_RELAENT: > + relent = dyn[i].d_un.d_val; > + break; > + default: > + break; > + } > + } > + > + if (!rel && relent == 0) > + return EFI_SUCCESS; > + > + if (!rel || relent == 0) > + return EFI_LOAD_ERROR; > + > + while (relsz > 0) { > + /* apply the relocs */ > + switch (ELF64_R_TYPE(rel->r_info)) { > + case R_X86_64_NONE: > + break; > + case R_X86_64_RELATIVE: > + addr = (unsigned long *)(ldbase + rel->r_offset); > + *addr += ldbase; > + break; > + default: > + break; > + } > + rel = (struct elf64_rel *)((char *)rel + relent); > + relsz -= relent; > + } Nits: blank line > + return EFI_SUCCESS; > +} > -- Regards, Bin _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot