From 034c4cd58aa757c5b7de8f1ffcf3cb3063ed294b Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Sat, 19 Dec 2015 05:51:49 +0000 Subject: [PATCH] [ELF] Allow target to configure ELF header flags in the output file The patch configure ELF header flags for MIPS target. For now the flags are hard coded. In fact they depends on ELF flags of input object files and selected emulation. Differential Revision: http://reviews.llvm.org/D15575 llvm-svn: 256089 --- lld/ELF/Writer.cpp | 12 ++++++++++++ lld/test/ELF/basic-mips.s | 5 ++++- lld/test/ELF/emulation.s | 10 ++++++++-- lld/test/ELF/mips-elf-flags.s | 27 +++++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 lld/test/ELF/mips-elf-flags.s diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 0c56bb1f4f40..6427b8b3f896 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -1012,6 +1012,17 @@ template int Writer::getPhdrsNum() const { return I; } +static uint32_t getELFFlags() { + if (Config->EMachine != EM_MIPS) + return 0; + // FIXME: In fact ELF flags depends on ELF flags of input object files + // and selected emulation. For now just use hadr coded values. + uint32_t V = EF_MIPS_ABI_O32 | EF_MIPS_CPIC | EF_MIPS_ARCH_32R2; + if (Config->Shared) + V |= EF_MIPS_PIC; + return V; +} + template void Writer::writeHeader() { uint8_t *Buf = Buffer->getBufferStart(); memcpy(Buf, "\177ELF", 4); @@ -1033,6 +1044,7 @@ template void Writer::writeHeader() { EHdr->e_entry = getEntryAddr(); EHdr->e_phoff = sizeof(Elf_Ehdr); EHdr->e_shoff = SectionHeaderOff; + EHdr->e_flags = getELFFlags(); EHdr->e_ehsize = sizeof(Elf_Ehdr); EHdr->e_phentsize = sizeof(Elf_Phdr); EHdr->e_phnum = Phdrs.size(); diff --git a/lld/test/ELF/basic-mips.s b/lld/test/ELF/basic-mips.s index aa2eaf9f59e6..e07d2d2af8c8 100644 --- a/lld/test/ELF/basic-mips.s +++ b/lld/test/ELF/basic-mips.s @@ -28,7 +28,10 @@ __start: # CHECK-NEXT: Entry: 0x20000 # CHECK-NEXT: ProgramHeaderOffset: 0x34 # CHECK-NEXT: SectionHeaderOffset: 0x20084 -# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: Flags [ +# CHECK-NEXT: EF_MIPS_ABI_O32 +# CHECK-NEXT: EF_MIPS_ARCH_32R2 +# CHECK-NEXT: EF_MIPS_CPIC # CHECK-NEXT: ] # CHECK-NEXT: HeaderSize: 52 # CHECK-NEXT: ProgramHeaderEntrySize: 32 diff --git a/lld/test/ELF/emulation.s b/lld/test/ELF/emulation.s index bcb86bef86e0..a8a8f398c42c 100644 --- a/lld/test/ELF/emulation.s +++ b/lld/test/ELF/emulation.s @@ -112,7 +112,10 @@ # MIPS-NEXT: Entry: # MIPS-NEXT: ProgramHeaderOffset: 0x34 # MIPS-NEXT: SectionHeaderOffset: -# MIPS-NEXT: Flags [ (0x0) +# MIPS-NEXT: Flags [ +# MIPS-NEXT: EF_MIPS_ABI_O32 +# MIPS-NEXT: EF_MIPS_ARCH_32R2 +# MIPS-NEXT: EF_MIPS_CPIC # MIPS-NEXT: ] # RUN: llvm-mc -filetype=obj -triple=mipsel-unknown-linux %s -o %tmipsel @@ -138,7 +141,10 @@ # MIPSEL-NEXT: Entry: # MIPSEL-NEXT: ProgramHeaderOffset: 0x34 # MIPSEL-NEXT: SectionHeaderOffset: -# MIPSEL-NEXT: Flags [ (0x0) +# MIPSEL-NEXT: Flags [ +# MIPSEL-NEXT: EF_MIPS_ABI_O32 +# MIPSEL-NEXT: EF_MIPS_ARCH_32R2 +# MIPSEL-NEXT: EF_MIPS_CPIC # MIPSEL-NEXT: ] # RUN: llvm-mc -filetype=obj -triple=aarch64-unknown-linux %s -o %taarch64 diff --git a/lld/test/ELF/mips-elf-flags.s b/lld/test/ELF/mips-elf-flags.s new file mode 100644 index 000000000000..7817e58b5383 --- /dev/null +++ b/lld/test/ELF/mips-elf-flags.s @@ -0,0 +1,27 @@ +# Check generation of MIPS specific ELF header flags. + +# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o +# RUN: ld.lld %t.o -shared -o %t.so +# RUN: llvm-readobj -h %t.so | FileCheck -check-prefix=SO %s +# RUN: ld.lld %t.o -o %t.exe +# RUN: llvm-readobj -h %t.exe | FileCheck -check-prefix=EXE %s + +# REQUIRES: mips + + .text + .globl __start +__start: + nop + +# SO: Flags [ +# SO-NEXT: EF_MIPS_ABI_O32 +# SO-NEXT: EF_MIPS_ARCH_32R2 +# SO-NEXT: EF_MIPS_CPIC +# SO-NEXT: EF_MIPS_PIC +# SO-NEXT: ] + +# EXE: Flags [ +# EXE-NEXT: EF_MIPS_ABI_O32 +# EXE-NEXT: EF_MIPS_ARCH_32R2 +# EXE-NEXT: EF_MIPS_CPIC +# EXE-NEXT: ]