The libbacktrace symbol table code was incorrectly discarding global
Mach-O symbols.  This patch fixes the problem.  Tested on macOS on the
compile farm, and also on x86_64-pc-linux-gnu.  Committed to mainline.

Ian

            For PR libbacktrace/97082
            * macho.c (MACH_O_N_EXT): Don't define.
            (MACH_O_N_UNDF): Define.
            (macho_defined_symbol): Don't discard N_EXT symbols.  Do
            discard N_UNDF symbols.
af827b2ab90b9d726c7182c41fa2409005909db8
diff --git a/libbacktrace/macho.c b/libbacktrace/macho.c
index 5ceff05b29a..8f768f14a57 100644
--- a/libbacktrace/macho.c
+++ b/libbacktrace/macho.c
@@ -271,12 +271,14 @@ struct macho_nlist_64
 
 /* Value found in nlist n_type field.  */
 
-#define MACH_O_N_EXT   0x01    /* Extern symbol */
+#define MACH_O_N_STAB  0xe0    /* Stabs debugging symbol */
+#define MACH_O_N_TYPE  0x0e    /* Mask for type bits */
+
+/* Values found after masking with MACH_O_N_TYPE.  */
+#define MACH_O_N_UNDF  0x00    /* Undefined symbol */
 #define MACH_O_N_ABS   0x02    /* Absolute symbol */
-#define MACH_O_N_SECT  0x0e    /* Defined in section */
+#define MACH_O_N_SECT  0x0e    /* Defined in section from n_sect field */
 
-#define MACH_O_N_TYPE  0x0e    /* Mask for type bits */
-#define MACH_O_N_STAB  0xe0    /* Stabs debugging symbol */
 
 /* Information we keep for a Mach-O symbol.  */
 
@@ -492,10 +494,10 @@ macho_defined_symbol (uint8_t type)
 {
   if ((type & MACH_O_N_STAB) != 0)
     return 0;
-  if ((type & MACH_O_N_EXT) != 0)
-    return 0;
   switch (type & MACH_O_N_TYPE)
     {
+    case MACH_O_N_UNDF:
+      return 0;
     case MACH_O_N_ABS:
       return 1;
     case MACH_O_N_SECT:

Reply via email to