Re: [PATCH 17/48] objtool: Fix reloc hash collision in find_reloc_by_dest_range()
From: Song Liu
Date: Fri Apr 24 2026 - 17:48:16 EST
On Thu, Apr 23, 2026 at 9:34 AM Josh Poimboeuf <jpoimboe@xxxxxxxxxx> wrote:
>
> On Thu, Apr 23, 2026 at 10:32:31AM +0200, Peter Zijlstra wrote:
> > On Wed, Apr 22, 2026 at 09:03:45PM -0700, Josh Poimboeuf wrote:
> > > In find_reloc_by_dest_range(), hash collisions can cause a high-offset
> > > relocation to appear when probing a low-offset hash bucket.
> > >
> > > Only return early when the best match found so far genuinely belongs to
> > > the current bucket (its offset is within the bucket's stride range).
> > > Otherwise, continue scanning later buckets which may contain
> > > lower-offset matches.
> >
> > Maybe mention (and or add a comment to the function) that in case of
> > multiple matches in the given range, it will return the lowest address
> > one.
> >
> > Acked-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
>
> diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c
> index c4cb371e72b2..af2841b8e095 100644
> --- a/tools/objtool/elf.c
> +++ b/tools/objtool/elf.c
> @@ -347,8 +347,9 @@ void iterate_sym_by_name(const struct elf *elf, const char *name,
> }
> }
>
> +/* If there are multiple matches, return the first one in the range */
> struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct section *sec,
> - unsigned long offset, unsigned int len)
> + unsigned long offset, unsigned int len)
> {
> struct reloc *reloc, *r = NULL;
> struct section *rsec;
Acked-by: Song Liu <song@xxxxxxxxxx>