diff options
Diffstat (limited to 'output/outmac64.c')
-rw-r--r-- | output/outmac64.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/output/outmac64.c b/output/outmac64.c index f633db0..6dc0c44 100644 --- a/output/outmac64.c +++ b/output/outmac64.c @@ -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; } |