BR3282788: Fix 64-bit Mach-O bug that crashes NASM due to NULL symbols
authorKeith Kanios <keith@kanios.net>
Tue, 12 Apr 2011 02:38:50 +0000 (11 21:38 -0500)
committerKeith Kanios <keith@kanios.net>
Tue, 12 Apr 2011 02:38:50 +0000 (11 21:38 -0500)
output/outmac64.c

index f633db0..6dc0c44 100644 (file)
@@ -299,16 +299,34 @@ static uint8_t get_section_fileindex_by_index(const int32_t index)
 
 static struct symbol *get_closest_section_symbol_by_offset(uint8_t fileindex, int64_t offset)
 {
-       struct symbol *sym;
+    struct symbol *sym;
+    struct symbol *nearest = NULL;
+    int64_t sval, nval, sdiff, ndiff;
 
-       for (sym = syms; sym != NULL; sym = sym->next) {
-               if ((sym->sect != NO_SECT) &&
-                       (sym->sect == fileindex) &&
-                       ((int64_t)sym->value >= offset))
-                               return sym;
-       }
+    for (sym = syms; sym != NULL; sym = sym->next) {
+        if ((sym->sect != NO_SECT) && (sym->sect == fileindex)){
+            if(nearest == NULL){
+                nearest = sym;
+            }else{
+                sval = (int64_t)sym->value;
+                nval = (int64_t)nearest->value;
+
+                sdiff = ((sval >= offset) ? (sval - offset) : (offset - sval));
+                ndiff = ((nval >= offset) ? (nval - offset) : (offset - nval));
+
+                if(sdiff <= ndiff){
+                    nearest = sym;
+                }
+
+                /* Symbols should be in order, so this optimization should be OK */
+                if((int64_t)nearest->value >= offset){
+                   break;
+                }
+            }
+        }
+    }
 
-       return NULL;
+    return nearest;
 }