#endif /* PTRACE_EVENT_FORK */
-#if (defined __bfin__ || defined __frv__ || defined __sh__) \
+#if (defined __bfin__ || defined __frv__ || defined __sh__ || defined __arm__) \
&& !defined PTRACE_GETFDPIC
#define PTRACE_GETFDPIC 31
#define PTRACE_GETFDPIC_EXEC 0
# Input is taken from the "${target}" variable.
case "${target}" in
- arm*-*-linux*) srv_regobj="reg-arm.o arm-with-iwmmxt.o"
+ arm*-*-linux*|arm*-*-uclinuxfdpiceabi) srv_regobj="reg-arm.o arm-with-iwmmxt.o"
srv_regobj="${srv_regobj} arm-with-vfpv2.o"
srv_regobj="${srv_regobj} arm-with-vfpv3.o"
srv_regobj="${srv_regobj} arm-with-neon.o"
#endif
#ifdef __UCLIBC__
-#if !(defined(__UCLIBC_HAS_MMU__) || defined(__ARCH_HAS_MMU__))
+#if !(defined(__UCLIBC_HAS_MMU__) || defined(__ARCH_USE_MMU__))
/* PTRACE_TEXT_ADDR and friends. */
#include <asm/ptrace.h>
#define HAS_NOMMU
#endif
#endif
+/* ARM FDPIC support. */
+#if defined(__FDPIC__)
+/* This data structure represents a PT_LOAD segment. */
+struct elf32_fdpic_loadseg
+{
+ /* Core address at which the segment is mapped. */
+ Elf32_Addr addr;
+ /* VMA recorded in the program header. */
+ Elf32_Addr p_vaddr;
+ /* Size of this segment in memory. */
+ Elf32_Word p_memsz;
+};
+
+struct elf32_fdpic_loadmap
+{
+ /* Protocol version number, must be zero. */
+ Elf32_Half version;
+ /* Number of segments in this map. */
+ Elf32_Half nsegs;
+ /* The actual memory map. */
+ struct elf32_fdpic_loadseg segs[/*nsegs*/];
+};
+#endif
+
#ifndef HAVE_ELF32_AUXV_T
/* Copied from glibc's elf.h. */
typedef struct
*text_p = text;
*data_p = data - (text_end - text);
+ return 1;
+ }
+#elif defined(__FDPIC__)
+ long ret;
+ struct elf32_fdpic_loadmap *loadmap;
+ int pid = lwpid_of (get_thread_lwp (current_inferior));
+
+ ret = ptrace (PTRACE_GETFDPIC, pid, PTRACE_GETFDPIC_EXEC, &loadmap);
+ if (ret == 0)
+ {
+ *text_p = (CORE_ADDR) (loadmap->segs[0].addr - loadmap->segs[0].p_vaddr);
+ *data_p = (CORE_ADDR) (loadmap->segs[1].addr - loadmap->segs[1].p_vaddr);
+
return 1;
}
#endif