[yocto] [prelink-cross][PATCH] rtld: Add missing DT_NEEDED DSOs to needed_list

Mark Hatle mark.hatle at windriver.com
Wed Jun 21 19:10:07 PDT 2017


On 6/21/17 8:51 PM, Kyle Russell wrote:
> Just wanted to follow-up on this so it doesn't get lost.  Any chance this could
> be included in cross_prelink_staging?

I just finished the sanity checking on it.  It should be in staging in a few
minutes.

(There are a couple of x32 patches as well, however I'm currently not able to
test those.  Something is wrong when the master x32 that there are missing
headers -- and even when that is resolved the testsuite doesn't appear to
properly find the ld.so and such.)

--Mark

> On Thu, Aug 25, 2016 at 1:03 PM, Mark Hatle <mark.hatle at windriver.com
> <mailto:mark.hatle at windriver.com>> wrote:
> 
>     Thanks!  I'll try to get this included soon.
> 
>     --Mark
> 
>     On 8/25/16 10:39 AM, Kyle Russell wrote:
>     > prelink-rtld may report an "error while loading shared libraries" for
>     > the wrong library.
>     >
>     > If some set of DT_NEEDED DSOs are not in the default search path, they
>     > may have a dso_list entry added, but no matching entry is added to the
>     > needed_list.  This causes the linker to miscalculate the max number of
>     > dsos during build_local_scope(), which later causes find_needed() to not
>     > search the entire l_local_scope[0]->r_list during
>     > _dl_check_map_versions() (since the max from build_local_scope() becomes
>     > l_local_scope[0]->r_nlist).
>     >
>     > Since find_needed() searches through the r_list, which would have the
>     > dso_list entries for the libraries that weren't found earlier, this cuts
>     > the search short, meaning libraries near the end of the local scope don't
>     > get included in the map version search.
>     >
>     > As the comment in _dl_check_map_versions() suggests, if needed is NULL,
>     > that means a dependency was not found and no stub entry created, which
>     > should never happen.
>     >
>     > Signed-off-by: Kyle Russell <bkylerussell at gmail.com
>     <mailto:bkylerussell at gmail.com>>
>     > ---
>     >  src/rtld/rtld.c | 36 ++++++++++++++++++++++--------------
>     >  1 file changed, 22 insertions(+), 14 deletions(-)
>     >
>     > diff --git a/src/rtld/rtld.c b/src/rtld/rtld.c
>     > index 8d7d760..d9a0862 100644
>     > --- a/src/rtld/rtld.c
>     > +++ b/src/rtld/rtld.c
>     > @@ -686,6 +686,25 @@ find_lib_by_soname (const char *soname, struct
>     dso_list *loader,
>     >    return NULL;
>     >  }
>     >
>     > +static void
>     > +add_dso_to_needed (struct dso_list *cur_dso_ent, struct dso_list
>     *new_dso_ent)
>     > +{
>     > +  if (!cur_dso_ent->needed)
>     > +    {
>     > +      cur_dso_ent->needed = malloc (sizeof (struct needed_list));
>     > +      cur_dso_ent->needed_tail = cur_dso_ent->needed;
>     > +      cur_dso_ent->needed_tail->ent = new_dso_ent;
>     > +      cur_dso_ent->needed_tail->next = NULL;
>     > +    }
>     > +  else if (!in_needed_list (cur_dso_ent->needed, new_dso_ent->name))
>     > +    {
>     > +      cur_dso_ent->needed_tail->next = malloc (sizeof (struct needed_list));
>     > +      cur_dso_ent->needed_tail = cur_dso_ent->needed_tail->next;
>     > +      cur_dso_ent->needed_tail->ent = new_dso_ent;
>     > +      cur_dso_ent->needed_tail->next = NULL;
>     > +    }
>     > +}
>     > +
>     >  static struct dso_list *
>     >  load_dsos (DSO *dso, int host_paths)
>     >  {
>     > @@ -812,6 +831,8 @@ load_dsos (DSO *dso, int host_paths)
>     >                         dso_list_tail->canon_filename = strdup(soname);
>     >                         dso_list_tail->err_no = errno;
>     >
>     > +                          add_dso_to_needed(cur_dso_ent, new_dso_ent);
>     > +
>     >                         continue;
>     >                       }
>     >
>     > @@ -854,20 +875,7 @@ load_dsos (DSO *dso, int host_paths)
>     >                       dso_list_tail->name = new_dso->soname;
>     >                   }
>     >
>     > -               if (!cur_dso_ent->needed)
>     > -                 {
>     > -                   cur_dso_ent->needed = malloc (sizeof (struct
>     needed_list));
>     > -                   cur_dso_ent->needed_tail = cur_dso_ent->needed;
>     > -                   cur_dso_ent->needed_tail->ent = new_dso_ent;
>     > -                   cur_dso_ent->needed_tail->next = NULL;
>     > -                 }
>     > -               else if (!in_needed_list (cur_dso_ent->needed, soname))
>     > -                 {
>     > -                   cur_dso_ent->needed_tail->next = malloc (sizeof
>     (struct needed_list));
>     > -                   cur_dso_ent->needed_tail = cur_dso_ent->needed_tail->next;
>     > -                   cur_dso_ent->needed_tail->ent = new_dso_ent;
>     > -                   cur_dso_ent->needed_tail->next = NULL;
>     > -                 }
>     > +                  add_dso_to_needed(cur_dso_ent, new_dso_ent);
>     >
>     >                 continue;
>     >               }
>     >
> 
> 




More information about the yocto mailing list