diff options
| author | Simon Atanasyan <simon@atanasyan.com> | 2016-12-21 05:31:57 +0000 |
|---|---|---|
| committer | Simon Atanasyan <simon@atanasyan.com> | 2016-12-21 05:31:57 +0000 |
| commit | 86dc60d8d4c7cc720f578e4a18fa2664483bc186 (patch) | |
| tree | 326837dde143448aa2317350caa3ccc6e749335e | |
| parent | b6a8f02251fce3cb74dad472940e7717ecafc048 (diff) | |
| download | bcm5719-llvm-86dc60d8d4c7cc720f578e4a18fa2664483bc186.tar.gz bcm5719-llvm-86dc60d8d4c7cc720f578e4a18fa2664483bc186.zip | |
[ELF][MIPS] Allow .MIPS.abiflags larger than one Elf_Mips_ABIFlags struct
Older versions of BFD generate libraries with .MIPS.abiflags that only
concatenate the individual .MIPS.abiflags sections instead of merging.
Patch by Alexander Richardson.
Differential revision: https://reviews.llvm.org/D27770
llvm-svn: 290237
| -rw-r--r-- | lld/ELF/SyntheticSections.cpp | 9 | ||||
| -rw-r--r-- | lld/test/ELF/Inputs/mips-concatenated-abiflags.o | bin | 0 -> 1084 bytes | |||
| -rw-r--r-- | lld/test/ELF/mips-merge-abiflags.s | 63 |
3 files changed, 70 insertions, 2 deletions
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index ea5e924e493..2dbe749029c 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -134,8 +134,13 @@ MipsAbiFlagsSection<ELFT> *MipsAbiFlagsSection<ELFT>::create() { Create = true; std::string Filename = toString(Sec->getFile()); - if (Sec->Data.size() != sizeof(Elf_Mips_ABIFlags)) { - error(Filename + ": invalid size of .MIPS.abiflags section"); + const size_t Size = Sec->Data.size(); + // Older version of BFD (such as the default FreeBSD linker) concatenate + // .MIPS.abiflags instead of merging. To allow for this case (or potential + // zero padding) we ignore everything after the first Elf_Mips_ABIFlags + if (Size < sizeof(Elf_Mips_ABIFlags)) { + error(Filename + ": invalid size of .MIPS.abiflags section: got " + + Twine(Size) + " instead of " + Twine(sizeof(Elf_Mips_ABIFlags))); return nullptr; } auto *S = reinterpret_cast<const Elf_Mips_ABIFlags *>(Sec->Data.data()); diff --git a/lld/test/ELF/Inputs/mips-concatenated-abiflags.o b/lld/test/ELF/Inputs/mips-concatenated-abiflags.o Binary files differnew file mode 100644 index 00000000000..404530919fc --- /dev/null +++ b/lld/test/ELF/Inputs/mips-concatenated-abiflags.o diff --git a/lld/test/ELF/mips-merge-abiflags.s b/lld/test/ELF/mips-merge-abiflags.s new file mode 100644 index 00000000000..2e8b43bcc3b --- /dev/null +++ b/lld/test/ELF/mips-merge-abiflags.s @@ -0,0 +1,63 @@ +# Test that lld handles input files with concatenated .MIPS.abiflags sections +# This happens e.g. with the FreeBSD BFD (BFD 2.17.50 [FreeBSD] 2007-07-03) + +# RUN: llvm-mc -filetype=obj -triple=mips64-unknown-freebsd %s -o %t.o +# RUN: ld.lld %t.o %p/Inputs/mips-concatenated-abiflags.o -o %t.exe +# RUN: llvm-readobj -sections -mips-abi-flags %t.exe | FileCheck %s +# RUN: llvm-readobj -sections -mips-abi-flags \ +# RUN: %p/Inputs/mips-concatenated-abiflags.o | \ +# RUN: FileCheck --check-prefix=INPUT-OBJECT %s + +# REQUIRES: mips + .globl __start +__start: + nop + +# CHECK: Section { +# CHECK: Index: 1 +# CHECK-NEXT: Name: .MIPS.abiflags +# CHECK-NEXT: Type: SHT_MIPS_ABIFLAGS +# CHECK-NEXT: Flags [ +# CHECK-NEXT: SHF_ALLOC +# CHECK-NEXT: ] +# CHECK-NEXT: Address: +# CHECK-NEXT: Offset: +# CHECK-NEXT: Size: 24 +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 8 +# CHECK-NEXT: EntrySize: 24 +# CHECK-NEXT: } + +# CHECK: MIPS ABI Flags { +# CHECK-NEXT: Version: 0 +# CHECK-NEXT: ISA: MIPS64 +# CHECK-NEXT: ISA Extension: None +# CHECK-NEXT: ASEs [ +# CHECK-NEXT: ] +# CHECK-NEXT: FP ABI: Hard float (double precision) +# CHECK-NEXT: GPR size: 64 +# CHECK-NEXT: CPR1 size: 64 +# CHECK-NEXT: CPR2 size: 0 +# CHECK-NEXT: Flags 1 [ +# CHECK-NEXT: ODDSPREG +# CHECK-NEXT: ] +# CHECK-NEXT: Flags 2: 0x0 +# CHECK-NEXT: } + +# INPUT-OBJECT: Section { +# INPUT-OBJECT: Index: 3 +# INPUT-OBJECT-NEXT: Name: .MIPS.abiflags +# INPUT-OBJECT-NEXT: Type: SHT_MIPS_ABIFLAGS +# INPUT-OBJECT-NEXT: Flags [ +# INPUT-OBJECT-NEXT: SHF_ALLOC +# INPUT-OBJECT-NEXT: ] +# INPUT-OBJECT-NEXT: Address: +# INPUT-OBJECT-NEXT: Offset: +# INPUT-OBJECT-NEXT: Size: 48 +# INPUT-OBJECT-NEXT: Link: 0 +# INPUT-OBJECT-NEXT: Info: 0 +# INPUT-OBJECT-NEXT: AddressAlignment: 8 +# INPUT-OBJECT-NEXT: EntrySize: 0 +# INPUT-OBJECT-NEXT: } +# INPUT-OBJECT: The .MIPS.abiflags section has a wrong size. |

