* malloc/Makefile: Run tst-mtrace only with shared libs.

	* stdio-common/Makefile: Run unbputc and tst-printf tests only
	with shared libs.

2000-07-10  Maciej W. Rozycki  <macro@ds2.pg.gda.pl>

	* sysdeps/mips/dl-machine.h (elf_machine_runtime_link_map): Verify
	that gpreg really points to the GOT section of the calling object.
	Scan all PT_LOAD segments of objects for stub_pc, instead of only
	checking a start address of first one.
	Fix typos.
	* sysdeps/mips/mips64/dl-machine.h (elf_machine_runtime_link_map):
	Likewise.

	* sysdeps/mips/dl-machine.h (__dl_runtime_resolve): Fix a typo.

2000-07-10  Andreas Jaeger  <aj@suse.de>
This commit is contained in:
Andreas Jaeger 2000-07-10 13:52:21 +00:00
parent 989eef3e8b
commit 02ba6e61d2
5 changed files with 92 additions and 57 deletions

View File

@ -1,3 +1,22 @@
2000-07-10 Andreas Jaeger <aj@suse.de>
* malloc/Makefile: Run tst-mtrace only with shared libs.
* stdio-common/Makefile: Run unbputc and tst-printf tests only
with shared libs.
2000-07-10 Maciej W. Rozycki <macro@ds2.pg.gda.pl>
* sysdeps/mips/dl-machine.h (elf_machine_runtime_link_map): Verify
that gpreg really points to the GOT section of the calling object.
Scan all PT_LOAD segments of objects for stub_pc, instead of only
checking a start address of first one.
Fix typos.
* sysdeps/mips/mips64/dl-machine.h (elf_machine_runtime_link_map):
Likewise.
* sysdeps/mips/dl-machine.h (__dl_runtime_resolve): Fix a typo.
2000-07-10 Andreas Jaeger <aj@suse.de>
* sysdeps/unix/sysv/linux/sigaction.c: Fix typo

View File

@ -91,11 +91,12 @@ $(objpfx)libmcheck.a: $(objpfx)mcheck-init.o
lib: $(objpfx)libmcheck.a
ifeq (yes,$(build-shared))
.PHONY: do-tst-mtrace
tests: do-tst-mtrace
do-tst-mtrace: tst-mtrace.sh $(objpfx)tst-mtrace
$(SHELL) -e $< $(common-objpfx)
endif
# Uncomment this for test releases. For public releases it is too expensive.
#CPPFLAGS-malloc.o += -DMALLOC_DEBUG

View File

@ -60,6 +60,7 @@ test-srcs = tst-unbputc tst-printf
include ../Rules
ifeq (yes,$(build-shared))
.PHONY: do-tst-unbputc do-tst-printf
tests: do-tst-unbputc do-tst-printf
@ -70,6 +71,7 @@ $(objpfx)tst-unbputc.out: $(objpfx)tst-unbputc tst-unbputc.sh
do-tst-printf: $(objpfx)tst-printf.out
$(objpfx)tst-printf.out: $(objpfx)tst-printf tst-printf.sh
$(SHELL) -e tst-printf.sh $(common-objpfx)
endif
CFLAGS-vfprintf.c = -Wno-uninitialized
CFLAGS-tst-printf.c = -Wno-format

View File

@ -141,9 +141,9 @@ elf_machine_runtime_link_map (ElfW(Addr) gpreg, ElfW(Addr) stub_pc)
extern int _dl_mips_gnu_objects;
/* got[1] is reserved to keep its link map address for the shared
object generated by gnu linker. If all are such object, we can
find link map from current GPREG simply. If not so, get link map
for callers object containing STUB_PC. */
object generated by the gnu linker. If all are such objects, we
can find the link map from current GPREG simply. If not so, get
the link map for caller's object containing STUB_PC. */
if (_dl_mips_gnu_objects)
{
@ -153,45 +153,51 @@ elf_machine_runtime_link_map (ElfW(Addr) gpreg, ElfW(Addr) stub_pc)
g1 = ((ElfW(Word) *) got)[1];
if ((g1 & ELF_MIPS_GNU_GOT1_MASK) != 0)
return (struct link_map *) (g1 & ~ELF_MIPS_GNU_GOT1_MASK);
{
struct link_map *l =
(struct link_map *) (g1 & ~ELF_MIPS_GNU_GOT1_MASK);
ElfW(Addr) base, limit;
const ElfW(Phdr) *p = l->l_phdr;
ElfW(Half) this, nent = l->l_phnum;
/* For the common case of a stub being called from the containing
object, STUB_PC will point to somewhere within the object that
is described by the link map fetched via got[1]. Otherwise we
have to scan all maps. */
for (this = 0; this < nent; this++)
{
if (p[this].p_type == PT_LOAD)
{
base = p[this].p_vaddr + l->l_addr;
limit = base + p[this].p_memsz;
if (stub_pc >= base && stub_pc < limit)
return l;
}
}
}
}
{
struct link_map *l = _dl_loaded;
struct link_map *ret = 0;
ElfW(Addr) candidate = 0;
while (l)
{
ElfW(Addr) base = 0;
ElfW(Addr) base, limit;
const ElfW(Phdr) *p = l->l_phdr;
ElfW(Half) this, nent = l->l_phnum;
/* Get the base. */
for (this = 0; this < nent; this++)
if (p[this].p_type == PT_LOAD)
{
base = p[this].p_vaddr + l->l_addr;
break;
}
if (! base)
for (this = 0; this < nent; ++this)
{
l = l->l_next;
continue;
}
/* Find closest link base addr. */
if ((base < stub_pc) && (candidate < base))
{
candidate = base;
ret = l;
if (p[this].p_type == PT_LOAD)
{
base = p[this].p_vaddr + l->l_addr;
limit = base + p[this].p_memsz;
if (stub_pc >= base && stub_pc < limit)
return l;
}
}
l = l->l_next;
}
if (candidate && ret && (candidate < stub_pc))
return ret;
else if (!candidate)
return _dl_loaded;
}
_dl_signal_error (0, NULL, "cannot find runtime link map");
@ -208,7 +214,7 @@ elf_machine_runtime_link_map (ElfW(Addr) gpreg, ElfW(Addr) stub_pc)
Other architectures call fixup from dl-runtime.c in
_dl_runtime_resolve. MIPS instead calls __dl_runtime_resolve. We
have to use our own version because of the way the got section is
treaded on MIPS (we've also got ELF_MACHINE_PLT defined). */
treated on MIPS (we've also got ELF_MACHINE_PLT defined). */
#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
/* The flag _dl_mips_gnu_objects is set if all dynamic objects are \

View File

@ -252,9 +252,9 @@ elf_machine_runtime_link_map (ElfW(Addr) gpreg, ElfW(Addr) stub_pc)
extern int _dl_mips_gnu_objects;
/* got[1] is reserved to keep its link map address for the shared
object generated by gnu linker. If all are such object, we can
find link map from current GPREG simply. If not so, get link map
for callers object containing STUB_PC. */
object generated by the gnu linker. If all are such objects, we
can find the link map from current GPREG simply. If not so, get
the link map for caller's object containing STUB_PC. */
if (_dl_mips_gnu_objects)
{
@ -264,45 +264,52 @@ elf_machine_runtime_link_map (ElfW(Addr) gpreg, ElfW(Addr) stub_pc)
g1 = ((ElfW(Word) *) got)[1];
if ((g1 & ELF_MIPS_GNU_GOT1_MASK) != 0)
return (struct link_map *) (g1 & ~ELF_MIPS_GNU_GOT1_MASK);
{
struct link_map *l =
(struct link_map *) (g1 & ~ELF_MIPS_GNU_GOT1_MASK);
ElfW(Addr) base, limit;
const ElfW(Phdr) *p = l->l_phdr;
ElfW(Half) this, nent = l->l_phnum;
/* For the common case of a stub being called from the containing
object, STUB_PC will point to somewhere within the object that
is described by the link map fetched via got[1]. Otherwise we
have to scan all maps. */
for (this = 0; this < nent; this++)
{
if (p[this].p_type == PT_LOAD)
{
base = p[this].p_vaddr + l->l_addr;
limit = base + p[this].p_memsz;
if (stub_pc >= base && stub_pc < limit)
return l;
}
this++;
}
}
}
{
struct link_map *l = _dl_loaded;
struct link_map *ret = 0;
ElfW(Addr) candidate = 0;
while (l)
{
ElfW(Addr) base = 0;
ElfW(Addr) base, limit;
const ElfW(Phdr) *p = l->l_phdr;
ElfW(Half) this, nent = l->l_phnum;
/* Get the base. */
for (this = 0; this < nent; this++)
if (p[this].p_type == PT_LOAD)
{
base = p[this].p_vaddr + l->l_addr;
break;
}
if (! base)
{
l = l->l_next;
continue;
}
/* Find closest link base addr. */
if ((base < stub_pc) && (candidate < base))
{
candidate = base;
ret = l;
if (p[this].p_type == PT_LOAD)
{
base = p[this].p_vaddr + l->l_addr;
limit = base + p[this].p_memsz;
if (stub_pc >= base && stub_pc < limit)
return l;
}
}
l = l->l_next;
}
if (candidate && ret && (candidate < stub_pc))
return ret;
else if (!candidate)
return _dl_loaded;
}
_dl_signal_error (0, NULL, "cannot find runtime link map");