* 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> 2000-07-10 Andreas Jaeger <aj@suse.de>
* sysdeps/unix/sysv/linux/sigaction.c: Fix typo * 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 lib: $(objpfx)libmcheck.a
ifeq (yes,$(build-shared))
.PHONY: do-tst-mtrace .PHONY: do-tst-mtrace
tests: do-tst-mtrace tests: do-tst-mtrace
do-tst-mtrace: tst-mtrace.sh $(objpfx)tst-mtrace do-tst-mtrace: tst-mtrace.sh $(objpfx)tst-mtrace
$(SHELL) -e $< $(common-objpfx) $(SHELL) -e $< $(common-objpfx)
endif
# Uncomment this for test releases. For public releases it is too expensive. # Uncomment this for test releases. For public releases it is too expensive.
#CPPFLAGS-malloc.o += -DMALLOC_DEBUG #CPPFLAGS-malloc.o += -DMALLOC_DEBUG

View File

@ -60,6 +60,7 @@ test-srcs = tst-unbputc tst-printf
include ../Rules include ../Rules
ifeq (yes,$(build-shared))
.PHONY: do-tst-unbputc do-tst-printf .PHONY: do-tst-unbputc do-tst-printf
tests: 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 do-tst-printf: $(objpfx)tst-printf.out
$(objpfx)tst-printf.out: $(objpfx)tst-printf tst-printf.sh $(objpfx)tst-printf.out: $(objpfx)tst-printf tst-printf.sh
$(SHELL) -e tst-printf.sh $(common-objpfx) $(SHELL) -e tst-printf.sh $(common-objpfx)
endif
CFLAGS-vfprintf.c = -Wno-uninitialized CFLAGS-vfprintf.c = -Wno-uninitialized
CFLAGS-tst-printf.c = -Wno-format 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; extern int _dl_mips_gnu_objects;
/* got[1] is reserved to keep its link map address for the shared /* 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 object generated by the gnu linker. If all are such objects, we
find link map from current GPREG simply. If not so, get link map can find the link map from current GPREG simply. If not so, get
for callers object containing STUB_PC. */ the link map for caller's object containing STUB_PC. */
if (_dl_mips_gnu_objects) 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]; g1 = ((ElfW(Word) *) got)[1];
if ((g1 & ELF_MIPS_GNU_GOT1_MASK) != 0) 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 *l = _dl_loaded;
struct link_map *ret = 0;
ElfW(Addr) candidate = 0;
while (l) while (l)
{ {
ElfW(Addr) base = 0; ElfW(Addr) base, limit;
const ElfW(Phdr) *p = l->l_phdr; const ElfW(Phdr) *p = l->l_phdr;
ElfW(Half) this, nent = l->l_phnum; ElfW(Half) this, nent = l->l_phnum;
/* Get the base. */ for (this = 0; this < nent; ++this)
for (this = 0; this < nent; this++) {
if (p[this].p_type == PT_LOAD) if (p[this].p_type == PT_LOAD)
{ {
base = p[this].p_vaddr + l->l_addr; base = p[this].p_vaddr + l->l_addr;
break; limit = base + p[this].p_memsz;
if (stub_pc >= base && stub_pc < limit)
return l;
} }
if (! base)
{
l = l->l_next;
continue;
}
/* Find closest link base addr. */
if ((base < stub_pc) && (candidate < base))
{
candidate = base;
ret = l;
} }
l = l->l_next; 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"); _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 Other architectures call fixup from dl-runtime.c in
_dl_runtime_resolve. MIPS instead calls __dl_runtime_resolve. We _dl_runtime_resolve. MIPS instead calls __dl_runtime_resolve. We
have to use our own version because of the way the got section is 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 \ #define ELF_MACHINE_RUNTIME_TRAMPOLINE \
/* The flag _dl_mips_gnu_objects is set if all dynamic objects are \ /* 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; extern int _dl_mips_gnu_objects;
/* got[1] is reserved to keep its link map address for the shared /* 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 object generated by the gnu linker. If all are such objects, we
find link map from current GPREG simply. If not so, get link map can find the link map from current GPREG simply. If not so, get
for callers object containing STUB_PC. */ the link map for caller's object containing STUB_PC. */
if (_dl_mips_gnu_objects) 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]; g1 = ((ElfW(Word) *) got)[1];
if ((g1 & ELF_MIPS_GNU_GOT1_MASK) != 0) 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 *l = _dl_loaded;
struct link_map *ret = 0;
ElfW(Addr) candidate = 0;
while (l) while (l)
{ {
ElfW(Addr) base = 0; ElfW(Addr) base, limit;
const ElfW(Phdr) *p = l->l_phdr; const ElfW(Phdr) *p = l->l_phdr;
ElfW(Half) this, nent = l->l_phnum; ElfW(Half) this, nent = l->l_phnum;
/* Get the base. */
for (this = 0; this < nent; this++) for (this = 0; this < nent; this++)
{
if (p[this].p_type == PT_LOAD) if (p[this].p_type == PT_LOAD)
{ {
base = p[this].p_vaddr + l->l_addr; base = p[this].p_vaddr + l->l_addr;
break; limit = base + p[this].p_memsz;
if (stub_pc >= base && stub_pc < limit)
return l;
} }
if (! base)
{
l = l->l_next;
continue;
}
/* Find closest link base addr. */
if ((base < stub_pc) && (candidate < base))
{
candidate = base;
ret = l;
} }
l = l->l_next; 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"); _dl_signal_error (0, NULL, "cannot find runtime link map");