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

2017-06-21 Thread Mark Hatle
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  > 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  >
> > ---
> >  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;
> >   }
> >
> 
> 

-- 

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

2017-06-21 Thread Kyle Russell
Just wanted to follow-up on this so it doesn't get lost.  Any chance this
could be included in cross_prelink_staging?

On Thu, Aug 25, 2016 at 1:03 PM, Mark Hatle 
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 
> > ---
> >  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;
> >   }
> >
>
>
-- 
___
yocto mailing list
yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/yocto


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

2016-08-25 Thread Mark Hatle
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 
> ---
>  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;
>   }
> 

-- 
___
yocto mailing list
yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/yocto


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

2016-08-25 Thread Kyle Russell
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 
---
 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;
}
-- 
2.7.4

-- 
___
yocto mailing list
yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/yocto