From 854df54e1839c8b96d1aaa9aeaa32c2ebbf535f8 Mon Sep 17 00:00:00 2001 From: lemon Date: Sat, 13 Dec 2025 14:21:22 +0100 Subject: fix position independent loads of function symbols. For `extern int x[1];`, can use PCREL32 for &x. But for `extern int x(int)`, must use GOTREL, when not being called directly (that's PLT). Therefore the type of an external symbol (actually just whether it denotes a function) matters when deciding what kind of relocation to emit, so keep that information. --- ir/ir.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ir/ir.h') diff --git a/ir/ir.h b/ir/ir.h index e16cdda..1a1d907 100644 --- a/ir/ir.h +++ b/ir/ir.h @@ -26,7 +26,7 @@ struct irdat { }; struct xcon { - bool issym, isdat, deref; + bool issym, isdat, isfunc, deref; uchar cls; union { const char *sym; @@ -250,7 +250,7 @@ union ref mkfltcon(enum irclass, double); #define isaddrcon(r,derefok) ((r).t == RXCON && !conht[(r).i].cls && (derefok || !conht[(r).i].deref)) #define intconval(r) ((r).t == RICON ? (r).i : conht[(r).i].i) #define fltconval(r) ((r).t == RICON ? (r).i : conht[(r).i].f) -union ref mksymref(const char *); +union ref mksymref(const char *, bool isfunc); union ref mkdatref(const char *name, union type ctype, uint siz, uint align, const void *, uint n, bool deref); const char *xcon2sym(int ref); struct instr mkalloca(uint siz, uint align); -- cgit v1.2.3