summaryrefslogtreecommitdiff
path: root/output/outmac64.c
diff options
context:
space:
mode:
Diffstat (limited to 'output/outmac64.c')
-rw-r--r--output/outmac64.c34
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;
}