[lld] r290986 - ELF: Round p_memsz of the PT_GNU_RELRO program header up to the page size.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 5 13:37:55 PST 2017


Both bfd and gold seem to have the same bug. Would you mind reporting
this bug to them?

Thanks,
Rafael

Peter Collingbourne via llvm-commits <llvm-commits at lists.llvm.org>
writes:

> Author: pcc
> Date: Wed Jan  4 12:56:15 2017
> New Revision: 290986
>
> URL: http://llvm.org/viewvc/llvm-project?rev=290986&view=rev
> Log:
> ELF: Round p_memsz of the PT_GNU_RELRO program header up to the page size.
>
> The glibc dynamic loader rounds the size down, so without this the loader
> will fail to change the memory protection for the last page.
>
> Differential Revision: https://reviews.llvm.org/D28267
>
> Modified:
>     lld/trunk/ELF/Writer.cpp
>     lld/trunk/test/ELF/basic-mips.s
>     lld/trunk/test/ELF/basic-ppc.s
>
> Modified: lld/trunk/ELF/Writer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=290986&r1=290985&r2=290986&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Writer.cpp (original)
> +++ lld/trunk/ELF/Writer.cpp Wed Jan  4 12:56:15 2017
> @@ -1444,8 +1444,13 @@ template <class ELFT> void Writer<ELFT>:
>      }
>      if (P.p_type == PT_LOAD)
>        P.p_align = Config->MaxPageSize;
> -    else if (P.p_type == PT_GNU_RELRO)
> +    else if (P.p_type == PT_GNU_RELRO) {
>        P.p_align = 1;
> +      // The glibc dynamic loader rounds the size down, so we need to round up
> +      // to protect the last page. This is a no-op on FreeBSD which always
> +      // rounds up.
> +      P.p_memsz = alignTo(P.p_memsz, Config->MaxPageSize);
> +    }
>  
>      // The TLS pointer goes after PT_TLS. At least glibc will align it,
>      // so round up the size to make sure the offsets are correct.
>
> Modified: lld/trunk/test/ELF/basic-mips.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/basic-mips.s?rev=290986&r1=290985&r2=290986&view=diff
> ==============================================================================
> --- lld/trunk/test/ELF/basic-mips.s (original)
> +++ lld/trunk/test/ELF/basic-mips.s Wed Jan  4 12:56:15 2017
> @@ -297,7 +297,7 @@ __start:
>  # CHECK-NEXT:     VirtualAddress: 0x30000
>  # CHECK-NEXT:     PhysicalAddress: 0x30000
>  # CHECK-NEXT:     FileSize: 8
> -# CHECK-NEXT:     MemSize: 8
> +# CHECK-NEXT:     MemSize: 65536
>  # CHECK-NEXT:     Flags [ (0x4)
>  # CHECK-NEXT:       PF_R (0x4)
>  # CHECK-NEXT:     ]
>
> Modified: lld/trunk/test/ELF/basic-ppc.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/basic-ppc.s?rev=290986&r1=290985&r2=290986&view=diff
> ==============================================================================
> --- lld/trunk/test/ELF/basic-ppc.s (original)
> +++ lld/trunk/test/ELF/basic-ppc.s Wed Jan  4 12:56:15 2017
> @@ -295,7 +295,7 @@
>  // CHECK-NEXT:     VirtualAddress: 0x2000
>  // CHECK-NEXT:     PhysicalAddress: 0x2000
>  // CHECK-NEXT:     FileSize: 48
> -// CHECK-NEXT:     MemSize: 48
> +// CHECK-NEXT:     MemSize: 4096
>  // CHECK-NEXT:     Flags [ (0x4)
>  // CHECK-NEXT:       PF_R (0x4)
>  // CHECK-NEXT:     ]
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list