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