2005-01-06 23:40:27 +01:00
|
|
|
#include <dlfcn.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
2005-01-07 12:36:07 +01:00
|
|
|
#include <bits/wordsize.h>
|
2005-01-06 23:40:27 +01:00
|
|
|
#include <gnu/lib-names.h>
|
|
|
|
|
|
|
|
|
|
|
|
unsigned int
|
|
|
|
la_version (unsigned int v)
|
|
|
|
{
|
|
|
|
setlinebuf (stdout);
|
|
|
|
|
|
|
|
printf ("version: %u\n", v);
|
|
|
|
|
|
|
|
char buf[20];
|
|
|
|
sprintf (buf, "%u", v);
|
|
|
|
|
|
|
|
return v;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
la_activity (uintptr_t *cookie, unsigned int flag)
|
|
|
|
{
|
|
|
|
if (flag == LA_ACT_CONSISTENT)
|
|
|
|
printf ("activity: consistent\n");
|
|
|
|
else if (flag == LA_ACT_ADD)
|
|
|
|
printf ("activity: add\n");
|
|
|
|
else if (flag == LA_ACT_DELETE)
|
|
|
|
printf ("activity: delete\n");
|
|
|
|
else
|
|
|
|
printf ("activity: unknown activity %u\n", flag);
|
|
|
|
}
|
|
|
|
|
|
|
|
char *
|
|
|
|
la_objsearch (const char *name, uintptr_t *cookie, unsigned int flag)
|
|
|
|
{
|
|
|
|
char buf[100];
|
|
|
|
const char *flagstr;
|
|
|
|
if (flag == LA_SER_ORIG)
|
|
|
|
flagstr = "LA_SET_ORIG";
|
|
|
|
else if (flag == LA_SER_LIBPATH)
|
|
|
|
flagstr = "LA_SER_LIBPATH";
|
|
|
|
else if (flag == LA_SER_RUNPATH)
|
|
|
|
flagstr = "LA_SER_RUNPATH";
|
|
|
|
else if (flag == LA_SER_CONFIG)
|
|
|
|
flagstr = "LA_SER_CONFIG";
|
|
|
|
else if (flag == LA_SER_DEFAULT)
|
|
|
|
flagstr = "LA_SER_DEFAULT";
|
|
|
|
else if (flag == LA_SER_SECURE)
|
|
|
|
flagstr = "LA_SER_SECURE";
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sprintf (buf, "unknown flag %d", flag);
|
|
|
|
flagstr = buf;
|
|
|
|
}
|
|
|
|
printf ("objsearch: %s, %s\n", name, flagstr);
|
|
|
|
|
|
|
|
return (char *) name;
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned int
|
|
|
|
la_objopen (struct link_map *l, Lmid_t lmid, uintptr_t *cookie)
|
|
|
|
{
|
|
|
|
printf ("objopen: %ld, %s\n", lmid, l->l_name);
|
|
|
|
|
|
|
|
return 3;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
la_preinit (uintptr_t *cookie)
|
|
|
|
{
|
|
|
|
printf ("preinit\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned int
|
|
|
|
la_objclose (uintptr_t *cookie)
|
|
|
|
{
|
|
|
|
printf ("objclose\n");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
uintptr_t
|
|
|
|
la_symbind32 (Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
|
|
|
|
uintptr_t *defcook, unsigned int *flags, const char *symname)
|
|
|
|
{
|
|
|
|
printf ("symbind32: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
|
|
|
|
symname, (long int) sym->st_value, ndx, *flags);
|
|
|
|
|
|
|
|
return sym->st_value;
|
|
|
|
}
|
|
|
|
|
|
|
|
uintptr_t
|
|
|
|
la_symbind64 (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
|
|
|
|
uintptr_t *defcook, unsigned int *flags, const char *symname)
|
|
|
|
{
|
|
|
|
printf ("symbind64: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
|
|
|
|
symname, (long int) sym->st_value, ndx, *flags);
|
|
|
|
|
|
|
|
return sym->st_value;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef __i386__
|
2005-01-16 07:24:59 +01:00
|
|
|
# define pltenter la_i86_gnu_pltenter
|
|
|
|
# define pltexit la_i86_gnu_pltexit
|
|
|
|
# define La_regs La_i86_regs
|
|
|
|
# define La_retval La_i86_retval
|
|
|
|
# define int_retval lrv_eax
|
2005-01-06 23:49:15 +01:00
|
|
|
#elif defined __x86_64__
|
2005-01-16 07:24:59 +01:00
|
|
|
# define pltenter la_x86_64_gnu_pltenter
|
|
|
|
# define pltexit la_x86_64_gnu_pltexit
|
|
|
|
# define La_regs La_x86_64_regs
|
|
|
|
# define La_retval La_x86_64_retval
|
|
|
|
# define int_retval lrv_rax
|
2005-01-08 00:14:21 +01:00
|
|
|
#elif defined __powerpc__ && __WORDSIZE == 32
|
2005-01-16 07:24:59 +01:00
|
|
|
# define pltenter la_ppc32_gnu_pltenter
|
|
|
|
# define pltexit la_ppc32_gnu_pltexit
|
|
|
|
# define La_regs La_ppc32_regs
|
|
|
|
# define La_retval La_ppc32_retval
|
|
|
|
# define int_retval lrv_r3
|
2005-01-07 12:36:07 +01:00
|
|
|
#elif defined __powerpc__ && __WORDSIZE == 64
|
2005-01-16 07:24:59 +01:00
|
|
|
# define pltenter la_ppc64_gnu_pltenter
|
|
|
|
# define pltexit la_ppc64_gnu_pltexit
|
|
|
|
# define La_regs La_ppc64_regs
|
|
|
|
# define La_retval La_ppc64_retval
|
|
|
|
# define int_retval lrv_r3
|
2005-01-12 04:12:43 +01:00
|
|
|
#elif defined __sh__
|
2005-01-16 07:24:59 +01:00
|
|
|
# define pltenter la_sh_gnu_pltenter
|
|
|
|
# define pltexit la_sh_gnu_pltexit
|
|
|
|
# define La_regs La_sh_regs
|
|
|
|
# define La_retval La_sh_retval
|
|
|
|
# define int_retval lrv_r0
|
|
|
|
#elif defined __mc68000__
|
|
|
|
# define pltenter la_m68k_gnu_pltenter
|
|
|
|
# define pltexit la_m68k_gnu_pltexit
|
|
|
|
# define La_regs La_m68k_regs
|
|
|
|
# define La_retval La_m68k_retval
|
|
|
|
# define int_retval lrv_d0
|
2005-01-23 09:02:45 +01:00
|
|
|
#elif defined __alpha__
|
|
|
|
# define pltenter la_alpha_gnu_pltenter
|
|
|
|
# define pltexit la_alpha_gnu_pltexit
|
|
|
|
# define La_regs La_alpha_regs
|
|
|
|
# define La_retval La_alpha_retval
|
|
|
|
# define int_retval lrv_r0
|
2005-01-29 01:07:16 +01:00
|
|
|
#elif defined __s390__ && __WORDSIZE == 32
|
|
|
|
# define pltenter la_s390_32_gnu_pltenter
|
|
|
|
# define pltexit la_s390_32_gnu_pltexit
|
|
|
|
# define La_regs La_s390_32_regs
|
|
|
|
# define La_retval La_s390_32_retval
|
|
|
|
# define int_retval lrv_r2
|
|
|
|
#elif defined __s390__ && __WORDSIZE == 64
|
|
|
|
# define pltenter la_s390_64_gnu_pltenter
|
|
|
|
# define pltexit la_s390_64_gnu_pltexit
|
|
|
|
# define La_regs La_s390_64_regs
|
|
|
|
# define La_retval La_s390_64_retval
|
|
|
|
# define int_retval lrv_r2
|
2005-01-29 05:14:35 +01:00
|
|
|
#elif defined __ia64__
|
|
|
|
# define pltenter la_ia64_gnu_pltenter
|
|
|
|
# define pltexit la_ia64_gnu_pltexit
|
|
|
|
# define La_regs La_ia64_regs
|
|
|
|
# define La_retval La_ia64_retval
|
|
|
|
# define int_retval lrv_r8
|
[BZ #783]
2005-03-28 Daniel Jacobowitz <dan@codesourcery.com>
[BZ #783]
* elf/tst-auditmod1.c: Add MIPS support.
* sysdeps/generic/ldsodefs.h (La_mips_32_regs): New.
(La_mips_32_retval): New.
(La_mips_64_regs): New.
(La_mips_64_retval): New.
(struct audit_ifaces): Add MIPS entries.
* sysdeps/mips/dl-machine.h: Check RESOLVE_MAP instead of RESOLVE.
(elf_machine_runtime_link_map, ELF_DL_FRAME_SIZE,
ELF_DL_SAVE_ARG_REGS, ELF_DL_RESTORE_ARG_REGS,
ELF_MACHINE_RUNTIME_TRAMPOLINE): Move to dl-trampoline.c.
(RTLD_START): Align the stack before calling _dl_init_internal.
Use .ent for _dl_start_user.
(ARCH_LA_PLTENTER, ARCH_LA_PLTEXIT): Define.
(elf_machine_rel, elf_machine_rel_relative, elf_machine_lazy_rel)
(elf_machine_runtime_setup): Use "auto inline".
(elf_machine_rela, elf_machine_rela_relative): Provide empty versions.
(elf_machine_got_rel): Likewise. Use RESOLVE_MAP.
* sysdeps/mips/dl-trampoline.c: New file.
* sysdeps/mips/bits/link.h: New file.
* sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
(internal_syscall5): Use register operands instead of non-lvalue
memory operands.
(internal_syscall6): Likewise.
(internal_syscall7): Likewise.
2005-03-28 Daniel Jacobowitz <dan@codesourcery.com>
[BZ #783]
* elf/tst-auditmod1.c: Add MIPS support.
* sysdeps/generic/ldsodefs.h (La_mips_32_regs): New.
(La_mips_32_retval): New.
(La_mips_64_regs): New.
(La_mips_64_retval): New.
(struct audit_ifaces): Add MIPS entries.
* sysdeps/mips/dl-machine.h: Check RESOLVE_MAP instead of RESOLVE.
(elf_machine_runtime_link_map, ELF_DL_FRAME_SIZE,
ELF_DL_SAVE_ARG_REGS, ELF_DL_RESTORE_ARG_REGS,
ELF_MACHINE_RUNTIME_TRAMPOLINE): Move to dl-trampoline.c.
(RTLD_START): Align the stack before calling _dl_init_internal.
Use .ent for _dl_start_user.
(ARCH_LA_PLTENTER, ARCH_LA_PLTEXIT): Define.
(elf_machine_rel, elf_machine_rel_relative, elf_machine_lazy_rel)
(elf_machine_runtime_setup): Use "auto inline".
(elf_machine_rela, elf_machine_rela_relative): Provide empty versions.
(elf_machine_got_rel): Likewise. Use RESOLVE_MAP.
* sysdeps/mips/dl-trampoline.c: New file.
* sysdeps/mips/bits/link.h: New file.
* sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
(internal_syscall5): Use register operands instead of non-lvalue
memory operands.
(internal_syscall6): Likewise.
(internal_syscall7): Likewise.
2005-03-28 09:49:19 +02:00
|
|
|
#elif defined __mips__ && _MIPS_SIM == _ABIO32
|
|
|
|
# define pltenter la_mips_o32_gnu_pltenter
|
|
|
|
# define pltexit la_mips_o32_gnu_pltexit
|
|
|
|
# define La_regs La_mips_32_regs
|
|
|
|
# define La_retval La_mips_32_retval
|
|
|
|
# define int_retval lrv_v0
|
|
|
|
#elif defined __mips__ && _MIPS_SIM == _ABIN32
|
|
|
|
# define pltenter la_mips_n32_gnu_pltenter
|
|
|
|
# define pltexit la_mips_n32_gnu_pltexit
|
|
|
|
# define La_regs La_mips_64_regs
|
|
|
|
# define La_retval La_mips_64_retval
|
|
|
|
# define int_retval lrv_v0
|
|
|
|
#elif defined __mips__ && _MIPS_SIM == _ABI64
|
|
|
|
# define pltenter la_mips_n64_gnu_pltenter
|
|
|
|
# define pltexit la_mips_n64_gnu_pltexit
|
|
|
|
# define La_regs La_mips_64_regs
|
|
|
|
# define La_retval La_mips_64_retval
|
|
|
|
# define int_retval lrv_v0
|
2005-04-05 23:37:05 +02:00
|
|
|
#elif defined __sparc__ && __WORDSIZE == 32
|
|
|
|
# define pltenter la_sparc32_gnu_pltenter
|
|
|
|
# define pltexit la_sparc32_gnu_pltexit
|
|
|
|
# define La_regs La_sparc32_regs
|
|
|
|
# define La_retval La_sparc32_retval
|
|
|
|
# define int_retval lrv_reg[0]
|
|
|
|
#elif defined __sparc__ && __WORDSIZE == 64
|
|
|
|
# define pltenter la_sparc64_gnu_pltenter
|
|
|
|
# define pltexit la_sparc64_gnu_pltexit
|
|
|
|
# define La_regs La_sparc64_regs
|
|
|
|
# define La_retval La_sparc64_retval
|
|
|
|
# define int_retval lrv_reg[0]
|
2005-10-05 20:57:11 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <tst-audit.h>
|
|
|
|
#if (!defined (pltenter) || !defined (pltexit) || !defined (La_regs) \
|
|
|
|
|| !defined (La_retval) || !defined (int_retval))
|
|
|
|
# error "architecture specific code needed in sysdeps/CPU/tls-audit.h or here"
|
2005-01-16 07:24:59 +01:00
|
|
|
#endif
|
2005-01-12 04:12:43 +01:00
|
|
|
|
|
|
|
|
2005-01-16 07:24:59 +01:00
|
|
|
ElfW(Addr)
|
|
|
|
pltenter (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
|
|
|
|
uintptr_t *defcook, La_regs *regs, unsigned int *flags,
|
|
|
|
const char *symname, long int *framesizep)
|
2005-01-12 04:12:43 +01:00
|
|
|
{
|
2005-01-16 07:24:59 +01:00
|
|
|
printf ("pltenter: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
|
2005-01-16 03:07:30 +01:00
|
|
|
symname, (long int) sym->st_value, ndx, *flags);
|
|
|
|
|
|
|
|
return sym->st_value;
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned int
|
2005-01-16 07:24:59 +01:00
|
|
|
pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
|
|
|
|
uintptr_t *defcook, const La_regs *inregs, La_retval *outregs,
|
|
|
|
const char *symname)
|
2005-01-16 03:07:30 +01:00
|
|
|
{
|
2005-01-16 07:24:59 +01:00
|
|
|
printf ("pltexit: symname=%s, st_value=%#lx, ndx=%u, retval=%tu\n",
|
|
|
|
symname, (long int) sym->st_value, ndx, outregs->int_retval);
|
2005-01-16 03:07:30 +01:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|