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.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'ir/ir.c') diff --git a/ir/ir.c b/ir/ir.c index dbd6206..cd93992 100644 --- a/ir/ir.c +++ b/ir/ir.c @@ -94,7 +94,7 @@ addcon(const struct xcon *con) { uint h = hashb(0, con, sizeof *con); uint i = h, n = countof(conht); - assert(con->issym || con->isdat || con->cls); + assert((con->issym ^ con->isdat && !(con->isdat && con->isfunc)) || con->cls); for (;; ++i) { i &= countof(conht) - 1; if (!conht[i].issym && !conht[i].isdat && !conht[i].cls) { @@ -138,9 +138,9 @@ mkfltcon(enum irclass k, double f) } union ref -mksymref(const char *s) +mksymref(const char *s, bool isfunc) { - struct xcon con = { .issym = 1, .sym = s }; + struct xcon con = { .issym = 1, .sym = s, .isfunc = isfunc }; return mkref(RXCON, addcon(&con)); } -- cgit v1.2.3