BR3392231: Fix get_closest_section_symbol_by_offset
authorCyrill Gorcunov <gorcunov@gmail.com>
Mon, 5 Nov 2012 20:47:20 +0000 (6 00:47 +0400)
committerCyrill Gorcunov <gorcunov@gmail.com>
Mon, 5 Nov 2012 20:47:20 +0000 (6 00:47 +0400)
This patch changes get_closest_section_symbol_by_offset
logic to lookup only the closest symbols which are at
or before the supplied offset.

Signed-off-by: Keith Kanios <keith@kanios.net>
Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
output/outmac64.c

index 6dc0c44..b26ff24 100644 (file)
@@ -299,37 +299,20 @@ 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 *nearest = NULL;
-    int64_t sval, nval, sdiff, ndiff;
-
-    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;
-                }
+    struct symbol *sym;
 
-                /* Symbols should be in order, so this optimization should be OK */
-                if((int64_t)nearest->value >= offset){
-                   break;
-                }
-            }
+    for (sym = syms; sym; sym = sym->next) {
+        if ((sym->sect != NO_SECT) && (sym->sect == fileindex)) {
+            if ((int64_t)sym->value > offset)
+                break;
+            nearest = sym;
         }
     }
 
     return nearest;
 }
 
-
 /*
  * Special section numbers which are used to define Mach-O special
  * symbols, which can be used with WRT to provide PIC relocation