Browse Source

fix debugger tracking of shared libraries on mips with PIE main program

mips has its own mechanisms for DT_DEBUG because it makes _DYNAMIC
read-only, and the original mechanism, DT_MIPS_RLD_MAP, was
PIE-incompatible. DT_MIPS_RLD_MAP_REL was added to remedy this, but we
never implemented support for it. add it now using the same idioms for
mips-specific ldso logic.
master
Rich Felker 4 years ago
parent
commit
f897461d4f
  1. 1
      arch/mips/reloc.h
  2. 1
      arch/mips64/reloc.h
  3. 1
      arch/mipsn32/reloc.h
  4. 4
      ldso/dynlink.c
  5. 4
      src/internal/dynlink.h

1
arch/mips/reloc.h

@ -29,6 +29,7 @@
#define NEED_MIPS_GOT_RELOCS 1
#define DT_DEBUG_INDIRECT DT_MIPS_RLD_MAP
#define DT_DEBUG_INDIRECT_REL DT_MIPS_RLD_MAP_REL
#define ARCH_SYM_REJECT_UND(s) (!((s)->st_other & STO_MIPS_PLT))
#define CRTJMP(pc,sp) __asm__ __volatile__( \

1
arch/mips64/reloc.h

@ -38,6 +38,7 @@
#define NEED_MIPS_GOT_RELOCS 1
#define DT_DEBUG_INDIRECT DT_MIPS_RLD_MAP
#define DT_DEBUG_INDIRECT_REL DT_MIPS_RLD_MAP_REL
#define ARCH_SYM_REJECT_UND(s) (!((s)->st_other & STO_MIPS_PLT))
#define CRTJMP(pc,sp) __asm__ __volatile__( \

1
arch/mipsn32/reloc.h

@ -29,6 +29,7 @@
#define NEED_MIPS_GOT_RELOCS 1
#define DT_DEBUG_INDIRECT DT_MIPS_RLD_MAP
#define DT_DEBUG_INDIRECT_REL DT_MIPS_RLD_MAP_REL
#define ARCH_SYM_REJECT_UND(s) (!((s)->st_other & STO_MIPS_PLT))
#define CRTJMP(pc,sp) __asm__ __volatile__( \

4
ldso/dynlink.c

@ -1992,6 +1992,10 @@ void __dls3(size_t *sp, size_t *auxv)
size_t *ptr = (size_t *) app.dynv[i+1];
*ptr = (size_t)&debug;
}
if (app.dynv[i]==DT_DEBUG_INDIRECT_REL) {
size_t *ptr = (size_t *)((size_t)&app.dynv[i] + app.dynv[i+1]);
*ptr = (size_t)&debug;
}
}
/* This must be done before final relocations, since it calls

4
src/internal/dynlink.h

@ -92,6 +92,10 @@ struct fdpic_dummy_loadmap {
#define DT_DEBUG_INDIRECT 0
#endif
#ifndef DT_DEBUG_INDIRECT_REL
#define DT_DEBUG_INDIRECT_REL 0
#endif
#define AUX_CNT 32
#define DYN_CNT 37

Loading…
Cancel
Save