[PATCH] D41403: [ELF] Fix incorrect physical address on self-referencing AT command

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 11 10:29:34 PST 2018


LGTM

Erick Reyes via Phabricator <reviews at reviews.llvm.org> writes:

> erickreyes updated this revision to Diff 129325.
> erickreyes added a comment.
>
> Replaced the patch with Rafael's version, which avoids computing section alignment twice
>
>
> Repository:
>   rLLD LLVM Linker
>
> https://reviews.llvm.org/D41403
>
> Files:
>   ELF/LinkerScript.cpp
>   test/ELF/linkerscript/at-self-reference.s
>
> Index: test/ELF/linkerscript/at-self-reference.s
> ===================================================================
> --- test/ELF/linkerscript/at-self-reference.s
> +++ test/ELF/linkerscript/at-self-reference.s
> @@ -0,0 +1,63 @@
> +# REQUIRES: x86
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
> +# RUN: echo "SECTIONS { \
> +# RUN:  . = 0x1000; \
> +# RUN:  .aaa : AT(ADDR(.aaa)) { *(.aaa) } \
> +# RUN:  .bbb : AT(ADDR(.bbb)) { *(.bbb) } \
> +# RUN: }" > %t.script
> +# RUN: ld.lld %t --script %t.script -o %t2
> +# RUN: llvm-readobj -program-headers %t2 | FileCheck %s
> +
> +# CHECK:      ProgramHeaders [
> +# CHECK-NEXT:  ProgramHeader {
> +# CHECK-NEXT:    Type: PT_LOAD (0x1)
> +# CHECK-NEXT:    Offset: 0x1000
> +# CHECK-NEXT:    VirtualAddress: 0x1000
> +# CHECK-NEXT:    PhysicalAddress: 0x1000
> +# CHECK-NEXT:    FileSize: 3
> +# CHECK-NEXT:    MemSize: 3
> +# CHECK-NEXT:    Flags [ (0x5)
> +# CHECK-NEXT:      PF_R (0x4)
> +# CHECK-NEXT:      PF_X (0x1)
> +# CHECK-NEXT:    ]
> +# CHECK-NEXT:    Alignment: 4096
> +# CHECK-NEXT:  }
> +# CHECK-NEXT:  ProgramHeader {
> +# CHECK-NEXT:    Type: PT_LOAD (0x1)
> +# CHECK-NEXT:    Offset: 0x1008
> +# CHECK-NEXT:    VirtualAddress: 0x1008
> +# CHECK-NEXT:    PhysicalAddress: 0x1008
> +# CHECK-NEXT:    FileSize: 9
> +# CHECK-NEXT:    MemSize: 9
> +# CHECK-NEXT:    Flags [ (0x5)
> +# CHECK-NEXT:      PF_R (0x4)
> +# CHECK-NEXT:      PF_X (0x1)
> +# CHECK-NEXT:    ]
> +# CHECK-NEXT:    Alignment: 4096
> +# CHECK-NEXT:  }
> +# CHECK-NEXT:  ProgramHeader {
> +# CHECK-NEXT:    Type: PT_GNU_STACK (0x6474E551)
> +# CHECK-NEXT:    Offset: 0x0
> +# CHECK-NEXT:    VirtualAddress: 0x0
> +# CHECK-NEXT:    PhysicalAddress: 0x0
> +# CHECK-NEXT:    FileSize: 0
> +# CHECK-NEXT:    MemSize: 0
> +# CHECK-NEXT:    Flags [ (0x6)
> +# CHECK-NEXT:      PF_R (0x4)
> +# CHECK-NEXT:      PF_W (0x2)
> +# CHECK-NEXT:    ]
> +# CHECK-NEXT:    Alignment: 0
> +# CHECK-NEXT:  }
> +# CHECK-NEXT:]
> +
> +.global _start
> +_start:
> + nop
> +
> +
> +.section .aaa, "a"
> +.asciz "aa"
> +
> +.section .bbb, "a"
> +.align 8
> +.quad 0
> Index: ELF/LinkerScript.cpp
> ===================================================================
> --- ELF/LinkerScript.cpp
> +++ ELF/LinkerScript.cpp
> @@ -608,13 +608,6 @@
>  
>    Ctx->OutSec = Sec;
>    Ctx->OutSec->Addr = advance(0, Ctx->OutSec->Alignment);
> -
> -  // If neither AT nor AT> is specified for an allocatable section, the linker
> -  // will set the LMA such that the difference between VMA and LMA for the
> -  // section is the same as the preceding output section in the same region
> -  // https://sourceware.org/binutils/docs-2.20/ld/Output-Section-LMA.html
> -  if (Ctx->LMAOffset)
> -    Ctx->OutSec->LMAOffset = Ctx->LMAOffset();
>  }
>  
>  // This function searches for a memory region to place the given output
> @@ -662,13 +655,19 @@
>    if (Ctx->MemRegion)
>      Dot = Ctx->MemRegionOffset[Ctx->MemRegion];
>  
> +  switchTo(Sec);
> +
>    if (Sec->LMAExpr) {
>      uint64_t D = Dot;
>      Ctx->LMAOffset = [=] { return Sec->LMAExpr().getValue() - D; };
>    }
> +  // If neither AT nor AT> is specified for an allocatable section, the linker
> +  // will set the LMA such that the difference between VMA and LMA for the
> +  // section is the same as the preceding output section in the same region
> +  // https://sourceware.org/binutils/docs-2.20/ld/Output-Section-LMA.html
> +  if (Ctx->LMAOffset)
> +    Ctx->OutSec->LMAOffset = Ctx->LMAOffset();
>  
> -  switchTo(Sec);
> -
>    // The Size previously denoted how many InputSections had been added to this
>    // section, and was used for sorting SHF_LINK_ORDER sections. Reset it to
>    // compute the actual size value.


More information about the llvm-commits mailing list