On Wed, Jul 10, 2024 at 12:49 PM Ian Lance Taylor <i...@google.com> wrote:
> On Sun, May 26, 2024 at 11:51 PM Max Filippov <jcmvb...@gmail.com> wrote:
> > diff --git a/libbacktrace/internal.h b/libbacktrace/internal.h
> > index 4fa0af8cb6c9..456911166026 100644
> > --- a/libbacktrace/internal.h
> > +++ b/libbacktrace/internal.h
> > @@ -323,10 +323,22 @@ struct dwarf_sections
> >
> >  struct dwarf_data;
> >
> > +#if defined (HAVE_DL_ITERATE_PHDR) && defined (__FDPIC__)
> > +typedef struct elf32_fdpic_loadaddr base_address_type;
> > +#define __RELOC_UINTPTR(ptr, base) ((uintptr_t)__RELOC_POINTER (ptr, base))
> > +#define no_base_address ((struct elf32_fdpic_loadaddr){0})
> > +#else
> > +typedef uintptr_t base_address_type;
> > +#define __RELOC_POINTER(ptr, base) ((ptr) + (base))
> > +#define __RELOC_UINTPTR(ptr, base) ((uintptr_t)__RELOC_POINTER (ptr, base))
> > +#define no_base_address ((uintptr_t)0)
> > +#endif
> > +
> > +
>
> When I look at the uClibc sources, I don't understand how this works.
> This sets no_base_address to have a zero map field.  But
> __RELOC_POINTER will crash when given a zero map field.

That's right. But __RELOC_POINTER should never be called for base
address set to no_base_address, that's what the following hunk ensures:

--->8---
@@ -6636,9 +6636,15 @@ elf_add (struct backtrace_state *state, const
char *filename, int descriptor,

  /* If the executable is ET_DYN, it is either a PIE, or we are running
     directly a shared library with .interp.  We need to wait for
-     dl_iterate_phdr in that case to determine the actual base_address.  */
+     dl_iterate_phdr in that case to determine the actual base_address.
+     In case of FDPIC we always need the actual base_address.  */
+#ifndef __FDPIC__
  if (exe && ehdr.e_type == ET_DYN)
    return -1;
+#else
+  if (exe)
+    return -1;
+#endif

  shoff = ehdr.e_shoff;
  shnum = ehdr.e_shnum;

--->8---
>  At least that is what it looks like in 
> uClibc/libc/sysdeps/linux/bfin/bits/elf-fdpic.h.
>  What target and what library are you using?

I'm using xtensa-linux-uclibcfdpic (gcc part is still WIP, most recent
version is available in https://github.com/jcmvbkbc/gcc-xtensa
tagged xtensa-fdpic-abi-spec-1.4) with uClibc-ng

-- 
Thanks.
-- Max

Reply via email to