DL_LOOKUP_ADDRESS must clear PLABEL32 bits, define DL_AUTO_FUNCTION_ADDRESS and
authorUlrich Drepper <drepper@redhat.com>
Thu, 18 Dec 2003 03:53:47 +0000 (03:53 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 18 Dec 2003 03:53:47 +0000 (03:53 +0000)
DL_STATIC_FUNCTION_ADDRESS, DL_DT_INIT_ADDRESS and DL_DT_FINI_ADDRESS use the
previous two macros.

sysdeps/hppa/dl-lookupcfg.h

index d76ea12..d393b3e 100644 (file)
 /* Forward declaration.  */
 struct link_map;
 
-void *_dl_symbol_address (const struct link_map *map, const ElfW(Sym) *ref);
+void *_dl_symbol_address (struct link_map *map, const ElfW(Sym) *ref);
 
 #define DL_SYMBOL_ADDRESS(map, ref) _dl_symbol_address(map, ref)
 
 Elf32_Addr _dl_lookup_address (const void *address);
 
-#define DL_LOOKUP_ADDRESS(addr) _dl_lookup_address (addr)
+/* Clear the bottom two bits so generic code can find the fdesc entry */
+#define DL_LOOKUP_ADDRESS(addr) \
+  (_dl_lookup_address ((void *)((unsigned long)addr & ~3)))
 
 void _dl_unmap (struct link_map *map);
 
 #define DL_UNMAP(map) _dl_unmap (map)
 
-extern Elf32_Addr _dl_function_address (const struct link_map *map,
-                                       Elf32_Addr start);
+#define DL_AUTO_FUNCTION_ADDRESS(map, addr)                            \
+({                                                                     \
+  unsigned int fptr[2];                                                        \
+  fptr[0] = (unsigned int) (addr);                                     \
+  fptr[1] = (map)->l_info[DT_PLTGOT]->d_un.d_ptr;                      \
+  /* Set bit 30 to indicate to $$dyncall that this is a PLABEL. */     \
+  (ElfW(Addr))((unsigned int)fptr | 2);                                        \
+})
+
+#define DL_STATIC_FUNCTION_ADDRESS(map, addr)                          \
+({                                                                     \
+  static unsigned int fptr[2];                                         \
+  fptr[0] = (unsigned int) (addr);                                     \
+  fptr[1] = (map)->l_info[DT_PLTGOT]->d_un.d_ptr;                      \
+  /* Set bit 30 to indicate to $$dyncall that this is a PLABEL. */     \
+  (ElfW(Addr))((unsigned int)fptr | 2);                                        \
+})
 
-#define DL_FUNCTION_ADDRESS(map, addr) _dl_function_address (map, addr)
 
 /* The test for "addr & 2" below is to accomodate old binaries which
    violated the ELF ABI by pointing DT_INIT and DT_FINI at a function
-   pointer.  */
+   descriptor.  */
 #define DL_DT_INIT_ADDRESS(map, addr) \
-  ((Elf32_Addr)(addr) & 2 ? (addr) : DL_FUNCTION_ADDRESS (map, addr))
+  ((Elf32_Addr)(addr) & 2 ? (addr) : DL_AUTO_FUNCTION_ADDRESS (map, addr))
 #define DL_DT_FINI_ADDRESS(map, addr) \
-  ((Elf32_Addr)(addr) & 2 ? (addr) : DL_FUNCTION_ADDRESS (map, addr))
+  ((Elf32_Addr)(addr) & 2 ? (addr) : DL_AUTO_FUNCTION_ADDRESS (map, addr))
+