svn commit: r339876 - head/libexec/rtld-elf
Mark Millard
marklmi26-fbsd at yahoo.com
Wed Oct 31 18:38:52 UTC 2018
On 2018-Oct-30, at 3:23 PM, Alexander Richardson <arichardson at freebsd.org> wrote:
> . . .
> Before this change obj->textsize was always set as the end of
> PT_LOAD[0]. Now it will contain everything up to the end of the last
> PT_LOAD with execute permissions. In the binary you dumped this is
> PT_LOAD[0] both before and after the patch so there is no change in
> behaviour. The .got and .plt we not included in textsize before this
> patch either. Therefore the only way I can see this patch breaking
> anything is if the PHDRS of one of the loaded libraries causes a
> change in behaviour.
A fair night's sleep helps.
Not only did I read something into your description that was
not there, I looked at powerpc64 when it turns out that
only 32-bit powerpc shows the problem. (I asked.)
I'm also told reverting just those changes fixes 32-bit
powerpc context.
So I'm using an older 32-bit powerpc context to look at:
https://artifact.ci.freebsd.org/snapshot/head/r339870/powerpc/powerpc/base*.txz
materials now. -r339870 is the first 32-bit powerpc build
available there after the changes were made.
So in a /339870/ area from expanding the .txz's
inside it I get:
# elfdump -p ./bin/ls | less
program header:
entry: 0
p_type: PT_PHDR
p_offset: 52
p_vaddr: 0x1800034
p_paddr: 0x1800034
p_filesz: 224
p_memsz: 224
p_flags: PF_X|PF_R
p_align: 4
entry: 1
p_type: PT_INTERP
p_offset: 276
p_vaddr: 0x1800114
p_paddr: 0x1800114
p_filesz: 21
p_memsz: 21
p_flags: PF_R
p_align: 1
entry: 2
p_type: PT_LOAD
p_offset: 0
p_vaddr: 0x1800000
p_paddr: 0x1800000
p_filesz: 34112
p_memsz: 34112
p_flags: PF_X|PF_R
p_align: 65536
entry: 3
p_type: PT_LOAD
p_offset: 34112
p_vaddr: 0x1818540
p_paddr: 0x1818540
p_filesz: 316
p_memsz: 1752
p_flags: PF_X|PF_W|PF_R
p_align: 65536
entry: 4
p_type: PT_DYNAMIC
p_offset: 34132
p_vaddr: 0x1818554
p_paddr: 0x1818554
p_filesz: 216
p_memsz: 216
p_flags: PF_W|PF_R
p_align: 4
entry: 5
p_type: PT_NOTE
p_offset: 300
p_vaddr: 0x180012c
p_paddr: 0x180012c
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: 4
I note some things unique to this compared
to powerpc64 and to what the old code would
do for what is unique:
There are 2 PT_LOADS with PF_X and there are a
bunch of pages between that are not covered by
any entry. This is from p_align being 65536 from
what I can tell.
entry 2:
0x1800000+34112==0x1808540 for the ending of the read-only PF_X area.
entry 3:
0x1818540 for the beginning of the writable PF_X area.
0x0010000 differences: 65536 Bytes.
What is the handling of the page range that is
not described in any entry? Is
__syncicache(obj->mapbase, obj->textsize)
spanning the hole valid? Previously the
hole was not spanned as I understand.
Libraries also have the hole between the
PT_LOAD with PF_X ranges. Using /lib/libc.so
as an example:
# elfdump -p ./lib/libc.so.7 | less
program header:
entry: 0
p_type: PT_LOAD
p_offset: 0
p_vaddr: 0
p_paddr: 0
p_filesz: 1746472
p_memsz: 1746472
p_flags: PF_X|PF_R
p_align: 65536
entry: 1
p_type: PT_LOAD
p_offset: 1746480
p_vaddr: 0x1ba630
p_paddr: 0x1ba630
p_filesz: 44188
p_memsz: 201536
p_flags: PF_X|PF_W|PF_R
p_align: 65536
entry: 2
p_type: PT_DYNAMIC
p_offset: 1762600
p_vaddr: 0x1be528
p_paddr: 0x1be528
p_filesz: 192
p_memsz: 192
p_flags: PF_W|PF_R
p_align: 4
entry: 3
p_type: PT_TLS
p_offset: 1746480
p_vaddr: 0x1ba630
p_paddr: 0x1ba630
p_filesz: 2832
p_memsz: 2860
p_flags: PF_R
p_align: 16
entry: 4
p_type: PT_NULL
p_offset: 1745288
p_vaddr: 0x1aa188
p_paddr: 0x1aa188
p_filesz: 236
p_memsz: 236
p_flags: PF_R
p_align: 4
entry: 5
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: 4
1746472==0x1AA628 for the ending of the readonly code.
0x1ba630 for the beginning of the writable code.
0x10008 difference: 655544 bytes.
I doubt the following would contribute but I
note them:
PT_PHDR for ./bin/ls has PF_X indicated.
Various other entries overlap with the
PT_LOAD's that have PF_X.
===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)
More information about the svn-src-head
mailing list