1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-10 05:03:06 +03:00

elf: Remove unused l_text_end field from struct link_map

It is a left-over from commit 52a01100ad
("elf: Remove ad-hoc restrictions on dlopen callers [BZ #22787]").

When backporting commmit 6985865bc3
("elf: Always call destructors in reverse constructor order
(bug 30785)"), we can move the l_init_called_next field to this
place, so that the internal GLIBC_PRIVATE ABI does not change.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
Florian Weimer
2023-09-08 13:02:06 +02:00
parent 6985865bc3
commit 53df2ce688
5 changed files with 3 additions and 18 deletions

View File

@@ -1253,7 +1253,7 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
/* Now process the load commands and map segments into memory. /* Now process the load commands and map segments into memory.
This is responsible for filling in: This is responsible for filling in:
l_map_start, l_map_end, l_addr, l_contiguous, l_text_end, l_phdr l_map_start, l_map_end, l_addr, l_contiguous, l_phdr
*/ */
errstring = _dl_map_segments (l, fd, header, type, loadcmds, nloadcmds, errstring = _dl_map_segments (l, fd, header, type, loadcmds, nloadcmds,
maplength, has_holes, loader); maplength, has_holes, loader);

View File

@@ -83,14 +83,11 @@ struct loadcmd
/* This is a subroutine of _dl_map_segments. It should be called for each /* This is a subroutine of _dl_map_segments. It should be called for each
load command, some time after L->l_addr has been set correctly. It is load command, some time after L->l_addr has been set correctly. It is
responsible for setting up the l_text_end and l_phdr fields. */ responsible for setting the l_phdr fields */
static __always_inline void static __always_inline void
_dl_postprocess_loadcmd (struct link_map *l, const ElfW(Ehdr) *header, _dl_postprocess_loadcmd (struct link_map *l, const ElfW(Ehdr) *header,
const struct loadcmd *c) const struct loadcmd *c)
{ {
if (c->prot & PROT_EXEC)
l->l_text_end = l->l_addr + c->mapend;
if (l->l_phdr == 0 if (l->l_phdr == 0
&& c->mapoff <= header->e_phoff && c->mapoff <= header->e_phoff
&& ((size_t) (c->mapend - c->mapstart + c->mapoff) && ((size_t) (c->mapend - c->mapstart + c->mapoff)
@@ -103,7 +100,7 @@ _dl_postprocess_loadcmd (struct link_map *l, const ElfW(Ehdr) *header,
/* This is a subroutine of _dl_map_object_from_fd. It is responsible /* This is a subroutine of _dl_map_object_from_fd. It is responsible
for filling in several fields in *L: l_map_start, l_map_end, l_addr, for filling in several fields in *L: l_map_start, l_map_end, l_addr,
l_contiguous, l_text_end, l_phdr. On successful return, all the l_contiguous, l_phdr. On successful return, all the
segments are mapped (or copied, or whatever) from the file into their segments are mapped (or copied, or whatever) from the file into their
final places in the address space, with the correct page permissions, final places in the address space, with the correct page permissions,
and any bss-like regions already zeroed. It returns a null pointer and any bss-like regions already zeroed. It returns a null pointer

View File

@@ -477,7 +477,6 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
GL(dl_rtld_map).l_real = &GL(dl_rtld_map); GL(dl_rtld_map).l_real = &GL(dl_rtld_map);
GL(dl_rtld_map).l_map_start = (ElfW(Addr)) &__ehdr_start; GL(dl_rtld_map).l_map_start = (ElfW(Addr)) &__ehdr_start;
GL(dl_rtld_map).l_map_end = (ElfW(Addr)) _end; GL(dl_rtld_map).l_map_end = (ElfW(Addr)) _end;
GL(dl_rtld_map).l_text_end = (ElfW(Addr)) _etext;
/* Copy the TLS related data if necessary. */ /* Copy the TLS related data if necessary. */
#ifndef DONT_USE_BOOTSTRAP_MAP #ifndef DONT_USE_BOOTSTRAP_MAP
# if NO_TLS_OFFSET != 0 # if NO_TLS_OFFSET != 0
@@ -1119,7 +1118,6 @@ rtld_setup_main_map (struct link_map *main_map)
bool has_interp = false; bool has_interp = false;
main_map->l_map_end = 0; main_map->l_map_end = 0;
main_map->l_text_end = 0;
/* Perhaps the executable has no PT_LOAD header entries at all. */ /* Perhaps the executable has no PT_LOAD header entries at all. */
main_map->l_map_start = ~0; main_map->l_map_start = ~0;
/* And it was opened directly. */ /* And it was opened directly. */
@@ -1211,8 +1209,6 @@ rtld_setup_main_map (struct link_map *main_map)
allocend = main_map->l_addr + ph->p_vaddr + ph->p_memsz; allocend = main_map->l_addr + ph->p_vaddr + ph->p_memsz;
if (main_map->l_map_end < allocend) if (main_map->l_map_end < allocend)
main_map->l_map_end = allocend; main_map->l_map_end = allocend;
if ((ph->p_flags & PF_X) && allocend > main_map->l_text_end)
main_map->l_text_end = allocend;
/* The next expected address is the page following this load /* The next expected address is the page following this load
segment. */ segment. */
@@ -1272,8 +1268,6 @@ rtld_setup_main_map (struct link_map *main_map)
= (char *) main_map->l_tls_initimage + main_map->l_addr; = (char *) main_map->l_tls_initimage + main_map->l_addr;
if (! main_map->l_map_end) if (! main_map->l_map_end)
main_map->l_map_end = ~0; main_map->l_map_end = ~0;
if (! main_map->l_text_end)
main_map->l_text_end = ~0;
if (! GL(dl_rtld_map).l_libname && GL(dl_rtld_map).l_name) if (! GL(dl_rtld_map).l_libname && GL(dl_rtld_map).l_name)
{ {
/* We were invoked directly, so the program might not have a /* We were invoked directly, so the program might not have a

View File

@@ -51,9 +51,6 @@ setup_vdso (struct link_map *main_map __attribute__ ((unused)),
l->l_addr = ph->p_vaddr; l->l_addr = ph->p_vaddr;
if (ph->p_vaddr + ph->p_memsz >= l->l_map_end) if (ph->p_vaddr + ph->p_memsz >= l->l_map_end)
l->l_map_end = ph->p_vaddr + ph->p_memsz; l->l_map_end = ph->p_vaddr + ph->p_memsz;
if ((ph->p_flags & PF_X)
&& ph->p_vaddr + ph->p_memsz >= l->l_text_end)
l->l_text_end = ph->p_vaddr + ph->p_memsz;
} }
else else
/* There must be no TLS segment. */ /* There must be no TLS segment. */
@@ -62,7 +59,6 @@ setup_vdso (struct link_map *main_map __attribute__ ((unused)),
l->l_map_start = (ElfW(Addr)) GLRO(dl_sysinfo_dso); l->l_map_start = (ElfW(Addr)) GLRO(dl_sysinfo_dso);
l->l_addr = l->l_map_start - l->l_addr; l->l_addr = l->l_map_start - l->l_addr;
l->l_map_end += l->l_addr; l->l_map_end += l->l_addr;
l->l_text_end += l->l_addr;
l->l_ld = (void *) ((ElfW(Addr)) l->l_ld + l->l_addr); l->l_ld = (void *) ((ElfW(Addr)) l->l_ld + l->l_addr);
elf_get_dynamic_info (l, false, false); elf_get_dynamic_info (l, false, false);
_dl_setup_hash (l); _dl_setup_hash (l);

View File

@@ -253,8 +253,6 @@ struct link_map
/* Start and finish of memory map for this object. l_map_start /* Start and finish of memory map for this object. l_map_start
need not be the same as l_addr. */ need not be the same as l_addr. */
ElfW(Addr) l_map_start, l_map_end; ElfW(Addr) l_map_start, l_map_end;
/* End of the executable part of the mapping. */
ElfW(Addr) l_text_end;
/* Default array for 'l_scope'. */ /* Default array for 'l_scope'. */
struct r_scope_elem *l_scope_mem[4]; struct r_scope_elem *l_scope_mem[4];