[PATCH] D35803: [ELF] - Fix calculation of memory region offset.
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 24 09:22:28 PDT 2017
LGTM
George Rimar via Phabricator <reviews at reviews.llvm.org> writes:
> grimar created this revision.
> Herald added a subscriber: emaste.
>
> This is PR33714.
>
> Previously for each input section offset of memory region
> was increamented on a size of output section.
> That resulted in a wrong error message saying about
> overflow. Patch fixes that.
>
>
> https://reviews.llvm.org/D35803
>
> Files:
> ELF/LinkerScript.cpp
> test/ELF/linkerscript/memory2.s
>
>
> Index: test/ELF/linkerscript/memory2.s
> ===================================================================
> --- test/ELF/linkerscript/memory2.s
> +++ test/ELF/linkerscript/memory2.s
> @@ -0,0 +1,14 @@
> +# REQUIRES: x86
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
> +# RUN: echo "MEMORY { ram (rwx) : ORIGIN = 0, LENGTH = 2K } \
> +# RUN: SECTIONS { .text : { *(.text*) } > ram }" > %t.script
> +# RUN: ld.lld -o %t2 --script %t.script %t
> +
> +.text
> +.global _start
> +_start:
> + .zero 1024
> +
> +.section .text.foo,"ax",%progbits
> +foo:
> + nop
> Index: ELF/LinkerScript.cpp
> ===================================================================
> --- ELF/LinkerScript.cpp
> +++ ELF/LinkerScript.cpp
> @@ -550,6 +550,7 @@
> }
>
> void LinkerScript::output(InputSection *S) {
> + uint64_t Before = advance(0, 1);
> uint64_t Pos = advance(S->getSize(), S->Alignment);
> S->OutSecOff = Pos - S->getSize() - CurAddressState->OutSec->Addr;
>
> @@ -563,7 +564,7 @@
> if (CurAddressState->MemRegion) {
> uint64_t &CurOffset =
> CurAddressState->MemRegionOffset[CurAddressState->MemRegion];
> - CurOffset += CurAddressState->OutSec->Size;
> + CurOffset += Pos - Before;
> uint64_t CurSize = CurOffset - CurAddressState->MemRegion->Origin;
> if (CurSize > CurAddressState->MemRegion->Length) {
> uint64_t OverflowAmt = CurSize - CurAddressState->MemRegion->Length;
>
>
> Index: test/ELF/linkerscript/memory2.s
> ===================================================================
> --- test/ELF/linkerscript/memory2.s
> +++ test/ELF/linkerscript/memory2.s
> @@ -0,0 +1,14 @@
> +# REQUIRES: x86
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
> +# RUN: echo "MEMORY { ram (rwx) : ORIGIN = 0, LENGTH = 2K } \
> +# RUN: SECTIONS { .text : { *(.text*) } > ram }" > %t.script
> +# RUN: ld.lld -o %t2 --script %t.script %t
> +
> +.text
> +.global _start
> +_start:
> + .zero 1024
> +
> +.section .text.foo,"ax",%progbits
> +foo:
> + nop
> Index: ELF/LinkerScript.cpp
> ===================================================================
> --- ELF/LinkerScript.cpp
> +++ ELF/LinkerScript.cpp
> @@ -550,6 +550,7 @@
> }
>
> void LinkerScript::output(InputSection *S) {
> + uint64_t Before = advance(0, 1);
> uint64_t Pos = advance(S->getSize(), S->Alignment);
> S->OutSecOff = Pos - S->getSize() - CurAddressState->OutSec->Addr;
>
> @@ -563,7 +564,7 @@
> if (CurAddressState->MemRegion) {
> uint64_t &CurOffset =
> CurAddressState->MemRegionOffset[CurAddressState->MemRegion];
> - CurOffset += CurAddressState->OutSec->Size;
> + CurOffset += Pos - Before;
> uint64_t CurSize = CurOffset - CurAddressState->MemRegion->Origin;
> if (CurSize > CurAddressState->MemRegion->Length) {
> uint64_t OverflowAmt = CurSize - CurAddressState->MemRegion->Length;
More information about the llvm-commits
mailing list