summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Kanios <keith@kanios.net>2011-04-11 21:38:50 -0500
committerCyrill Gorcunov <gorcunov@gmail.com>2011-07-04 00:38:33 +0400
commit52afa0c5d4eb78169dffd1cd8fe5f743a6b80031 (patch)
treed1d675a81d2d1973a0c300b652fea7ce12efae62
parent56dd9fd83d2191b92d7606df3dbbb1ee948a869f (diff)
downloadnasm-52afa0c5d4eb78169dffd1cd8fe5f743a6b80031.tar.gz
BR3282788: Fix 64-bit Mach-O bug that crashes NASM due to NULL symbols
-rw-r--r--output/outmac64.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/output/outmac64.c b/output/outmac64.c
index f633db03..6dc0c44a 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;
}