[nasm:master] output/elf: Don't set data symbol type/size in ABS sections

nasm-bot for Fabian Giesen fabian.giesen at epicgames.com
Mon Nov 7 17:12:27 PST 2022


Commit-ID:  04f981e0e698161a27054795b837ff077eb666c8
Gitweb:     http://repo.or.cz/w/nasm.git?a=commitdiff;h=04f981e0e698161a27054795b837ff077eb666c8
Author:     Fabian Giesen <fabian.giesen at epicgames.com>
AuthorDate: Tue, 30 Aug 2022 14:20:09 -0700
Committer:  Fabian Giesen <fabian.giesen at epicgames.com>
CommitDate: Tue, 30 Aug 2022 14:26:54 -0700

output/elf: Don't set data symbol type/size in ABS sections

I'm dealing with a FreeBSD-derived embedded target that ends up
showing such symbols (which is mainly NASM struct definitions)
in backtraces after calling NULL function pointers, since these
symbols _are_ technically covering bytes around address zero.

Needless to say, this is extremely confusing and generates
nonsensical bug reports. (Essentially, random unrelated crashes
get cross-referenced to a random ASM struct, whatever the linker
picked for address 0).

These symbols are already a bit strange to begin with (they're
purely an artifact of how NASM happens to implement structs),
leaving their sizes at 0 seems reasonable.

Signed-off-by: Fabian Giesen <fabian.giesen at epicgames.com>


---
 output/outelf.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/output/outelf.c b/output/outelf.c
index f47728ed..34fb4ce5 100644
--- a/output/outelf.c
+++ b/output/outelf.c
@@ -2696,7 +2696,11 @@ static void debug_typevalue(int32_t type)
             stype = STT_NOTYPE;
             break;
     }
-    if (stype == STT_OBJECT && lastsym && !lastsym->type) {
+    /* Set type and size info on most recently seen symbol if we haven't set it already.
+       But avoid setting size info on object (data) symbols in absolute sections (which
+       is primarily structs); some environments get confused with non-zero-extent absolute
+       object symbols and end up showing them in backtraces for NULL fn pointer calls. */
+    if (stype == STT_OBJECT && lastsym && !lastsym->type && lastsym->section != XSHN_ABS) {
         lastsym->size = ssize;
         lastsym->type = stype;
     }


More information about the Nasm-commits mailing list