|
@@ -185,8 +185,14 @@ static void *laddr_pg(const struct dso *p, size_t v)
|
|
|
}
|
|
|
return (void *)(v - p->loadmap->segs[j].p_vaddr + p->loadmap->segs[j].addr);
|
|
|
}
|
|
|
-#define fpaddr(p, v) ((void (*)())&(struct funcdesc){ \
|
|
|
- laddr(p, v), (p)->got })
|
|
|
+static void (*fdbarrier(void *p))()
|
|
|
+{
|
|
|
+ void (*fd)();
|
|
|
+ __asm__("" : "=r"(fd) : "0"(p));
|
|
|
+ return fd;
|
|
|
+}
|
|
|
+#define fpaddr(p, v) fdbarrier((&(struct funcdesc){ \
|
|
|
+ laddr(p, v), (p)->got }))
|
|
|
#else
|
|
|
#define laddr(p, v) (void *)((p)->base + (v))
|
|
|
#define laddr_pg(p, v) laddr(p, v)
|