Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 43c74d17 authored by Sam Ravnborg's avatar Sam Ravnborg
Browse files

kbuild: in the section mismatch check try harder to find symbols



When searching for symbols the only check performed was if
offset equals st_value. Adding an additional check to see if st_name
points t a valid name made us sort out a few more false positives and
let us report more correct names in warnings.

Signed-off-by: default avatarSam Ravnborg <sam@ravnborg.org>
parent e835a39c
Loading
Loading
Loading
Loading
+16 −1
Original line number Original line Diff line number Diff line
@@ -558,7 +558,10 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf_Addr addr,
}
}


/*
/*
 * Find symbols before or equal addr and after addr - in the section sec
 * Find symbols before or equal addr and after addr - in the section sec.
 * If we find two symbols with equal offset prefer one with a valid name.
 * The ELF format may have a better way to detect what type of symbol
 * it is, but this works for now.
 **/
 **/
static void find_symbols_between(struct elf_info *elf, Elf_Addr addr,
static void find_symbols_between(struct elf_info *elf, Elf_Addr addr,
				 const char *sec,
				 const char *sec,
@@ -587,6 +590,12 @@ static void find_symbols_between(struct elf_info *elf, Elf_Addr addr,
				beforediff = addr - sym->st_value;
				beforediff = addr - sym->st_value;
				*before = sym;
				*before = sym;
			}
			}
			else if ((addr - sym->st_value) == beforediff) {
				/* equal offset, valid name? */
				const char *name = elf->strtab + sym->st_name;
				if (name && strlen(name))
					*before = sym;
			}
		}
		}
		else
		else
		{
		{
@@ -594,6 +603,12 @@ static void find_symbols_between(struct elf_info *elf, Elf_Addr addr,
				afterdiff = sym->st_value - addr;
				afterdiff = sym->st_value - addr;
				*after = sym;
				*after = sym;
			}
			}
			else if ((sym->st_value - addr) == afterdiff) {
				/* equal offset, valid name? */
				const char *name = elf->strtab + sym->st_name;
				if (name && strlen(name))
					*after = sym;
			}
		}
		}
	}
	}
}
}