[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 4/4] create-diff-object: also include relas that point to changed sections
On Thu, Nov 7, 2024 at 3:15 PM Roger Pau Monne <roger.pau@xxxxxxxxxx> wrote: > > create-diff-object has a special handling for some specific sections, like > .altinstructions or .livepatch.hooks.*. The contents of those sections are in > the form of array elements, where each element can be processed independently > of the rest. For example an element in .altinstructions is a set of > replacement coordinates, with the layout specified by the alt_instr struct. > In > the case of .livepatch.hooks.* each element is a pointer to a hook function to > call. > > The contents of this array is processed element wise, so that > create-diff-object can decide whether the element relates to the content in > the > livepatch and thus needs keeping. Such relation is driven based on the > contents of the relocations for the special sections. If a relocation to be > applied to a special section element depends on any symbol to be included in > the livepatch then the special element is also considered required and thus > added to the livepatch contents. > > However relocations don't always reference function type symbols, they can > also > reference sections type symbols, and that's usually the case with hook symbols > that have relocations based on section symbols, as an example: > > RELOCATION RECORDS FOR [.livepatch.hooks.load]: > OFFSET TYPE VALUE > 0000000000000000 R_X86_64_64 .text.foobar > > Symbol information for .text.foobar: > > 0000000000000000 l d .text.foobar 0000000000000000 .text.foobar > > As seen above, the .livepatch.hooks.load relocation uses a non-function > symbol, > which given the current code in should_keep_rela_group() would mean it's not > considered for inclusion in the livepatch. > > Fix this by allowing should_keep_rela_group() to also keep relocations if they > either point to function or section symbols. > > Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> > --- > create-diff-object.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/create-diff-object.c b/create-diff-object.c > index 924059a1842b..c21cc576052a 100644 > --- a/create-diff-object.c > +++ b/create-diff-object.c > @@ -1158,11 +1158,17 @@ static int should_keep_rela_group(struct section > *sec, int start, int size) > struct rela *rela; > int found = 0; > > - /* check if any relas in the group reference any changed functions */ > + /* > + * Check if any relas in the group reference any changed functions or > + * sections. As seen by hook related relocations > (.livepatch.hooks.*), > + * it's possible they use the section symbol as a reference rather > than > + * the function symbol. > + */ > list_for_each_entry(rela, &sec->relas, list) { > if (rela->offset >= start && > rela->offset < start + size && > - rela->sym->type == STT_FUNC && > + (rela->sym->type == STT_FUNC || > + rela->sym->type == STT_SECTION) && > rela->sym->sec->include) { > found = 1; > log_debug("new/changed symbol %s found in special > section %s\n", > -- > 2.46.0 > Reviewed-by: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx> Thanks
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |