svn commit: r339876 - head/libexec/rtld-elf

Mark Millard marklmi26-fbsd at yahoo.com
Tue Oct 30 21:32:18 UTC 2018



On 2018-Oct-30, at 2:23 PM, Alexander Richardson <arichardson at freebsd.org> wrote:

> On Tue, 30 Oct 2018 at 18:19, Mark Millard <marklmi26-fbsd at yahoo.com> wrote:
>> 
>> Alexander Richardson arichardson at freebsd.org wrote on
>> Tue Oct 30 15:33:00 UTC 2018 :
>> 
>>> On Tue, 30 Oct 2018 at 10:17, Michael Tuexen
>>> <Michael.Tuexen at macmic.franken.de> wrote:
>>>> 
>>>>> On 29. Oct 2018, at 22:08, Alex Richardson <arichardson at FreeBSD.org> wrote:
>>>>> 
>>>>> Author: arichardson
>>>>> Date: Mon Oct 29 21:08:02 2018
>>>>> New Revision: 339876
>>>>> URL: https://svnweb.freebsd.org/changeset/base/339876
>>>>> 
>>>>> Log:
>>>>> rtld: set obj->textsize correctly
>>>>> 
>>>>> With lld-generated binaries the first PT_LOAD will usually be a read-only
>>>>> segment unless you pass --no-rosegment. For those binaries the textsize is
>>>>> determined by the next PT_LOAD. To allow both LLD and bfd 2.17 binaries to
>>>>> be parsed correctly use the end of the last PT_LOAD that is marked as
>>>>> executable instead.
>>>>> 
>>>>> I noticed that the value was wrong while adding some debug prints for some rtld
>>>>> changes for CHERI binaries. `obj->textsize` only seems to be used by PPC so the
>>>>> effect is untested. However, the value before was definitely wrong and the new
>>>>> result matches the phdrs.
>>>> I build kernel and world with a revision later than this on a PPC. Buildword
>>>> ends up with a world where almost all binaries are segfaulting.... Especially gdb
>>>> (but svn, ls or so all segfault).
>>>> 
>>>> Best regards
>>>> Michael
>>> 
>>> This is rather surprising since if anything the range of the icache
>>> flush should increase rather than decrease after this change.
>>> 
>>> I can only see this causing a behaviour change if we actually need to
>>> flush more than just the executable segments.
>>> Is it possible that some binary/library contains a non-executable
>>> segment as the first PT_LOAD?
>>> Or is there some linker script that adds custom PHDRS?
>> 
>> The following is based on using devel/powerpc64-xtoolchain-gcc
>> to buildworld buildkernel on/for powerpc64. (I experiment with
>> using fairly modern tools to target powerpc64 and powerpc.)
>> The build context is head -r339076 based, both for what
>> did the build and for what it was building.
>> 
>> I report from both elfdump and objdump output
>> because each seems to have some oddities in what
>> it outputs.
>> 
>> I start with elfdump (which leaves sh_flags blank
>> and shows a section header with sh_name empty
>> that objdump does not list at all):
>> 
>> # elfdump -pc /bin/ls | less
>> 
>> . . .
>> 
>> As for objdump on the same file (section
>> one less than elfdump listed, no empty sh_name
>> section listed):
>> 
>> # objdump -ph /bin/ls | less
>> 
>> /bin/ls:     file format elf64-powerpc-freebsd
>> 
>> Program Header:
>>    PHDR off    0x0000000000000040 vaddr 0x0000000010000040 paddr 0x0000000010000040 align 2**3
>>         filesz 0x0000000000000188 memsz 0x0000000000000188 flags r--
>>  INTERP off    0x00000000000001c8 vaddr 0x00000000100001c8 paddr 0x00000000100001c8 align 2**0
>>         filesz 0x0000000000000015 memsz 0x0000000000000015 flags r--
>>    LOAD off    0x0000000000000000 vaddr 0x0000000010000000 paddr 0x0000000010000000 align 2**16
>>         filesz 0x000000000000910c memsz 0x000000000000910c flags r-x
>>    LOAD off    0x0000000000009110 vaddr 0x0000000010019110 paddr 0x0000000010019110 align 2**16
>>         filesz 0x0000000000000ee0 memsz 0x00000000000010e8 flags rw-
>> DYNAMIC off    0x0000000000009138 vaddr 0x0000000010019138 paddr 0x0000000010019138 align 2**3
>>         filesz 0x00000000000001c0 memsz 0x00000000000001c0 flags rw-
>>    NOTE off    0x00000000000001e0 vaddr 0x00000000100001e0 paddr 0x00000000100001e0 align 2**2
>>         filesz 0x0000000000000030 memsz 0x0000000000000030 flags r--
>>   STACK off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**4
>>         filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw-
>> 
>> Dynamic Section:
>>  NEEDED               libutil.so.9
>>  NEEDED               libncursesw.so.8
>>  NEEDED               libc.so.7
>>  INIT                 0x0000000010019328
>>  FINI                 0x0000000010019340
>>  HASH                 0x0000000010000210
>>  STRTAB               0x0000000010000d00
>>  SYMTAB               0x0000000010000490
>>  STRSZ                0x000000000000035a
>>  SYMENT               0x0000000000000018
>>  DEBUG                0x0000000000000000
>>  PLTGOT               0x0000000010019898
>>  PLTRELSZ             0x00000000000006f0
>>  PLTREL               0x0000000000000007
>>  JMPREL               0x00000000100012f8
>>  0x70000000           0x00000000100089b4
>>  RELA                 0x0000000010001160
>>  RELASZ               0x0000000000000198
>>  RELAENT              0x0000000000000018
>>  VERNEED              0x0000000010001110
>>  VERNEEDNUM           0x0000000000000001
>>  VERSYM               0x000000001000105a
>> 
>> Version References:
>>  required from libc.so.7:
>>    0x077a28b3 0x00 05 FBSD_1.3
>>    0x077a28b1 0x00 04 FBSD_1.1
>>    0x077a28b5 0x00 03 FBSD_1.5
>>    0x077a28b0 0x00 02 FBSD_1.0
>> private flags = 0x1: [abiv1]
>> 
>> Sections:
>> Idx Name          Size      VMA               LMA               File off  Algn
>>  0 .interp       00000015  00000000100001c8  00000000100001c8  000001c8  2**0
>>                  CONTENTS, ALLOC, LOAD, READONLY, DATA
>>  1 .note.tag     00000030  00000000100001e0  00000000100001e0  000001e0  2**2
>>                  CONTENTS, ALLOC, LOAD, READONLY, DATA
>>  2 .hash         0000027c  0000000010000210  0000000010000210  00000210  2**3
>>                  CONTENTS, ALLOC, LOAD, READONLY, DATA
>>  3 .dynsym       00000870  0000000010000490  0000000010000490  00000490  2**3
>>                  CONTENTS, ALLOC, LOAD, READONLY, DATA
>>  4 .dynstr       0000035a  0000000010000d00  0000000010000d00  00000d00  2**0
>>                  CONTENTS, ALLOC, LOAD, READONLY, DATA
>>  5 .gnu.version  000000b4  000000001000105a  000000001000105a  0000105a  2**1
>>                  CONTENTS, ALLOC, LOAD, READONLY, DATA
>>  6 .gnu.version_r 00000050  0000000010001110  0000000010001110  00001110  2**3
>>                  CONTENTS, ALLOC, LOAD, READONLY, DATA
>>  7 .rela.dyn     00000198  0000000010001160  0000000010001160  00001160  2**3
>>                  CONTENTS, ALLOC, LOAD, READONLY, DATA
>>  8 .rela.plt     000006f0  00000000100012f8  00000000100012f8  000012f8  2**3
>>                  CONTENTS, ALLOC, LOAD, READONLY, DATA
>>  9 .init         0000002c  00000000100019f0  00000000100019f0  000019f0  2**4
>>                  CONTENTS, ALLOC, LOAD, READONLY, CODE
>> 10 .text         00007204  0000000010001a20  0000000010001a20  00001a20  2**5
>>                  CONTENTS, ALLOC, LOAD, READONLY, CODE
>> 11 .fini         00000024  0000000010008c30  0000000010008c30  00008c30  2**4
>>                  CONTENTS, ALLOC, LOAD, READONLY, CODE
>> 12 .rodata       000004b0  0000000010008c58  0000000010008c58  00008c58  2**3
>>                  CONTENTS, ALLOC, LOAD, READONLY, DATA
>> 13 .eh_frame     00000004  0000000010009108  0000000010009108  00009108  2**2
>>                  CONTENTS, ALLOC, LOAD, READONLY, DATA
>> 14 .ctors        00000010  0000000010019110  0000000010019110  00009110  2**3
>>                  CONTENTS, ALLOC, LOAD, DATA
>> 15 .dtors        00000010  0000000010019120  0000000010019120  00009120  2**3
>>                  CONTENTS, ALLOC, LOAD, DATA
>> 16 .jcr          00000008  0000000010019130  0000000010019130  00009130  2**3
>>                  CONTENTS, ALLOC, LOAD, DATA
>> 17 .dynamic      000001c0  0000000010019138  0000000010019138  00009138  2**3
>>                  CONTENTS, ALLOC, LOAD, DATA
>> 18 .opd          00000468  00000000100192f8  00000000100192f8  000092f8  2**3
>>                  CONTENTS, ALLOC, LOAD, DATA
>> 19 .got          00000098  0000000010019800  0000000010019800  00009800  2**8
>>                  CONTENTS, ALLOC, LOAD, DATA
>> 20 .plt          00000708  0000000010019898  0000000010019898  00009898  2**3
>>                  ALLOC
>> 21 .data         00000050  0000000010019fa0  0000000010019fa0  00009fa0  2**3
>>                  CONTENTS, ALLOC, LOAD, DATA
>> 22 .bss          00000208  0000000010019ff0  0000000010019ff0  00009ff0  2**3
>>                  ALLOC
>> 23 .comment      000002b5  0000000000000000  0000000000000000  00009ff0  2**0
>>                  CONTENTS, READONLY
>> 24 .gnu_debuglink 00000010  0000000000000000  0000000000000000  0000a2a8  2**2
>>                  CONTENTS, READONLY
>> 
>> 
> 
> The first PT_LOAD is also executable so there will be no be behaviour
> change. It must be one of the library dependencies that is different.
> The difference in section headers output doesn't matter here since all
> that RTLD looks at is the PHDRS.
> 

I think you missed the fact that the .got and .plt are in the
material from the 2nd PT_LOAD: there are writeable code areas
involved for powerpc64.

So both PT_LOAD's contribute code areas and there is a space
between the two contributions. The first PT_LOAD loads most
code (the readonly code, to be specific). The 2nd contributes
a writable-code area.

But may be i've misunderstood the assumptions that your change
is based on.

===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)



More information about the svn-src-head mailing list