diff options
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h | 16 | ||||
| -rw-r--r-- | lld/test/elf/Mips/mips32.test | 21 |
2 files changed, 34 insertions, 3 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h b/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h index fc580da3c2c..cb1cf78d65c 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h @@ -68,9 +68,19 @@ private: auto *ref = new (this->_readerStorage) ELFReference<ELFT>(&ri, ri.r_offset - symbol.st_value, this->kindArch(), ri.getType(isMips64EL), ri.getSymbol(isMips64EL)); - int32_t addend = - *(int16_t *)(content.data() + ri.r_offset - symbol.st_value); - ref->setAddend(addend); + const uint8_t *ap = content.data() + ri.r_offset - symbol.st_value; + switch (ri.getType(isMips64EL)) { + case R_MIPS_32: + ref->setAddend(*(int32_t *)ap); + break; + case R_MIPS_26: + ref->setAddend(*(int16_t *)ap); + break; + case R_MIPS_HI16: + case R_MIPS_LO16: + ref->setAddend(*(int16_t *)ap); + break; + } return ref; } }; diff --git a/lld/test/elf/Mips/mips32.test b/lld/test/elf/Mips/mips32.test new file mode 100644 index 00000000000..7557418b666 --- /dev/null +++ b/lld/test/elf/Mips/mips32.test @@ -0,0 +1,21 @@ +# Check handling R_MIPS_32 relocation. +# +# RUN: llvm-mc -triple=mipsel -filetype=obj -o=%t-obj %s +# RUN: lld -flavor gnu -target mipsel -o %t-exe %t-obj +# RUN: llvm-objdump -s %t-exe | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: 422000 28014000 2c014200 (.@.,.B. + + .global __start + .ent __start +__start: + nop + .space 0x20000 +la: + nop + .end __start + + .data + .4byte __start + .4byte la |

