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

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


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

program header:

entry: 0
        p_type: PT_PHDR
        p_offset: 64
        p_vaddr: 0x10000040
        p_paddr: 0x10000040
        p_filesz: 392
        p_memsz: 392
        p_flags: PF_R
        p_align: 8

entry: 1
        p_type: PT_INTERP
        p_offset: 456
        p_vaddr: 0x100001c8
        p_paddr: 0x100001c8
        p_filesz: 21
        p_memsz: 21
        p_flags: PF_R
        p_align: 1

entry: 2
        p_type: PT_LOAD
        p_offset: 0
        p_vaddr: 0x10000000
        p_paddr: 0x10000000
        p_filesz: 37132
        p_memsz: 37132
        p_flags: PF_X|PF_R
        p_align: 65536

entry: 3
        p_type: PT_LOAD
        p_offset: 37136
        p_vaddr: 0x10019110
        p_paddr: 0x10019110
        p_filesz: 3808
        p_memsz: 4328
        p_flags: PF_W|PF_R
        p_align: 65536

entry: 4
        p_type: PT_DYNAMIC
        p_offset: 37176
        p_vaddr: 0x10019138
        p_paddr: 0x10019138
        p_filesz: 448
        p_memsz: 448
        p_flags: PF_W|PF_R
        p_align: 8

entry: 5
        p_type: PT_NOTE
        p_offset: 480
        p_vaddr: 0x100001e0
        p_paddr: 0x100001e0
        p_filesz: 48
        p_memsz: 48
        p_flags: PF_R
        p_align: 4

entry: 6
        p_type: PT_LOAD
        p_offset: 0
        p_vaddr: 0
        p_paddr: 0
        p_filesz: 0
        p_memsz: 0
        p_flags: PF_W|PF_R
        p_align: 16

section header:

entry: 0
        sh_name: 
        sh_type: SHT_NULL
        sh_flags: 
        sh_addr: 0
        sh_offset: 0
        sh_size: 0
        sh_link: 0
        sh_info: 0
        sh_addralign: 0
        sh_entsize: 0

entry: 1
        sh_name: .interp
        sh_type: SHT_PROGBITS
        sh_flags: 
        sh_addr: 0x100001c8
        sh_offset: 456
        sh_size: 21
        sh_link: 0
        sh_info: 0
        sh_addralign: 1
        sh_entsize: 0

entry: 2
        sh_name: .note.tag
        sh_type: SHT_NOTE
        sh_flags: 
        sh_addr: 0x100001e0
        sh_offset: 480
        sh_size: 48
        sh_link: 0
        sh_info: 0
        sh_addralign: 4
        sh_entsize: 0

entry: 3
        sh_name: .hash
        sh_type: SHT_HASH
        sh_flags: 
        sh_addr: 0x10000210
        sh_offset: 528
        sh_size: 636
        sh_link: 4
        sh_info: 0
        sh_addralign: 8
        sh_entsize: 4

entry: 4
        sh_name: .dynsym
        sh_type: SHT_DYNSYM
        sh_flags: 
        sh_addr: 0x10000490
        sh_offset: 1168
        sh_size: 2160
        sh_link: 5
        sh_info: 1
        sh_addralign: 8
        sh_entsize: 24

entry: 5
        sh_name: .dynstr
        sh_type: SHT_STRTAB
        sh_flags: 
        sh_addr: 0x10000d00
        sh_offset: 3328
        sh_size: 858
        sh_link: 0
        sh_info: 0
        sh_addralign: 1
        sh_entsize: 0

entry: 6
        sh_name: .gnu.version
        sh_type: SHT_SUNW(GNU)_versym
        sh_flags: 
        sh_addr: 0x1000105a
        sh_offset: 4186
        sh_size: 180
        sh_link: 4
        sh_info: 0
        sh_addralign: 2
        sh_entsize: 2

entry: 7
        sh_name: .gnu.version_r
        sh_type: SHT_SUNW(GNU)_verneed
        sh_flags: 
        sh_addr: 0x10001110
        sh_offset: 4368
        sh_size: 80
        sh_link: 5
        sh_info: 1
        sh_addralign: 8
        sh_entsize: 0

entry: 8
        sh_name: .rela.dyn
        sh_type: SHT_RELA
        sh_flags: 
        sh_addr: 0x10001160
        sh_offset: 4448
        sh_size: 408
        sh_link: 4
        sh_info: 0
        sh_addralign: 8
        sh_entsize: 24

entry: 9
        sh_name: .rela.plt
        sh_type: SHT_RELA
        sh_flags: 
        sh_addr: 0x100012f8
        sh_offset: 4856
        sh_size: 1776
        sh_link: 4
        sh_info: 21
        sh_addralign: 8
        sh_entsize: 24

entry: 10
        sh_name: .init
        sh_type: SHT_PROGBITS
        sh_flags: 
        sh_addr: 0x100019f0
        sh_offset: 6640
        sh_size: 44
        sh_link: 0
        sh_info: 0
        sh_addralign: 16
        sh_entsize: 0

entry: 11
        sh_name: .text
        sh_type: SHT_PROGBITS
        sh_flags: 
        sh_addr: 0x10001a20
        sh_offset: 6688
        sh_size: 29188
        sh_link: 0
        sh_info: 0
        sh_addralign: 32
        sh_entsize: 0

entry: 12
        sh_name: .fini
        sh_type: SHT_PROGBITS
        sh_flags: 
        sh_addr: 0x10008c30
        sh_offset: 35888
        sh_size: 36
        sh_link: 0
        sh_info: 0
        sh_addralign: 16
        sh_entsize: 0

entry: 13
        sh_name: .rodata
        sh_type: SHT_PROGBITS
        sh_flags: 
        sh_addr: 0x10008c58
        sh_offset: 35928
        sh_size: 1200
        sh_link: 0
        sh_info: 0
        sh_addralign: 8
        sh_entsize: 0

entry: 14
        sh_name: .eh_frame
        sh_type: SHT_PROGBITS
        sh_flags: 
        sh_addr: 0x10009108
        sh_offset: 37128
        sh_size: 4
        sh_link: 0
        sh_info: 0
        sh_addralign: 4
        sh_entsize: 0

entry: 15
        sh_name: .ctors
        sh_type: SHT_PROGBITS
        sh_flags: 
        sh_addr: 0x10019110
        sh_offset: 37136
        sh_size: 16
        sh_link: 0
        sh_info: 0
        sh_addralign: 8
        sh_entsize: 0

entry: 16
        sh_name: .dtors
        sh_type: SHT_PROGBITS
        sh_flags: 
        sh_addr: 0x10019120
        sh_offset: 37152
        sh_size: 16
        sh_link: 0
        sh_info: 0
        sh_addralign: 8
        sh_entsize: 0

entry: 17
        sh_name: .jcr
        sh_type: SHT_PROGBITS
        sh_flags: 
        sh_addr: 0x10019130
        sh_offset: 37168
        sh_size: 8
        sh_link: 0
        sh_info: 0
        sh_addralign: 8
        sh_entsize: 0

entry: 18
        sh_name: .dynamic
        sh_type: SHT_DYNAMIC
        sh_flags: 
        sh_addr: 0x10019138
        sh_offset: 37176
        sh_size: 448
        sh_link: 5
        sh_info: 0
        sh_addralign: 8
        sh_entsize: 16

entry: 19
        sh_name: .opd
        sh_type: SHT_PROGBITS
        sh_flags: 
        sh_addr: 0x100192f8
        sh_offset: 37624
        sh_size: 1128
        sh_link: 0
        sh_info: 0
        sh_addralign: 8
        sh_entsize: 0

entry: 20
        sh_name: .got
        sh_type: SHT_PROGBITS
        sh_flags: 
        sh_addr: 0x10019800
        sh_offset: 38912
        sh_size: 152
        sh_link: 0
        sh_info: 0
        sh_addralign: 256
        sh_entsize: 8

entry: 21
        sh_name: .plt
        sh_type: SHT_NOBITS
        sh_flags: 
        sh_addr: 0x10019898
        sh_offset: 39064
        sh_size: 1800
        sh_link: 0
        sh_info: 0
        sh_addralign: 8
        sh_entsize: 24

entry: 22
        sh_name: .data
        sh_type: SHT_PROGBITS
        sh_flags: 
        sh_addr: 0x10019fa0
        sh_offset: 40864
        sh_size: 80
        sh_link: 0
        sh_info: 0
        sh_addralign: 8
        sh_entsize: 0

entry: 23
        sh_name: .bss
        sh_type: SHT_NOBITS
        sh_flags: 
        sh_addr: 0x10019ff0
        sh_offset: 40944
        sh_size: 520
        sh_link: 0
        sh_info: 0
        sh_addralign: 8
        sh_entsize: 0

entry: 24
        sh_name: .comment
        sh_type: SHT_PROGBITS
        sh_flags: 
        sh_addr: 0
        sh_offset: 40944
        sh_size: 693
        sh_link: 0
        sh_info: 0
        sh_addralign: 1
        sh_entsize: 1

entry: 25
        sh_name: .gnu_debuglink
        sh_type: SHT_PROGBITS
        sh_flags: 
        sh_addr: 0
        sh_offset: 41640
        sh_size: 16
        sh_link: 0
        sh_info: 0
        sh_addralign: 4
        sh_entsize: 0

entry: 26
        sh_name: .shstrtab
        sh_type: SHT_STRTAB
        sh_flags: 
        sh_addr: 0
        sh_offset: 41656
        sh_size: 208
        sh_link: 0
        sh_info: 0
        sh_addralign: 1
        sh_entsize: 0

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




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



More information about the svn-src-head mailing list