mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
Update.
2004-01-26 David Mosberger <davidm@hpl.hp.com> * elf/link.h (struct dl_phdr_info): Fix typo in comment. * elf/rtld.c (dl_main): After incrementing dl_nloaded, also increment dl_load_adds. * elf/dl-iteratephdr.c (__dl_iterate_phdr): Replace GL(dl_load_subs) with equivalent GL(dl_load_adds - GL(dl_nloaded). (dl_iterate_phdr): Likewise. * elf/dl-close.c (_dl_close): Delete increment of GL(dl_load_subs). * elf/dl-support.c: Remove global variable _dl_load_subs. * sysdeps/generic/ldsodefs.h (struct rtld_global): Remove _dl_load_subs member. 2004-01-27 Jakub Jelinek <jakub@redhat.com> * elf/rtld.c (_dl_start_final): Don't set l_relro_* here. (_dl_start): And neither here. (dl_main): Set GL(dl_loaded)->l_relro_* and GL(dl_rtld_map)->l_relro_*.
This commit is contained in:
parent
bed12f78fa
commit
e8ed861df7
20
ChangeLog
20
ChangeLog
@ -1,3 +1,23 @@
|
||||
2004-01-26 David Mosberger <davidm@hpl.hp.com>
|
||||
|
||||
* elf/link.h (struct dl_phdr_info): Fix typo in comment.
|
||||
* elf/rtld.c (dl_main): After incrementing dl_nloaded, also
|
||||
increment dl_load_adds.
|
||||
* elf/dl-iteratephdr.c (__dl_iterate_phdr): Replace GL(dl_load_subs)
|
||||
with equivalent GL(dl_load_adds - GL(dl_nloaded).
|
||||
(dl_iterate_phdr): Likewise.
|
||||
* elf/dl-close.c (_dl_close): Delete increment of GL(dl_load_subs).
|
||||
* elf/dl-support.c: Remove global variable _dl_load_subs.
|
||||
* sysdeps/generic/ldsodefs.h (struct rtld_global): Remove
|
||||
_dl_load_subs member.
|
||||
|
||||
2004-01-27 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* elf/rtld.c (_dl_start_final): Don't set l_relro_* here.
|
||||
(_dl_start): And neither here.
|
||||
(dl_main): Set GL(dl_loaded)->l_relro_* and
|
||||
GL(dl_rtld_map)->l_relro_*.
|
||||
|
||||
2004-01-23 David Mosberger <davidm@hpl.hp.com>
|
||||
|
||||
* sysdeps/generic/ldsodefs.h (struct rtld_global): Add members
|
||||
|
@ -319,7 +319,6 @@ _dl_close (void *_map)
|
||||
/* Notify the debugger we are about to remove some loaded objects. */
|
||||
_r_debug.r_state = RT_DELETE;
|
||||
_dl_debug_state ();
|
||||
++GL(dl_load_subs);
|
||||
|
||||
#ifdef USE_TLS
|
||||
size_t tls_free_start;
|
||||
|
@ -49,7 +49,7 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
|
||||
info.dlpi_phdr = l->l_phdr;
|
||||
info.dlpi_phnum = l->l_phnum;
|
||||
info.dlpi_adds = GL(dl_load_adds);
|
||||
info.dlpi_subs = GL(dl_load_subs);
|
||||
info.dlpi_subs = GL(dl_load_adds) - GL(dl_nloaded);
|
||||
ret = callback (&info, sizeof (struct dl_phdr_info), data);
|
||||
if (ret)
|
||||
break;
|
||||
@ -87,7 +87,7 @@ dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
|
||||
info.dlpi_phdr = _dl_phdr;
|
||||
info.dlpi_phnum = _dl_phnum;
|
||||
info.dlpi_adds = GL(dl_load_adds);
|
||||
info.dlpi_subs = GL(dl_load_subs);
|
||||
info.dlpi_subs = GL(dl_load_adds) - GL(dl_nloaded);
|
||||
ret = (*callback) (&info, sizeof (struct dl_phdr_info), data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -73,8 +73,6 @@ unsigned int _dl_nloaded;
|
||||
|
||||
/* Incremented whenever something may have been added to dl_loaded. */
|
||||
unsigned long long _dl_load_adds;
|
||||
/* Incremented whenever something may have been removed from dl_loaded. */
|
||||
unsigned long long _dl_load_subs;
|
||||
|
||||
/* Fake scope. In dynamically linked binaries this is the scope of the
|
||||
main application but here we don't have something like this. So
|
||||
|
@ -103,7 +103,7 @@ struct dl_phdr_info
|
||||
|
||||
/* Note: the next two members were introduced after the first
|
||||
version of this structure was available. Check the SIZE
|
||||
argument pass to the dl_iterate_phdr() callback to determine
|
||||
argument passed to the dl_iterate_phdr() callback to determine
|
||||
whether or not they are provided. */
|
||||
|
||||
/* Incremented when a new object may have been added. */
|
||||
|
35
elf/rtld.c
35
elf/rtld.c
@ -224,8 +224,6 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
|
||||
memcpy (GL(dl_rtld_map).l_info, info->l.l_info,
|
||||
sizeof GL(dl_rtld_map).l_info);
|
||||
GL(dl_rtld_map).l_mach = info->l.l_mach;
|
||||
GL(dl_rtld_map).l_relro_addr = info->l.l_relro_addr;
|
||||
GL(dl_rtld_map).l_relro_size = info->l.l_relro_size;
|
||||
#endif
|
||||
_dl_setup_hash (&GL(dl_rtld_map));
|
||||
GL(dl_rtld_map).l_opencount = 1;
|
||||
@ -351,17 +349,16 @@ _dl_start (void *arg)
|
||||
on the `l_addr' value, which is not the value we want when prelinked. */
|
||||
#if USE___THREAD
|
||||
dtv_t initdtv[3];
|
||||
#endif /* USE___THREAD */
|
||||
ElfW(Ehdr) *ehdr
|
||||
# ifdef DONT_USE_BOOTSTRAP_MAP
|
||||
= (ElfW(Ehdr) *) &_begin;
|
||||
# else
|
||||
# error This will not work with prelink.
|
||||
= (ElfW(Ehdr) *) bootstrap_map.l_addr;
|
||||
# endif
|
||||
ElfW(Phdr) *phdr = (ElfW(Phdr) *) ((void *) ehdr + ehdr->e_phoff);
|
||||
size_t cnt = ehdr->e_phnum; /* PT_TLS is usually the last phdr. */
|
||||
while (cnt-- > 0)
|
||||
#if USE___THREAD
|
||||
if (phdr[cnt].p_type == PT_TLS)
|
||||
{
|
||||
void *tlsblock;
|
||||
@ -456,14 +453,11 @@ _dl_start (void *arg)
|
||||
|
||||
/* So far this is module number one. */
|
||||
bootstrap_map.l_tls_modid = 1;
|
||||
|
||||
/* There can only be one PT_TLS entry. */
|
||||
break;
|
||||
}
|
||||
else
|
||||
#endif /* USE___THREAD */
|
||||
if (phdr[cnt].p_type == PT_GNU_RELRO)
|
||||
{
|
||||
bootstrap_map.l_relro_addr = phdr[cnt].p_vaddr;
|
||||
bootstrap_map.l_relro_size = phdr[cnt].p_memsz;
|
||||
}
|
||||
|
||||
#ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
|
||||
ELF_MACHINE_BEFORE_RTLD_RELOC (bootstrap_map.l_info);
|
||||
@ -958,6 +952,11 @@ of this helper program; chances are you did not intend to run this program.\n\
|
||||
case PT_GNU_STACK:
|
||||
GL(dl_stack_flags) = ph->p_flags;
|
||||
break;
|
||||
|
||||
case PT_GNU_RELRO:
|
||||
GL(dl_loaded)->l_relro_addr = ph->p_vaddr;
|
||||
GL(dl_loaded)->l_relro_size = ph->p_memsz;
|
||||
break;
|
||||
}
|
||||
#ifdef USE_TLS
|
||||
/* Adjust the address of the TLS initialization image in case
|
||||
@ -1020,6 +1019,7 @@ of this helper program; chances are you did not intend to run this program.\n\
|
||||
GL(dl_loaded)->l_next = &GL(dl_rtld_map);
|
||||
GL(dl_rtld_map).l_prev = GL(dl_loaded);
|
||||
++GL(dl_nloaded);
|
||||
++GL(dl_load_adds);
|
||||
|
||||
/* If LD_USE_LOAD_BIAS env variable has not been seen, default
|
||||
to not using bias for non-prelinked PIEs and libraries
|
||||
@ -1030,10 +1030,21 @@ of this helper program; chances are you did not intend to run this program.\n\
|
||||
/* Set up the program header information for the dynamic linker
|
||||
itself. It is needed in the dl_iterate_phdr() callbacks. */
|
||||
ElfW(Ehdr) *rtld_ehdr = (ElfW(Ehdr) *) GL(dl_rtld_map).l_map_start;
|
||||
GL(dl_rtld_map).l_phdr = (ElfW(Phdr) *) (GL(dl_rtld_map).l_map_start
|
||||
+ rtld_ehdr->e_phoff);
|
||||
ElfW(Phdr) *rtld_phdr = (ElfW(Phdr) *) (GL(dl_rtld_map).l_map_start
|
||||
+ rtld_ehdr->e_phoff);
|
||||
GL(dl_rtld_map).l_phdr = rtld_phdr;
|
||||
GL(dl_rtld_map).l_phnum = rtld_ehdr->e_phnum;
|
||||
|
||||
/* PT_GNU_RELRO is usually the last phdr. */
|
||||
size_t cnt = rtld_ehdr->e_phnum;
|
||||
while (cnt-- > 0)
|
||||
if (rtld_phdr[cnt].p_type == PT_GNU_RELRO)
|
||||
{
|
||||
GL(dl_rtld_map).l_relro_addr = rtld_phdr[cnt].p_vaddr;
|
||||
GL(dl_rtld_map).l_relro_size = rtld_phdr[cnt].p_memsz;
|
||||
break;
|
||||
}
|
||||
|
||||
/* We have two ways to specify objects to preload: via environment
|
||||
variable and via the file /etc/ld.so.preload. The latter can also
|
||||
be used when security is enabled. */
|
||||
|
@ -267,8 +267,6 @@ struct rtld_global
|
||||
|
||||
/* Incremented whenever something may have been added to dl_loaded. */
|
||||
EXTERN unsigned long long _dl_load_adds;
|
||||
/* Incremented whenever something may have been removed from dl_loaded. */
|
||||
EXTERN unsigned long long _dl_load_subs;
|
||||
|
||||
#ifndef MAP_ANON
|
||||
/* File descriptor referring to the zero-fill device. */
|
||||
|
Loading…
Reference in New Issue
Block a user