mirror of
https://sourceware.org/git/glibc.git
synced 2025-12-24 17:51:17 +03:00
Update.
* posix/unistd.h: Move declaration of __libc_enable_secure to... * include/unistd.h: ...here. * elf/dl-open.c (dl_open_worker): If DST is used in SUID program punt. * elf/dl-deps.c (expand_dst): Likewise. * elf/dynamic-link.h: Set DT_SYMBOLIC, DT_TEXTREL, and DT_BIND_NOW based on DT_FLAGS value. * elf/do-lookup.h: Remove reference_name parameter, add undef_map. Add test for symbols marked STV_HIDDEN. * elf/dl-lookup.c (_dl_lookup_symbol): Remove reference_name parameter, add undef_map. Compute reference_name locally. Update call to do_lookup. (_dl_lookup_symbol_skip): Likewise. (_dl_lookup_versioned_symbol): Likewise. (_dl_lookup_versioned_symbol_skip): Likewise. * elf/dl-libc.c: Update call to _dl_lookup_*symbol. * elf/dl-runtime.c: Likewise. * elf/dl-sym.c: Likewise. * elf/dl-symbol.c: Likewise. * elf/ldsodefs.h: Adjust prototypes. * elf/dl-reloc.c (RESOLV): Add test for STV_PROTECTED flag set and handle appropriately. Add comment about DT_TEXTREL. * elf/dl-runtime.c: Likewise.
This commit is contained in:
110
elf/dl-runtime.c
110
elf/dl-runtime.c
@@ -66,32 +66,40 @@ fixup (
|
||||
/* Sanity check that we're really looking at a PLT relocation. */
|
||||
assert (ELFW(R_TYPE)(reloc->r_info) == ELF_MACHINE_JMP_SLOT);
|
||||
|
||||
/* Look up the target symbol. */
|
||||
switch (l->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
|
||||
/* Look up the target symbol. If the symbol is marked STV_PROTEXTED
|
||||
don't look in the global scope. */
|
||||
if (ELFW(ST_VISIBILITY) (sym->st_other) != STV_PROTECTED)
|
||||
{
|
||||
default:
|
||||
{
|
||||
const ElfW(Half) *vernum =
|
||||
(const void *) l->l_info[VERSYMIDX (DT_VERSYM)]->d_un.d_ptr;
|
||||
ElfW(Half) ndx = vernum[ELFW(R_SYM) (reloc->r_info)];
|
||||
const struct r_found_version *version = &l->l_versions[ndx];
|
||||
|
||||
if (version->hash != 0)
|
||||
switch (l->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
|
||||
{
|
||||
default:
|
||||
{
|
||||
value = _dl_lookup_versioned_symbol(strtab + sym->st_name,
|
||||
&sym, l->l_scope, l->l_name,
|
||||
version, ELF_MACHINE_JMP_SLOT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0:
|
||||
value = _dl_lookup_symbol (strtab + sym->st_name, &sym, l->l_scope,
|
||||
l->l_name, ELF_MACHINE_JMP_SLOT);
|
||||
}
|
||||
const ElfW(Half) *vernum =
|
||||
(const void *) l->l_info[VERSYMIDX (DT_VERSYM)]->d_un.d_ptr;
|
||||
ElfW(Half) ndx = vernum[ELFW(R_SYM) (reloc->r_info)];
|
||||
const struct r_found_version *version = &l->l_versions[ndx];
|
||||
|
||||
/* Currently value contains the base load address of the object
|
||||
that defines sym. Now add in the symbol offset. */
|
||||
value = (sym ? value + sym->st_value : 0);
|
||||
if (version->hash != 0)
|
||||
{
|
||||
value = _dl_lookup_versioned_symbol(strtab + sym->st_name, l,
|
||||
&sym, l->l_scope, version,
|
||||
ELF_MACHINE_JMP_SLOT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0:
|
||||
value = _dl_lookup_symbol (strtab + sym->st_name, l, &sym,
|
||||
l->l_scope, ELF_MACHINE_JMP_SLOT);
|
||||
}
|
||||
|
||||
/* Currently value contains the base load address of the object
|
||||
that defines sym. Now add in the symbol offset. */
|
||||
value = (sym ? value + sym->st_value : 0);
|
||||
}
|
||||
else
|
||||
/* We already found the symbol. The module (and therefore its load
|
||||
address) is also known. */
|
||||
value = l->l_addr + sym->st_value;
|
||||
|
||||
/* And now perhaps the relocation addend. */
|
||||
value = elf_machine_plt_value (l, reloc, value);
|
||||
@@ -141,33 +149,41 @@ profile_fixup (
|
||||
/* Sanity check that we're really looking at a PLT relocation. */
|
||||
assert (ELFW(R_TYPE)(reloc->r_info) == ELF_MACHINE_JMP_SLOT);
|
||||
|
||||
/* Look up the target symbol. */
|
||||
switch (l->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
|
||||
/* Look up the target symbol. If the symbol is marked STV_PROTEXTED
|
||||
don't look in the global scope. */
|
||||
if (ELFW(ST_VISIBILITY) (sym->st_other) != STV_PROTECTED)
|
||||
{
|
||||
default:
|
||||
{
|
||||
const ElfW(Half) *vernum =
|
||||
(const void *) l->l_info[VERSYMIDX (DT_VERSYM)]->d_un.d_ptr;
|
||||
ElfW(Half) ndx = vernum[ELFW(R_SYM) (reloc->r_info)];
|
||||
const struct r_found_version *version = &l->l_versions[ndx];
|
||||
|
||||
if (version->hash != 0)
|
||||
switch (l->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
|
||||
{
|
||||
default:
|
||||
{
|
||||
value = _dl_lookup_versioned_symbol(strtab + sym->st_name,
|
||||
&sym, l->l_scope,
|
||||
l->l_name, version,
|
||||
ELF_MACHINE_JMP_SLOT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0:
|
||||
value = _dl_lookup_symbol (strtab + sym->st_name, &sym, l->l_scope,
|
||||
l->l_name, ELF_MACHINE_JMP_SLOT);
|
||||
}
|
||||
const ElfW(Half) *vernum =
|
||||
(const void *) l->l_info[VERSYMIDX (DT_VERSYM)]->d_un.d_ptr;
|
||||
ElfW(Half) ndx = vernum[ELFW(R_SYM) (reloc->r_info)];
|
||||
const struct r_found_version *version = &l->l_versions[ndx];
|
||||
|
||||
/* Currently value contains the base load address of the object
|
||||
that defines sym. Now add in the symbol offset. */
|
||||
value = (sym ? value + sym->st_value : 0);
|
||||
if (version->hash != 0)
|
||||
{
|
||||
value = _dl_lookup_versioned_symbol(strtab + sym->st_name,
|
||||
l, &sym, l->l_scope,
|
||||
version,
|
||||
ELF_MACHINE_JMP_SLOT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0:
|
||||
value = _dl_lookup_symbol (strtab + sym->st_name, l, &sym,
|
||||
l->l_scope, ELF_MACHINE_JMP_SLOT);
|
||||
}
|
||||
|
||||
/* Currently value contains the base load address of the object
|
||||
that defines sym. Now add in the symbol offset. */
|
||||
value = (sym ? value + sym->st_value : 0);
|
||||
}
|
||||
else
|
||||
/* We already found the symbol. The module (and therefore its load
|
||||
address) is also known. */
|
||||
value = l->l_addr + sym->st_value;
|
||||
|
||||
/* And now perhaps the relocation addend. */
|
||||
value = elf_machine_plt_value (l, reloc, value);
|
||||
|
||||
Reference in New Issue
Block a user