mirror of
https://sourceware.org/git/glibc.git
synced 2025-12-24 17:51:17 +03:00
rtld: Clean up PT_NOTE and add PT_GNU_PROPERTY handling
Add generic code to handle PT_GNU_PROPERTY notes. Invalid content is ignored, _dl_process_pt_gnu_property is always called after PT_LOAD segments are mapped and it has no failure modes. Currently only one NT_GNU_PROPERTY_TYPE_0 note is handled, which contains target specific properties: the _dl_process_gnu_property hook is called for each property. The old _dl_process_pt_note and _rtld_process_pt_note differ in how the program header is read. The old _dl_process_pt_note is called before PT_LOAD segments are mapped and _rtld_process_pt_note is called after PT_LOAD segments are mapped. The old _rtld_process_pt_note is removed and _dl_process_pt_note is always called after PT_LOAD segments are mapped and now it has no failure modes. The program headers are scanned backwards so that PT_NOTE can be skipped if PT_GNU_PROPERTY exists. Co-Authored-By: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
14
elf/rtld.c
14
elf/rtld.c
@@ -1507,11 +1507,17 @@ of this helper program; chances are you did not intend to run this program.\n\
|
||||
main_map->l_relro_addr = ph->p_vaddr;
|
||||
main_map->l_relro_size = ph->p_memsz;
|
||||
break;
|
||||
|
||||
}
|
||||
/* Process program headers again, but scan them backwards so
|
||||
that PT_NOTE can be skipped if PT_GNU_PROPERTY exits. */
|
||||
for (ph = &phdr[phnum]; ph != phdr; --ph)
|
||||
switch (ph[-1].p_type)
|
||||
{
|
||||
case PT_NOTE:
|
||||
if (_rtld_process_pt_note (main_map, ph))
|
||||
_dl_error_printf ("\
|
||||
ERROR: '%s': cannot process note segment.\n", _dl_argv[0]);
|
||||
_dl_process_pt_note (main_map, &ph[-1]);
|
||||
break;
|
||||
case PT_GNU_PROPERTY:
|
||||
_dl_process_pt_gnu_property (main_map, &ph[-1]);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user