ld.so: Initialize bootstrap_map.l_ld_readonly [BZ #28340]

1. Define DL_RO_DYN_SECTION to initalize bootstrap_map.l_ld_readonly
before calling elf_get_dynamic_info to get dynamic info in bootstrap_map,
2. Define a single

static inline bool
dl_relocate_ld (const struct link_map *l)
{
  /* Don't relocate dynamic section if it is readonly  */
  return !(l->l_ld_readonly || DL_RO_DYN_SECTION);
}

This updates BZ #28340 fix.
This commit is contained in:
H.J. Lu 2021-09-23 09:06:49 -07:00
parent 1d550265a7
commit 2ec99d8c42
5 changed files with 17 additions and 27 deletions

View File

@ -547,6 +547,7 @@ _dl_start (void *arg)
/* Read our own dynamic section and fill in the info array. */
bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic ();
bootstrap_map.l_ld_readonly = DL_RO_DYN_SECTION;
elf_get_dynamic_info (&bootstrap_map, true, false);
#if NO_TLS_OFFSET != 0

View File

@ -19,14 +19,7 @@
#ifndef _DL_RELOCATE_LD_H
#define _DL_RELOCATE_LD_H
/* Return true if dynamic section in the shared library L should be
relocated. */
static inline bool
dl_relocate_ld (const struct link_map *l)
{
/* Don't relocate dynamic section if it is readonly */
return !l->l_ld_readonly;
}
/* The dynamic section is writable. */
#define DL_RO_DYN_SECTION 0
#endif /* _DL_RELOCATE_LD_H */

View File

@ -69,6 +69,16 @@ __BEGIN_DECLS
`ElfW(TYPE)' is used in place of `Elf32_TYPE' or `Elf64_TYPE'. */
#define ELFW(type) _ElfW (ELF, __ELF_NATIVE_CLASS, type)
/* Return true if dynamic section in the shared library L should be
relocated. */
static inline bool
dl_relocate_ld (const struct link_map *l)
{
/* Don't relocate dynamic section if it is readonly */
return !(l->l_ld_readonly || DL_RO_DYN_SECTION);
}
/* All references to the value of l_info[DT_PLTGOT],
l_info[DT_STRTAB], l_info[DT_SYMTAB], l_info[DT_RELA],
l_info[DT_REL], l_info[DT_JMPREL], and l_info[VERSYMIDX (DT_VERSYM)]

View File

@ -19,14 +19,7 @@
#ifndef _DL_RELOCATE_LD_H
#define _DL_RELOCATE_LD_H
/* Return true if dynamic section in the shared library L should be
relocated. */
static inline bool
dl_relocate_ld (const struct link_map *l)
{
/* Never relocate dynamic section. */
return false;
}
/* The dynamic section is readonly. */
#define DL_RO_DYN_SECTION 1
#endif /* _DL_RELOCATE_LD_H */

View File

@ -19,14 +19,7 @@
#ifndef _DL_RELOCATE_LD_H
#define _DL_RELOCATE_LD_H
/* Return true if dynamic section in the shared library L should be
relocated. */
static inline bool
dl_relocate_ld (const struct link_map *l)
{
/* Never relocate dynamic section for ABI compatibility. */
return false;
}
/* The dynamic section is readonly for ABI compatibility. */
#define DL_RO_DYN_SECTION 1
#endif /* _DL_RELOCATE_LD_H */