NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: lib/57792: SIGSEGV in ld.elf_so / _rtld_call_ifunc
The following reply was made to PR lib/57792; it has been noted by GNATS.
From: Taylor R Campbell <riastradh%NetBSD.org@localhost>
To: Patrick Welche <prlw1%cam.ac.uk@localhost>, RVP <rvp%SDF.ORG@localhost>
Cc: gnats-bugs%NetBSD.org@localhost, netbsd-bugs%NetBSD.org@localhost, joerg%NetBSD.org@localhost,
skrll%NetBSD.org@localhost, mrg%NetBSD.org@localhost
Subject: Re: lib/57792: SIGSEGV in ld.elf_so / _rtld_call_ifunc
Date: Mon, 15 Jul 2024 16:08:56 +0000
The following test cases now exhibit the difference:
/usr/tests/libexec/ld.elf_so/t_ifunc (relro, bind lazily)
/usr/tests/libexec/ld.elf_so/t_ifunc_now (relro, bind now)
t_ifunc works; t_ifunc_now crashes.
Setting a breakpoint on
https://nxr.netbsd.org/xref/src/libexec/ld.elf_so/reloc.c?r=3D1.118#311
where t_ifunc_now crashes reveals:
[t_ifunc] where =3D 0x55c03018 <*ABS*@got.plt>
[t_ifunc_now] where =3D 0x1b5e02f10 <*ABS*@got.plt>
The high-order parts of the addresses -- 0x55c0...., 0x1b5e0.... --
are ASLR red herrings; it's the low-order parts that are relevant.
Examining /proc/<pid>/maps reveals:
0000000055c02000-0000000055c03000 r--p 0000000000002000 2bd:13ede 679572 =
/home/riastradh/netbsd/10/obj.amd64/destdir.amd64=
/usr/tests/libexec/ld.elf_so/t_ifunc
0000000055c03000-0000000055c04000 rw-p 0000000000000000 00:00 0
00000001b5e02000-00000001b5e03000 r--p 0000000000002000 2bd:13ede 679575 =
/home/riastradh/netbsd/10/obj.amd64/destdir.amd64=
/usr/tests/libexec/ld.elf_so/t_ifunc_now
00000001b5e03000-00000001b5e04000 rw-p 0000000000000000 00:00 0
In both cases, relative to the base address (0x55c00000, 0x1b5e00000),
page 0x2000 is mapped read-only and page 0x3000 is mapped read/write.
- In the working case (t_ifunc), the ifunc relocation is in the
read/write page at 0x3018.
- In the broken case (t_ifunc_now), the ifunc relocation is in the
read-only page at 0x2f10.
readelf shows the following headers and segments:
$ readelf -a t_ifunc
...
0x0000000000000003 (PLTGOT) 0x3fe8
...
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000000040 0x0000000000000040
0x0000000000000230 0x0000000000000230 R 0x8
INTERP 0x0000000000000270 0x0000000000000270 0x0000000000000270
0x0000000000000017 0x0000000000000017 R 0x1
[Requesting program interpreter: /usr/libexec/ld.elf_so]
LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000c90 0x0000000000000c90 R 0x1000
LOAD 0x0000000000001000 0x0000000000001000 0x0000000000001000
0x0000000000000c6e 0x0000000000000c6e R E 0x1000
LOAD 0x0000000000002000 0x0000000000002000 0x0000000000002000
0x000000000000052c 0x000000000000052c R 0x1000
LOAD 0x0000000000002d38 0x0000000000003d38 0x0000000000003d38
0x00000000000003e2 0x0000000000000450 RW 0x1000
...
04 .rodata .eh_frame_hdr .eh_frame=20
05 .ctors .dtors .jcr .data.rel.ro .dynamic .got .got.plt .data .bss=
=20
...
$ readelf -a t_ifunc_now
...
0x0000000000000003 (PLTGOT) 0x3ef8
...
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000000040 0x0000000000000040
0x0000000000000230 0x0000000000000230 R 0x8
INTERP 0x0000000000000270 0x0000000000000270 0x0000000000000270
0x0000000000000017 0x0000000000000017 R 0x1
[Requesting program interpreter: /usr/libexec/ld.elf_so]
LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000c90 0x0000000000000c90 R 0x1000
LOAD 0x0000000000001000 0x0000000000001000 0x0000000000001000
0x0000000000000c6e 0x0000000000000c6e R E 0x1000
LOAD 0x0000000000002000 0x0000000000002000 0x0000000000002000
0x000000000000052c 0x000000000000052c R 0x1000
LOAD 0x0000000000002c78 0x0000000000003c78 0x0000000000003c78
0x00000000000003da 0x0000000000000450 RW 0x1000
...
04 .rodata .eh_frame_hdr .eh_frame=20
05 .ctors .dtors .jcr .data.rel.ro .dynamic .got .data .bss=20
...
Someone who has more details of linkers and gots and plts may be able
to pursue this thread more efficiently than I can at this point.
Home |
Main Index |
Thread Index |
Old Index